上游未收到 Nginx 代理绑定 UDP 数据报(错误的 udp 校验和)
Nginx Proxy-Bind UDP datagram not received (bad udp checksum) on upstream
我正在设置 UDP 负载平衡器。
我在 Ubuntu 16.04.3 LTS 上使用 Nginx Plus r14。托管是作为上游的准系统服务器和负载均衡器的 VPS 实例完成的。
我希望我可以设置一个透明代理,直接响应客户端(这是此处描述的 Origin-NAT 用例
https://www.nginx.com/blog/ip-transparency-direct-server-return-nginx-plus-transparent-proxy/).
The Nginx configuration looks correct :
user root;
worker_processes auto;
worker_rlimit_nofile 65535;
error_log /var/log/nginx/error.log debug;
pid /var/run/nginx.pid;
events {
worker_connections 20000;
}
http {
include /etc/nginx/mime.types;
default_type application/octet-stream;
log_format main '$remote_addr - $remote_user [$time_local] "$request" '
'$status $body_bytes_sent "$http_referer" '
'"$http_user_agent" "$http_x_forwarded_for"';
access_log /var/log/nginx/access.log main;
sendfile on;
#tcp_nopush on;
keepalive_timeout 65;
#gzip on;
include /etc/nginx/conf.d/*.conf;
}
stream {
upstream my_udp_upstreams {
hash $remote_addr;
server preprods.mycorp.com:5684;
}
server {
listen 5684 udp;
proxy_bind $remote_addr:$remote_port transparent;
proxy_pass my_udp_upstreams;
proxy_responses 0;
}
}
在 Nginx 负载均衡器上执行的 tcpdump 显示如下,看起来不错:
09:29:55.112096 IP 54.38.X.Y.57064 > 217.182.A.B.5656: UDP, length 95
(client -> LB)
09:29:55.112447 IP 54.38.X.Y.57064 > 149.202.C.D.5656: UDP, [bad udp cksum 0xb338 -> 0x8b86!] length 95
(IP is spoofed, client->upstream)
端口5656是上游服务器上serviec的目的端口,54.38.X.Y是客户端地址,217.182.A.B是Load
Balancer地址和149。202.C.D是上游服务器地址。
我的问题是 5656 端口上游没有数据到达。在上游服务器上执行的 tcpdump 没有显示任何内容:
sudo tcpdump -i eth0 -n port 5684
看起来欺骗数据包要么没有离开 LB,要么没有被上游接收到。我使用 ethtool 禁用了校验和卸载,但问题仍然存在:
sudo ethtool --offload ens3 rx off tx off
sudo ethtool -K ens3 gso off
是我做错了什么还是某处进行了过滤?
设置正确,但托管公司 (OVH) 不允许 IP 欺骗,因此数据报被丢弃并且永远无法通过上游。
我正在设置 UDP 负载平衡器。
我在 Ubuntu 16.04.3 LTS 上使用 Nginx Plus r14。托管是作为上游的准系统服务器和负载均衡器的 VPS 实例完成的。
我希望我可以设置一个透明代理,直接响应客户端(这是此处描述的 Origin-NAT 用例 https://www.nginx.com/blog/ip-transparency-direct-server-return-nginx-plus-transparent-proxy/).
The Nginx configuration looks correct :
user root;
worker_processes auto;
worker_rlimit_nofile 65535;
error_log /var/log/nginx/error.log debug;
pid /var/run/nginx.pid;
events {
worker_connections 20000;
}
http {
include /etc/nginx/mime.types;
default_type application/octet-stream;
log_format main '$remote_addr - $remote_user [$time_local] "$request" '
'$status $body_bytes_sent "$http_referer" '
'"$http_user_agent" "$http_x_forwarded_for"';
access_log /var/log/nginx/access.log main;
sendfile on;
#tcp_nopush on;
keepalive_timeout 65;
#gzip on;
include /etc/nginx/conf.d/*.conf;
}
stream {
upstream my_udp_upstreams {
hash $remote_addr;
server preprods.mycorp.com:5684;
}
server {
listen 5684 udp;
proxy_bind $remote_addr:$remote_port transparent;
proxy_pass my_udp_upstreams;
proxy_responses 0;
}
}
在 Nginx 负载均衡器上执行的 tcpdump 显示如下,看起来不错:
09:29:55.112096 IP 54.38.X.Y.57064 > 217.182.A.B.5656: UDP, length 95
(client -> LB)
09:29:55.112447 IP 54.38.X.Y.57064 > 149.202.C.D.5656: UDP, [bad udp cksum 0xb338 -> 0x8b86!] length 95
(IP is spoofed, client->upstream)
端口5656是上游服务器上serviec的目的端口,54.38.X.Y是客户端地址,217.182.A.B是Load Balancer地址和149。202.C.D是上游服务器地址。
我的问题是 5656 端口上游没有数据到达。在上游服务器上执行的 tcpdump 没有显示任何内容:
sudo tcpdump -i eth0 -n port 5684
看起来欺骗数据包要么没有离开 LB,要么没有被上游接收到。我使用 ethtool 禁用了校验和卸载,但问题仍然存在:
sudo ethtool --offload ens3 rx off tx off
sudo ethtool -K ens3 gso off
是我做错了什么还是某处进行了过滤?
设置正确,但托管公司 (OVH) 不允许 IP 欺骗,因此数据报被丢弃并且永远无法通过上游。