Nginx通过stream模块实现四层TCP反向代理,中转访问云服务(如阿里云RDS、腾讯云CKafka),需确保中转机直连云服务、启用with-stream模块、在顶层配置stream块并配合DNS解析与安全组放行。

Nginx 代理第三方云服务的 TCP 接口(如阿里云 RDS、腾讯云 CKafka、华为云 DCS 等)实现内网访问中转,本质是利用 Nginx 的 stream 模块做四层 TCP 反向代理。关键在于:云服务的 TCP 端口必须能被你的中转服务器直连(即中转机需在云厂商白名单/安全组放行范围内),且 Nginx 需支持并启用 stream 模块。
以下为清晰、可落地的操作要点:
确认前提条件
- 中转服务器(部署 Nginx 的机器)必须能直连目标云服务的 TCP 地址和端口(例如
rm-xxx.mysql.rds.aliyuncs.com:3306或kafka-xxx.tencentcloudapi.com:9093) - Nginx 版本 ≥ 1.9.0,且编译时含
--with-stream(检查命令:nginx -V 2>&1 | grep -o with-stream) - 若需 TLS 加密中转(如代理 HTTPS 管理端口或 Kafka SASL_SSL),还需
--with-stream_ssl_module
配置 stream 块(独立于 http)
编辑主配置文件(如 /etc/nginx/nginx.conf),在文件末尾(http { ... } 外部)添加 stream 块:
stream {
# 示例:代理阿里云 RDS MySQL(明文)
upstream rds_mysql {
server rm-xxx.mysql.rds.aliyuncs.com:3306;
# 可加健康检查(需云服务支持 TCP 探针)
# health_check interval=3 fails=2 passes=2;
}
server {
listen 3307; # 本地暴露端口(避免与本地 MySQL 冲突)
proxy_pass rds_mysql;
proxy_timeout 60s;
proxy_responses 1; # 单次连接只转发一次响应(适配数据库协议)
}
# 示例:代理腾讯云 Kafka(SSL 加密链路)
upstream kafka_ssl {
server kafka-xxx.tencentcloudapi.com:9093;
}
server {
listen 9094 ssl; # 启用 SSL 监听
ssl_certificate /etc/nginx/ssl/kafka-proxy.crt;
ssl_certificate_key /etc/nginx/ssl/kafka-proxy.key;
ssl_protocols TLSv1.2 TLSv1.3;
proxy_pass kafka_ssl;
proxy_timeout 300s;
}
}注意云服务特殊限制
- 阿里云 RDS、华为云 DCS 等默认只允许白名单 IP 访问:将中转服务器公网 IP 加入云控制台对应实例的「安全组」或「网络 ACL」
- 腾讯云 CKafka 要求客户端使用 SASL 认证:Nginx stream 层无法处理 SASL 协议,只能透传;确保你的客户端仍按原方式提供用户名/密码,Nginx 不解密、不干预
- 所有云服务的域名解析由 Nginx 进程完成(非客户端),因此需在中转机上配置可靠 DNS(如
resolver 223.5.5.5 valid=30s;放在stream块顶部)
验证与调试
- 检查语法:
nginx -t - 重载配置:
nginx -s reload - 查看监听:
ss -tlnp | grep :3307(确认 Nginx 绑定成功) - 本地测试(以 MySQL 为例):
mysql -h 127.0.0.1 -P 3307 -u your_user -p
- 抓包确认流量路径:
tcpdump -i any port 3307 -w proxy.pcap,检查是否发往云服务真实地址
不复杂但容易忽略


















