nginx tcp代理是高性能中转代理而非主动穿透,适用于已有网络连通前提下的端口映射;需公网服务器、内网可达、非http服务暴露及低延迟转发,配置须在stream顶层,配合防火墙与安全加固。

Nginx 的 TCP 代理能力(通过 stream 模块)在内网穿透中不是“主动穿透”,而是作为高性能、低开销的中转代理,适用于已有网络连通前提下的端口映射场景。它不解决 NAT 或防火墙阻断问题,但一旦链路打通(如通过 SSH 隧道、frp 或云服务器直连),Nginx 就能稳定、高效地转发原始 TCP 流量。
适用场景与核心定位
它适合以下明确前提下的使用:
- 你已有一台带公网 IP 的 Linux 服务器(如阿里云 ECS、腾讯云 CVM)
- 该服务器能访问目标内网服务(例如:内网数据库在 192.168.1.100:3306,且云服务器可 ping 通并 telnet 连通)
- 需要暴露非 HTTP 协议服务(SSH、MySQL、Redis、PostgreSQL、自定义 TCP 服务等)
- 追求轻量、低延迟、高并发的纯转发,不依赖额外中间件(如 frp 客户端进程)
配置关键点与实操要点
stream 块必须位于 nginx.conf 顶层(不能嵌套在 http 块内),且需确保模块可用:
- 运行
nginx -V 2>&1 | grep with-stream,有输出才可继续 - listen 地址建议指定公网 IP(如
1.2.3.4:2222),避免用0.0.0.0增加暴露面 -
proxy_timeout设为 3600(1 小时)或更高,防止空闲连接被运营商或防火墙中断 -
proxy_responses 1适用于多数无交互协议(如 MySQL 握手后即通信),对需多轮响应的服务(如某些游戏协议)可省略
安全加固不可跳过
仅靠 Nginx 转发不等于安全——它本身不提供认证、加密或访问控制:
- 用 ufw 或 iptables 限制
2222端口只允许可信 IP(如公司办公出口 IP)访问 - 禁止直接映射敏感端口(如 MySQL 默认 3306、Redis 6379)到公网;若必须暴露,前置 SSH 隧道或 TLS 终止(如 stunnel)
- 如需用户级鉴权,需搭配外部方案:例如用
auth_http模块调用后端鉴权接口,或前置一个带认证的反向代理层
验证与排错常见路径
启动后按顺序检查:
-
nginx -t确认语法无误;systemctl reload nginx生效配置 -
ss -tlnp | grep :2222查看 Nginx 是否真正在监听目标端口 - 从外网机器执行
telnet your-public-ip 2222,通则说明 TCP 层链路就绪 - 若 telnet 通但服务无响应,重点排查:内网服务是否绑定
0.0.0.0或特定 IP、本地防火墙(如 ufw)、MySQL 的bind-address和skip-networking设置











