ipt_porta o encaminhamento de porta A - B - A

1

Eu tenho uma máquina host ( A ) com o contêiner lxc ( B ). O endereço IP local de A é 10.0.3.1 e ip público, digamos 1.2.3.4. O endereço IP local de B é 10.0.3.21.

Eu preciso que o 1.2.3.4:7999 seja encaminhado para 10.0.3.1:7999 e criei as seguintes regras para isso:

iptables -t nat -I PREROUTING -p tcp -d 1.2.3.4 --dport 7999 -j DNAT --to 10.0.3.21:7999
iptables -A FORWARD -p tcp -d 10.0.3.21 --dport 7999 -j ACCEPT

Quando me conecto ao A (1.2.3.4:7999) do mundo externo, estou me conectando com sucesso. Mas estou caindo quando tento me conectar a B de A (tempo limite da conexão).

Quais regras devo criar para poder conectar-me a 1.2.3.4:7999 de 10.0.3.1?

    
por Andrey Kuznetsov 04.02.2013 / 03:57

2 respostas

1

Você tem uma situação NAT hairpin aqui, que suas regras atuais do iptables não suportam. Quando o container envia o pedido, o pacote se parece com isto:

10.0.3.21:12345 -> 1.2.3.4:7999

O gateway então DNATs o pacote para isso, e envia de volta para o recipiente:

10.0.3.21:12345 -> 10.0.3.21:7999

O container recebe os pacotes e envia uma resposta assim:

10.0.3.21:7999 -> 10.0.3.21:12345

i.e. Ele é endereçado diretamente ao contêiner em si. Mas a porta 12345 não sabe sobre uma conexão com 10.0.3.21:7999, porque a conexão era com 1.2.3.4:7999 e, portanto, a resposta é ignorada.

A solução também é SNAT o pacote no gateway para que a resposta retorne ao gateway, que então desfaz os dois NATs. Tente adicionar algo assim:

iptables -t NAT -A POSTROUTING -o lxcbr0 -d 10.0.3.21 -s 10.0.3.21 -j SNAT --to 10.0.3.1
    
por 04.02.2013 / 23:15
0

Acho que o problema que você está enfrentando é que a resposta está voltando em uma interface diferente.

Solicitação inicial

S: 1.2.3.4
D: 1.2.3.4

DNAT

S: 1.2.3.4
D: 10.0.3.21

Neste ponto, o host A toma a decisão de rotear para 10.0.3.21 usando a interface de rede privada.

RESPOSTA

S: (IP of default GW interface on B)
D: 1.2.3.4

O pacote de resposta de B irá percorrer o gateway padrão e mais do que provavelmente voltará a A em sua interface pública, ponto no qual o pacote é descartado porque não há entrada correspondente na tabela de controle de conexão. / p>

Solução

Adicione a seguinte regra para garantir que a resposta atravesse o mesmo caminho da solicitação.

iptables -t nat -I POSTROUTING -s 1.2.3.4 -d 10.0.3.21 -o (interface of 10.0.3.1) -j SNAT --to 10.0.3.1
    
por 04.02.2013 / 04:20