Estou tentando configurar o balanceador de carga do udp com o proxy transparente de porta e IP. Meu ambiente é executado no docker. Estamos usando mesos + maratona para gerenciar contêineres. Para o balanceamento de carga UDP, uso o Nginx. App e Nginx são executados em contêineres do Docker. Eu tenho poucos requisitos: 1. Um cliente deve sempre se conectar ao mesmo nó do aplicativo durante sua sessão. 2. App atrás do nginx deve assumir que está se comunicando diretamente com o cliente.
Eu usei este artigo para minha configuração: link
Então, o nginx está sendo executado com o usuário root. Contêineres estão na mesma rede. Eu incluí um monte de módulos para nginx como stream e nginx-sticky-module-ng e etc.
Nginx Stream conf: '
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;
}
Em cada servidor upstream, defino o padrão gw para o Nginx IP.
No nginx eu configurei as seguintes regras do 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
Mas o cliente não consegue alcançar o servidor. Parece que os pacotes ficaram presos no Nginx. Estou faltando alguma configuração ou algo de errado com as regras iptables?