上游未收到 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 欺骗,因此数据报被丢弃并且永远无法通过上游。