Proxy transparente e balanceamento de carga do udp com Nginx no Docker

1

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?

    
por Andrew 04.01.2017 / 21:40

0 respostas