iptables nat: Manuseia a cadeia OUTPUT através da cadeia PREROUTING / forward de OUTPUT para PREROUTING

3

Eu gostaria de manipular automaticamente os pacotes na cadeia OUTPUT da tabela NAT (que são gerados localmente) como se viessem de fora (via PREROUTING).

É possível usar um "forward all to PREROUTING" como fallback / last rule na cadeia OUTPUT?

Por exemplo, dado o seguinte encaminhamento de NAT:

iptables -t nat -A PREROUTING -p TCP -d $EXT.IP.ADD.RESS \
    --dport 80 -j DNAT --to-destination $INT.IP.ADD.RESS:80

Eu tenho que configurar uma regra de saída correspondente:

iptables -t nat -A OUTPUT -p TCP -d $EXT.IP.ADD.RESS \
    --dport 80 -j DNAT --to-destination $INT.IP.ADD.RESS:80

Ao registrar esses pacotes (via iptables -t nat -A OUTPUT -p TCP -d $EXT.IP.ADD.RESS -j LOG ), eles se parecem com:

IN= OUT=lo SRC=$EXT.IP.ADD.RESS DST=$EXT.IP.ADD.RESS LEN=60 \
    TOS=0x00 PREC=0x00 TTL=64 ID=22348 DF PROTO=TCP SPT=59425 \
    DPT=25 WINDOW=32792 RES=0x00 SYN URGP=0

Eu tentei algo como o seguinte, mas não funcionou:

iptables -t nat -A OUTPUT -p TCP -d $EXT.IP.ADD.RESS -j DNAT \
    --to $EXT.IP.ADD.RESS

Estou usando a macro / bloco a seguir agora para cada mapeamento de uma porta para uma máquina interna:

iptables -t nat -A PREROUTING -p TCP -d $EXT.IP.ADD.RESS --dport 25 \
    -j DNAT --to-destination 10.122.1.25:25
iptables -t nat -A OUTPUT -p TCP -d $EXT.IP.ADD.RESS --dport 25 \
    -j DNAT --to-destination 10.122.1.25:25
iptables -t nat -A POSTROUTING -p TCP -s 10.122.1.25 -d 10.122.1.25 --dport 25 \
    -j SNAT --to 10.122.1.1

10.122.1.1 é o firewall e 10.122.1.25 o container (servidor de e-mail).

Acabei de adicionar a última regra ("POSTROUTING") recentemente, o que permite que o contêiner alcance a si mesmo.

    
por blueyed 23.11.2010 / 00:19

2 respostas

3

Sim, isso é chamado NAT Loopback e exige que você SNAT seus pacotes gerados localmente para o seu IP externo. Isso fará com que seus pacotes retornem e passem pela cadeia de PREROUTING.

    
por 23.11.2010 / 19:09
0

O que você pretende realizar com a reinjeção de pacotes gerados localmente (não encaminhamento) para PREROUTING? Se você não gostar da redundância que tem lá, você pode criar uma nova cadeia definida pelo usuário, colocar a regra lá e chamar essa cadeia de PREROUTING e OUTPUT.

    
por 23.11.2010 / 00:56

Tags