Nginx IP transparente - encaminha a resposta do servidor através do balanceador de carga e não diretamente ao cliente

1

Recebi uma tarefa de configurar o IP Transparente no Nginx para passar o endereço do cliente e a porta para o servidor upstream. A configuração é assim:

Client --> Nginx (listens for udp on 90009) --> Service (listens on localhost:59153)

O Nginx e o serviço estão configurados no mesmo host.

A configuração básica funciona sem nenhum problema - a solicitação é capturada pelo nginx, encaminhada para o serviço, o serviço responde ao nginx e volta ao cliente.

O comportamento pretendido é passar o ip da origem da solicitação para o serviço, portanto, eu configuro o nginx assim:

stream {
  upstream upstream_servers {
      server 127.0.0.1:59153;
  }

  server {
      listen 90009 udp;
      proxy_bind $remote_addr:$remote_port transparent;
      proxy_pass upstream_servers;

  }
}

proxy_bind $remote_addr:$remote_port transparent; faz o trabalho corretamente - ip/port é passado atrás do nginx para o serviço. No entanto, o serviço (não surpreendentemente) está tentando responder diretamente ao dado ip/port . A comunicação com o mundo externo é permitida apenas na porta 90009, portanto, a resposta nunca é entregue.

O que eu tentei fazer é encaminhar a resposta, com base em IP Transparency e Direct Server Return com NGINX e NGINX Plus como Transparent Proxy . Então fiz o seguinte:

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 -m socket -j TPROXY --tproxy-mark 1 --on-port 90009
ip rule add fwmark 1 lookup 100
ip route add local 0.0.0.0/0 dev lo table 100

Mas isso resulta em um dos dois resultados, dependendo de como eu defino o iptables -t mangle -A PREROUTING -p udp -m socket -j TPROXY --tproxy-mark 1 --on-port 90009 :

  1. Pacotes UDP de renda são roteados e a solicitação nunca chega ao nginx
  2. Nenhum dos pacotes é roteado, a resposta não é entregue

A minha pergunta é basicamente, como encaminhar apenas a resposta através do balanceador de carga ou, se esta abordagem estiver errada, como tentar resolver isso?

    
por Michał U 01.11.2016 / 17:43

0 respostas