Docker 中使用 Nginx 实现透明代理和 UDP 负载均衡

Docker 中使用 Nginx 实现透明代理和 UDP 负载均衡

我正在尝试使用 IP 和端口透明代理设置 udp 负载均衡器。我的环境在 docker 上运行。我们使用 mesos + marathon 来管理容器。对于 UDP 负载平衡,我使用 Nginx。应用程序和 Nginx 在 docker 容器中运行。我有几个要求:1. 一个客户端在其会话期间应始终连接到同一个应用程序节点。2. nginx 后面的应用程序应假定它正在直接与客户端通信。

我使用这篇文章进行设置:https://www.nginx.com/blog/ip-transparency-direct-server-return-nginx-plus-transparent-proxy/

因此 nginx 以 root 用户身份运行。容器位于同一网络上。我为 nginx 包含了许多模块,如 stream 和 nginx-sticky-module-ng 等。

Nginx 流配置:`

upstream app-server {
  sticky;
  server some-app:5684;
  server some-app:5684;
 }

server {     
    listen 5684 udp;
    proxy_pass app-server:5684;
    proxy_bind $remote_addr:$remote_port transparent;
    proxy_responses 1;
    proxy_timeout 1s; 
       }

在每个上游服务器上,我将默认 gw 设置为 Nginx IP。

在 nginx 上我设置了以下 iptables 规则。

iptables -t mangle -N DIVERT
iptables -t mangle -A PREROUTING -p udp -m socket -j DIVERT
iptables -t mangle -A DIVERT -j MARK --set-mark 1
iptables -t mangle -A DIVERT -j ACCEPT
iptables -t mangle -A PREROUTING -p udp -s 172.16.0.0/16 --sport 5684 -j TPROXY --tproxy-mark 0x1/0x1 --on-port 0 #I assume this should be 0,because there could be different ports
ip rule add fwmark 1 lookup 100
ip route add local 0.0.0.0/0 dev lo table 100

但客户端似乎无法访问服务器。看起来数据包只是卡在了 Nginx 上。是我缺少某些配置还是 iptables 规则出了问题?

相关内容