stream模块工作在传输层,不解析HTTP,故allow/deny指令(属ngx_http_access_module)不可用;需用iptables/nftables等系统防火墙实现IP控制,或前置HTTP网关做七层过滤。

四层负载均衡本身不解析 HTTP 请求头,allow 和 deny 指令在 stream 块中不可用——它们仅适用于 http 上下文(如 location、server 块)。直接在 stream 模块里写 allow 192.168.1.100; deny all; 会导致 Nginx 启动失败。
为什么 stream 块不能用 allow/deny
Nginx 的 stream 模块工作在传输层(TCP/UDP),处理的是原始连接,不建立 HTTP 会话,也不支持基于 URI、Header 或 IP 的访问控制指令。它的访问控制必须交由更底层的机制实现:
-
allow/deny属于ngx_http_access_module,只在http模块中生效 -
stream模块依赖ngx_stream_access_module,但该模块不提供 IP 白名单/黑名单语法,仅支持access_log和基础连接日志 - 试图在
stream { ... }中使用allow会报错:"allow" directive is not allowed here
替代方案:用系统防火墙控制源 IP
对四层代理流量做源 IP 限制,应优先使用操作系统级防火墙,既高效又可靠:
- 用
iptables限制进入 Nginx 监听端口的连接(例如 5555、6666) - 示例:只允许 10.0.0.0/24 访问 SSH 代理端口 5555
iptables -A INPUT -p tcp --dport 5555 -j DROP
- 用
nftables(推荐,替代 iptables)实现更清晰的规则管理 - 规则应放在
filter input链,匹配目标端口 + 源地址,拒绝其余流量
补充加固:在 stream 中启用连接限制与超时
虽然不能做 IP 过滤,但可通过连接行为控制降低风险:
- 设置短连接超时,防止慢速攻击或连接耗尽:
proxy_timeout 3s; - 限制单 IP 并发连接数(需配合
limit_conn模块) - 启用连接日志,记录源 IP 和协议状态,便于审计:
access_log /var/log/nginx/stream.log proxy; - 禁用不必要的协议特性,如关闭 UDP 反射放大风险(若不用 UDP,注释掉
listen ... udp;)
进阶建议:前置七层网关做 IP 筛选
若业务允许且架构可调整,可在四层负载均衡前部署一层轻量 HTTP 网关(如另一台 Nginx 的 http 块),专门做:
- 源 IP 白名单校验(
allow/deny) - HTTP-to-TCP 协议转换(例如用
proxy_pass转发到后端 stream 实例) - 添加 TLS 终止、WAF 规则等增强防护
这种方式兼顾灵活性与安全性,适合需要精细访问控制的生产环境。


















