不能在 nginx stream 模块中直接使用 allow/deny 指令实现数据库端点物理隔离,因其属 http 模块指令,stream 模块不加载;应采用系统防火墙(iptables/nftables)、前置 http 网关预筛或 stream 内部连接加固等生产级方案。

不能在 Nginx stream 模块中直接使用 allow 与 deny 指令实现数据库端点的物理隔离。
这是因为 allow/deny 属于 ngx_http_access_module,仅在 http 上下文(如 server 或 location 块)中有效;而 stream 模块运行在传输层,不解析 HTTP 协议,也不加载该模块。在 stream { } 块中写 allow 10.0.1.5; 会导致 Nginx 启动失败,并报错:"allow" directive is not allowed here。
真正的四层 IP 访问控制,需通过其他可靠方式落地,以下是三种切实可行、生产环境广泛采用的方法:
必须用系统防火墙做源 IP 过滤
这是最底层、最高效、最安全的物理隔离手段,直接作用于网络栈入口,不依赖 Nginx 解析逻辑。
- 对数据库代理端口(如
3306)限制来源 IP:# 允许可信网段 iptables -A INPUT -p tcp --dport 3306 -s 10.20.0.0/16 -j ACCEPT iptables -A INPUT -p tcp --dport 3306 -s 172.16.100.0/24 -j ACCEPT # 拒绝其余所有 iptables -A INPUT -p tcp --dport 3306 -j DROP
- 更推荐用
nftables(现代、结构清晰):nft add rule ip filter input tcp dport 3306 ip saddr != { 10.20.0.0/16, 172.16.100.0/24 } drop
✅ 优势:规则生效快、无性能损耗、绕过任何应用层组件,真正实现“物理级”访问拦截。
可选:前置轻量 HTTP 网关做七层预筛
若架构允许,在 stream 实例前部署一台专用 Nginx(仅启用 http 模块),专责 IP 白名单校验 + 协议桥接:
-
第一层(HTTP 网关):
http { server { listen 3306; location / { allow 10.20.0.10; allow 10.20.0.11; deny all; # 转发原始 TCP 流给后端 stream 实例(需启用 stream proxy_pass 支持) proxy_pass stream://127.0.0.1:3307; proxy_http_version 1.1; proxy_set_header Connection ''; } } } 第二层(stream 实例)监听
3307,专注转发,不做访问判断。
⚠️ 注意:标准 Nginx 不原生支持
proxy_pass stream://,需配合ngx_stream_proxy_module或使用支持 TCP 透传的定制版本(如 Tengine)。更稳妥的做法是用SOCKS5或HTTP CONNECT封装,但会引入额外复杂度。
推荐组合:防火墙 + stream 内部连接加固
在防火墙兜底基础上,stream 配置本身也应强化连接可靠性,间接提升隔离效果:
-
设置严格超时与保活,防止异常连接长期滞留:
stream { server { listen 3306; proxy_pass mysql_backend; proxy_timeout 30m; # 避免空闲连接被中间设备断开 proxy_responses 1; # 确保后端 MySQL 已响应再认定连接就绪 so_keepalive on; # 启用 TCP keepalive 探测链路活性 } } -
启用连接日志,记录真实源 IP(需开启
access_log并确保未被 NAT 丢失):stream { log_format stream_log '$remote_addr:$remote_port → $server_addr:$server_port — $status — $time_local'; access_log /var/log/nginx/stream-access.log stream_log; server { ... } }
? 补充:若后端数据库支持 PROXY 协议(如 MySQL 8.0+),可在 stream 中启用
proxy_protocol on;,并配置后端服务解析该协议头,从而在数据库侧也能拿到原始客户端 IP,便于审计与权限联动。
不复杂但容易忽略。











