iptables pode eliminar tráfego, mas não pode redirecionar

1

Suponha que os pacotes TCP sejam enviados para o ip de destino (dest_ip) e possam ser eliminados pelo seguinte comando:

iptables -A INPUT -d dest_ip -p tcp -j DROP

Mas quando eu tento redirecionar o pacote usando o iptables NAT para um ip diferente (diff_ip), o pacote ainda chega ao destino antigo (dest_ip):

iptables -t nat -A PREROUTING -d dest_ip -p tcp -j DNAT --to-destination diff_ip

Existe algo sobre o iptables que eu não entendo muito bem aqui, já que estou esperando que o pacote não alcance mais o dest_ip. Alguém pode por favor explicar por que isso é assim? Obrigado.

Informações adicionais que podem ser relevantes:
/ proc / sys / net / ipv4 / ip_forward já está definido como 1
ifconfig mostra duas interfaces: eth0 e lo; dest_ip está em eth0 e diff_ip é um ip remoto

UPDATE 1: testes adicionais usando o telnet

Um ouvinte usando socat é estabelecido em 12800 para receber a mensagem telnet:

socat -u TCP-LISTEN:12800,reuseaddr,keepalive,reuseaddr OPEN:/tmp/output.txt,creat,append

A conexão Telnet é feita com mensagens aleatórias:

telnet 127.0.0.1 12800

1) teste usando:

iptables -A INPUT -p tcp --dport 12800 -j DROP

resultado: todas as mensagens do telnet são descartadas conforme confirmado pelo contador:

iptables -L INPUT -v -n

Chain INPUT (policy ACCEPT 0 packets, 0 bytes)
 pkts bytes target     prot opt in     out     source               destination         
    2   120 DROP       tcp  --  *      *       0.0.0.0/0            0.0.0.0/0            tcp dpt:12800

2) teste usando:

iptables -t nat -A PREROUTING -p tcp --dport 12800 -j DNAT --to-destination remote_ip

resultado: todas as mensagens chegam na porta 12800 sem serem redirecionadas, o que é confirmado pelo contador:

iptables -L PREROUTING -t nat -v -n

Chain PREROUTING (policy ACCEPT 0 packets, 0 bytes)
 pkts bytes target     prot opt in     out     source               destination         
    0     0 DNAT       tcp  --  *      *       0.0.0.0/0            0.0.0.0/0            tcp dpt:12800 to:remote_ip

ATUALIZAÇÃO 2: teste adicional usando telnet (veja acima) mas com regras iptables na cadeia OUTPUT:

iptables -t nat -A OUTPUT -p tcp --dport 12800 -j DNAT --to-destination remote_ip

resultado: todas as mensagens são redirecionadas com sucesso, conforme confirmado pelo contador:

iptables -L OUTPUT -t nat -v -n

Chain OUTPUT (policy ACCEPT 0 packets, 0 bytes)
 pkts bytes target     prot opt in     out     source               destination         
    3   180 DNAT       tcp  --  *      *       0.0.0.0/0            0.0.0.0/0            tcp dpt:12800 to:remote_ip

Isso está começando a fazer sentido, já que o telnet é um processo local e sua saída deve ir diretamente para a cadeia OUTPUT. No entanto, isso levanta outra questão: de acordo com a atualização 1, as mensagens telnet também podem ser descartadas na cadeia INPUT, então, como exatamente os pacotes estão viajando? SAÍDA - > INPUT?

    
por tonytz 26.04.2013 / 06:49

1 resposta

0

Todos os seus testes apontaram algo que você deveria ter descoberto. Ao lidar com o Netfilter / iptables, você não pode construir suas regras com sucesso sem ter o fluxo de pacotes em mente.

Como você pode ver, um processo local nunca passa pela cadeia PREROUTING , mas apenas OUTPUT e POSTROUTING . É por isso que o processo telnet é redirecionado quando você coloca sua regra em OUTPUT , mas não quando você a coloca em PREROTUING . No entanto, esta regra é adequada para um pacote externo que atravessa sua máquina.

    
por 28.04.2013 / 18:52

Tags