Se você estiver aberto a soluções que não envolvam iptables
, basta executar um servidor proxy simples (como saldo ou haproxy ou caneta ou algo assim) para interceptar o tráfego para localhost
e passá-lo para seus contêineres.
Eu corro alguns contêineres Linux, cada um executando uma aplicação web, no meu host Ubuntu. Para acessar as aplicações web, eu uso iptables
para encaminhar porta:
sudo iptables -t nat -A PREROUTING -p tcp --dport <port> -j DNAT --to-destination #<container_ip>:<port>
Isso funciona bem se o tráfego vier de fora do meu host. Se a solicitação for feita por localhost, isso não funcionará:
curl <host_ip>:<port> #works (from outside the host)
curl <container_ip>:<port> #works (from inside the host)
curl 127.0.0.1:<port> #doesn't work (from inside the host)
Eu entendo que o pacote vindo do localhost não passa pela regra DNAT do iptables e é por isso que ele não está funcionando. Existe alguma maneira de fazer isso funcionar?
@ Brigo: Isso está incorreto. A tabela nat pode conter uma cadeia OUTPUT. O problema é que a cadeia PREROUTING da tabela nat não é aplicada à interface de loopback.
@rmonjo, use a cadeia OUTPUT além da cadeia PREROUTING:
iptables -t nat -A OUTPUT -o lo -p tcp --dport <port> -j DNAT \
--to-destination #<container_ip>:<port>
Edit: isso não funciona. Eu estava pensando no alvo do REDIRECT que não resolveria esse problema.
Eu gastei muito tempo tentando fazer o iptables fazer este truque, mas de alguma forma, se você adicionar um alvo dnat à cadeia de saída da tabela nat, o processamento adicional do pacote parece parar.
A depuração do iptables pode ser feita com este truque: link
Uma visão geral gráfica do fluxo de pacotes no Linux também ajuda: link
Recorri ao xinetd para resolver o meu problema, veja Encaminhando o terminal (no localhost) de um túnel SSH-L para outra máquina