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
:
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?
Tags nginx transparent-proxy udp