Nginx | stream 四层反向代理:PREACCESS、ACCESS 阶段并发与访问限制模块浅析与实践

📅 发布时间:2026/7/11 2:43:29 👁️ 浏览次数:
Nginx | stream 四层反向代理:PREACCESS、ACCESS 阶段并发与访问限制模块浅析与实践
[ 知识是人生的灯塔只有不断学习才能照亮前行的道路 ] 大家好我是 WeiyiGeek一名深耕安全运维开发SecOpsDev领域的技术从业者致力于探索DevOps与安全的融合DevSecOps自动化运维工具开发与实践企业网络安全防护欢迎各位道友一起学习交流、一起进步 若此文对你有帮助一定记得点个关注⭐与小红星❤️或加入到作者知识星球『 全栈工程师修炼指南』转发收藏学习不迷路 。PREACCESS阶段◆ limit_conn 模块描述上文《Nginx | stream 四层反向代理LOG、POST_ACCEPT阶段模块指令浅析与实践》作者讲解实践了在四层代理场景下使用 proxy protocol 协议获取客户端真实IP不过前提是开发的客户端应用需要支持发送 proxy protocol 协议数据包然后通过 readip 模块处理后获取到真实 IP 地址先在我们拿到真实 IP 之后就可以在 PREACCESS 阶段使用 limit_conn 模块用于限制并发连接数。温馨提示若文章代码块中存在乱码或不能复制请联系作者也可通过文末的阅读原文链接加入知识星球中阅读原文链接https://articles.zsxq.com/id_wtv12vsjglt0.htmlnginx_stream_limit_conn_module 模块用于限制每个客户端的并发连接数利用变量自定义限制依据使用共享内存在所有 worker 进程中同步连接状态它已经默认编译进 Nginx可通过--without-stream_limit_conn_module编译选项禁用该指令设计与 http 模块类似需要先定义共享内存区域然后使用 limit_conn 指令指定共享区域以及基于什么特征进行限制的连接数指令使用示例stream { limit_conn_zone $binary_remote_addr zoneaddr:10m; ... server { ... limit_conn addr 1; limit_conn_log_level error; } }温馨提示对于stream模块仅存在limit_conn而无limit_req概念因其面向TCP连接而非HTTP请求。指令参数•limit_conn_zone指令用于定义共享内存区域及大小以便在多个 worker 之间同步连接状态例如存放客户端连接数。Syntax: limit_conn_zone key zonename:size; Default: — Context: stream # IPV4 为四字节32位IPV6 为十六字节64位1m 大约存储3.2W个IPV4地址,1.6W IPV6 地址, 如果区域存储已耗尽服务器将关闭连接。 limit_conn_zone $binary_remote_addr zoneaddr:10m;•limit_conn指令用于为给定键值设置共享内存区域和允许的最大连接数例如基于客户端IP地址的限制。Syntax: limit_conn zone number; Default: — Context: stream, server•limit_conn_dry_run指令用于在限制连接时模拟执行但不实际断开连接主要用于调试和测试。Syntax: limit_conn_dry_run on | off; Default: limit_conn_dry_run off; Context: stream, server•limit_conn_log_level指令用于设置日志级别当连接被限制时记录的日志等级。Syntax: limit_conn_log_level info | notice | warn | error; Default: limit_conn_log_level error; Context: stream, server另外该模块1.17.6还内置了一个变量$limit_conn_status用于指示连接是否被限制其值可以是PASSED,REJECTED, 或REJECTED_DRY_RUN。好了这里便简单介绍这里由于模块使用比较简单所以作者将在后续 ACCESS 阶段中再实践使用 limit_conn 模块限制客户端并发连接数。ACCESS阶段◆ access 模块描述ngx_stream_access_module 模块(1.9.2)提供了 access 控制指令用于在 ACCESS 阶段中根据客户端IP地址控制连接的允许或拒绝它默认编译进 Nginx可通过--without-stream_access_module编译选项禁用。指令参数•allow指令用于允许特定IP地址或子网访问。Syntax: allow address | CIDR | unix: | all; Default: — Context: stream, serve•deny指令用于拒绝特定IP地址或子网访问。Syntax: deny address | CIDR | unix: | all; Default: — Context: stream, server简单示例其优先级按指令配置顺序依次检查直到匹配上第一个规则后然后终止检查简单的说可写多条allow/deny指令按顺序匹配第一条匹配规则生效。server { ... deny 192.168.1.1; allow 192.168.1.0/24; allow 10.1.1.0/16; allow 2001:0db8::/32; deny all; }实例演示作者将基于 proxy protocol 协议获取客户端真实IP然后分别演示在 PREACCESS 阶段使用limit_conn模块限制客户端并发连接数以及在 ACCESS 阶段使用access模块限制特定或仅允许某 IP 的访问。步骤 01.编辑 Nginx 配置文件在 stream 块中启用 proxy protocol 并设置 limit_conn 和 access 控制。tee /usr/local/nginx/conf/nginx.conf EOF worker_processes auto; error_log /var/log/nginx/error.log debug; events { worker_connections 1024; } # stream 模块配置块 stream { # 定义一个共享内存区域用于存储连接状态 limit_conn_zone $binary_remote_addr zonesrc_addr:10m; # 定义一个日志模式格式加入了 $limit_conn_status 变量以便记录连接是否被限制。 log_format basic $remote_addr:$remote_port $realip_remote_addr:$realip_remote_port [$time_local] $protocol $status $bytes_sent $bytes_received $session_time $limit_conn_status; # 开启日志文件描述符缓存减少打开和关闭文件的开销 open_log_file_cache max1000 inactive60s min_uses2 valid1m; # 定义一个四层TCP服务 server { # 监听 8090 端口启用 proxy protocol listen 8090 proxy_protocol; # 设置读取 proxy protocol 数据的超时时间 proxy_protocol_timeout 15s; # 设置可信客户端IP地址即真实地址将排除下述IP或IP段的地址。 set_real_ip_from 127.0.0.1; set_real_ip_from 10.20.172.0/24; # 限制每个客户端的并发连接数此处设置为1 limit_conn src_addr 1; # 设置日志级别当连接被限制时记录的日志等级设置为 error 可调低日志级别以减少日志量。 limit_conn_log_level error; # 使用 access 控制指令允许特定IP地址或子网访问。 allow 222.177.8.0/24; deny all; # 拒绝所有其他IP地址的访问。 # 开启访问日志记录注意这里为了测试未启用缓存生产环境中推荐使用缓存。 access_log /var/log/nginx/stream.log basic; # 返回客户端真实IP和端口并打印其他相关信息以验证请求。 returnHello World, proxy_protocol ! hostname: $hostname pid: $pid nginx_version: $nginx_version protocol: $protocol remote_addr: $remote_addr remote_port: $remote_port server_addr: $server_addr server_port: $server_port realip_remote_addr: $realip_remote_addr realip_remote_port: $realip_remote_port proxy_protocol_addr: $proxy_protocol_addr proxy_protocol_port: $proxy_protocol_port bytes_received: $bytes_received bytes_sent: $bytes_sent session_time: $session_time status: $status limit_conn_status: $limit_conn_status msec: $msec time_iso8601: $time_iso8601\n; } } EOF步骤 02.重新加载 Nginx 配置并测试 limit_conn 控制是否生效例如可使用 telnet 或者 python 脚本模拟客户端同时连接验证我们在 nginx 配置文件中同一时刻只能有一个连接获取到响应以及在 ACCESS 阶段仅允许特定IP访问。nginx -t nginx -s reload # 这里使用上文中的 send_proxy_protocol_v2.py 脚本以及 mobaXterm 工具测试。 python3 send_proxy_protocol_v2.py 222.177.8.188 58126 # 或者使用 telnet 测试 V1 版本。 PROXY TCP4 222.177.8.188 10.20.172.214 58126 8080weiyigeek.top-验证 limit_conn 与 allow 指令图步骤 03.验证ACCESS阶段仅允许特定IP访问例如尝试使用其他 IP 地址连接会发现访问被拒绝通过日志与操作验证了access模块的生效。$ tail -f /var/log/nginx/stream.log # 步骤 02 操作结果 222.177.8.188:58126 10.20.172.213:33058 [26/Jan/2026:16:27:09 0800] TCP 200 0 0 0.000 PASSED# 允许访问会话状态码 200表明连接成功。 222.177.8.188:58126 10.20.172.213:49256 [26/Jan/2026:16:27:19 0800] TCP 503 0 0 0.000 REJECTED# limit_conn 控制生效访问被拒绝会话状态码 503。 # 步骤 03 操作结果 202.12.144.236:58126 10.20.172.213:60108 [26/Jan/2026:16:52:57 0800] TCP 403 0 0 1.111 PASSED# limit_conn 控制未生效但 access 模块拒绝访问返回 403 222.177.8.230:58126 10.20.172.213:47632 [26/Jan/2026:16:53:41 0800] TCP 200 0 0 0.641 PASSED# 允许访问会话状态码 200表明连接成功。weiyigeek.top-验证 ACCESS 模块指令效果图本小节介绍与实践了通过proxy protocol协议获取客户端真实IP然后在PREACCESS和ACCESS阶段分别使用limit_conn和access模块进行限制并发和IP访问控制以及在 Log 阶段中使用 log 模块记录每条连接的详细日志便于问题定位与行为分析同时支持自定义格式与文件描述符缓存。END加入作者【全栈工程师修炼指南】知识星球『 全栈工程师修炼指南』星球主要涉及全栈工程师Full Stack Development实践文章持续更新包括但不限于企业SecDevOps和网络安全等保合规、安全渗透测试、编程开发、云原生Cloud Native、物联网工业控制IOT、人工智能Ai从业书籍笔记人生职场认识等方面资料或文章。Q: 加入作者【全栈工程师修炼指南】星球后有啥好处✅ 将获得作者最新工作学习实践文章以及网盘资源。✅ 将获得作者珍藏多年的全栈学习笔记(需连续两年及以上老星球友也可单次购买)✅ 将获得作者专门答疑学习交流群解决在工作学习中的问题。✅ 将获得作者远程支持在作者能力范围内且合规。获取作者工作学习全栈笔记作者整理了10年的工作学习笔记涉及网络、安全、运维、开发需要学习实践笔记的看友可添加作者微信或者回复【工作学习实践笔记】当前价格299除了获得从业笔记的同时还可进行问题答疑以及每月远程技术支持希望大家多多支持收获定大于付出知识推荐往期文章【最新】告别杂乱审计日志多厂商网络设备日志统一采集与可视化分析最佳实践【最新】Categraf | 国产化采集器实现SQL Server 数据库指标采集、可视化、异常告警全流程【最新】Categraf | 国产化采集器实战MySQL 指标采集、可视化、异常告警全流程【最新】Ops实践 | 从零开始Prometheus通过IPMI协议抓取服务器硬件设备指标并可视化展示【相关】Nginx | stream 四层反向代理LOG、POST_ACCEPT阶段模块指令浅析与实践【相关】Nginx | 核心知识150讲百万并发下性能优化之四层反向代理七个阶段浅析及核心模块实践【相关】Nginx | v2 模块告别HTTP1.1开启多路复用与资源推送【相关】Nginx | open_file_cache 功能实现解决频繁 open/close 的性能顽疾若文章对你有帮助请将它转发给更多的看友若有疑问的小伙伴可在评论区留言你想法哟