Nginx Plus UDP透明代理异常:伪造数据包未抵达上游服务器
排查UDP透明代理(Origin-NAT)数据未达上游的问题
结合你的配置、抓包信息和操作步骤,我帮你梳理几个核心问题和解决方向:
1. 端口配置完全不匹配(最致命的问题)
你的Nginx Stream配置里监听的是5684端口:
server { listen 5684 udp; # 其他配置... }
但tcpdump显示客户端发送到LB的是5656端口,LB尝试转发的也是5656端口到上游。这意味着Nginx根本没在监听5656端口,这些UDP数据包完全没被Nginx处理,自然不会转发到上游服务器。
解决办法:
- 要么把Nginx的
listen端口改成5656 udp;,匹配实际的业务端口; - 要么调整客户端的请求端口到5684,和配置一致。
2. 上游服务器抓包命令错误
你在上游执行的抓包命令是:
sudo tcpdump -i eth0 -n port 5684
但LB转发的是5656端口的流量,这个命令根本捕获不到目标数据包。你应该修改为:
sudo tcpdump -i eth0 -n port 5656
这样才能看到LB发来的UDP包。
3. 透明代理依赖的系统配置缺失
Nginx Plus的UDP透明代理(Origin-NAT模式)不仅需要Nginx配置,还必须完成系统层面的配置:
- 开启IP转发:
编辑echo 1 > /proc/sys/net/ipv4/ip_forward/etc/sysctl.conf添加net.ipv4.ip_forward=1,执行sudo sysctl -p永久生效。 - 允许绑定非本地IP:
同样写入echo 1 > /proc/sys/net/ipv4/ip_nonlocal_bind/etc/sysctl.conf并生效,这个参数让Nginx能绑定客户端的IP(非LB本地IP)实现透明代理。 - 确认Nginx权限:你已经设置
user root;,满足透明代理需要的CAP_NET_RAW和CAP_NET_ADMIN权限,这部分没问题。
4. 防火墙过滤规则排查
检查LB和上游服务器的防火墙是否拦截了UDP 5656的流量:
- 在LB上检查IPtables/UFW规则:
确保允许UDP 5656的入站和出站流量。sudo iptables -L -n -v | grep 5656 sudo ufw status - 在上游服务器上检查是否允许来自LB的UDP 5656入站流量,若使用UFW,可添加规则:
(替换sudo ufw allow from 217.182.A.B/32 to any port 5656 proto udp217.182.A.B为你的LB实际IP)
5. UDP校验和错误的说明
你看到的[bad udp cksum]大概率是误报:在LB上抓出站包时,数据包还没经过网卡硬件计算校验和(即使你关闭了tx offload,Nginx计算校验和的时机可能晚于tcpdump抓包),所以tcpdump会显示校验和错误。这个不是上游收不到包的根本原因,不用过度关注。
内容的提问来源于stack exchange,提问作者SCO
相关产品推荐
相关产品推荐

