nginx stream模块通过四层透明转发实现tcp/udp端口映射,不解析应用层协议,需确认编译含--with-stream、配置与http同级、配合防火墙及连通性检查。

Nginx 本身不支持“劫持”这种带强制拦截或中间篡改语义的操作,它做的是透明转发——即按配置把指定端口的 TCP 流量原样转发到后端服务。所谓“流量劫持”,在运维语境中常被误用,实际指的就是端口监听 + 协议透传,Nginx 的 stream 模块正是为此设计。
要让 Nginx 对特定端口(比如 8080、53、22、6379 等)实现可控的 TCP 流量转发,关键在于三点:模块可用、配置位置正确、网络路径通畅。
必须启用 stream 模块
Nginx 默认不编译 stream 模块。确认方式很简单:
- 运行
nginx -V 2>&1 | grep -o with-stream - 如果没输出,说明缺失。需重新编译,加参数:
./configure --with-stream --with-stream_ssl_module
stream 块不能写在 http 内部
这是最常见错误。stream { ... } 是顶层块,和 http 并列,不是它的子项。正确结构示例:
# /etc/nginx/nginx.conf
events {
worker_connections 1024;
}
stream {
server {
listen 8080;
proxy_pass 192.168.1.100:8080;
proxy_timeout 30s;
proxy_responses 1;
}
server {
listen 53 tcp;
proxy_pass 10.0.2.5:53;
proxy_timeout 5s;
}
}
转发行为是纯四层透传,不解析内容
- 不会解包 HTTP、DNS 或 Redis 协议
- 不修改 payload、不重写 header、不做 TLS 终止(除非显式启用
ssl_preread和proxy_ssl) - 所以它“看不到”应用层数据,自然也无法做基于 URL 或域名的规则过滤
实际生效前要检查几件事
- 防火墙是否放行监听端口(如
ufw allow 8080) - 后端服务是否真实监听目标 IP:PORT,且能被 Nginx 主机访问(可
telnet 192.168.1.100 8080测试) - SELinux 或 AppArmor 是否阻止了 Nginx 的网络绑定(常见于 CentOS/RHEL)
-
nginx -t验证语法,再nginx -s reload生效
不复杂但容易忽略











