我正在尝试使用 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 规则出了问题?