Diferença entre DNAT e REDIRECT em IPTABLES

14

Ok, pode ser porque eu sou densa ou talvez não esteja encontrando a fonte certa, mas não consigo entender por que uma dessas configurações do IPTABLES seria melhor que a outra.

Aqui está a minha configuração:

Eu tenho uma caixa que está servindo como um proxy transparente e um roteador ou classificação. Ele possui duas interfaces, ETH0 e ETH1, e o seguinte esquema de endereço:

ETH0 = DHCP ETH1 = 192.168.5.1/24 servindo DHCP para a rede 192.168.5.0/24 para clientes atrás dela na LAN

Eu tenho o privoxy instalado e escutando na porta 8080 como um proxy transparente. O que estou realizando com essa configuração é poder soltar essa caixa em uma rede existente com configuração mínima e clientes conectados ao proxy.

Aqui está o meu arquivo IPTABLES original

*nat
-A PREROUTING -i eth1 -p tcp -m tcp --dport 80 -j REDIRECT --to-port 8080
-A POSTROUTING -o eth0 -j MASQUERADE
COMMIT
*filter
COMMIT

Essa configuração funciona bem e o tráfego flui para frente e para trás sem problemas. Recebo o endereço IP dos clientes de origem nos arquivos de log privoxy, e a vida é boa.

Minha confusão surge quando começo a olhar para as configurações de outras pessoas e vejo que elas estão usando DNAT em vez de REDIRECT, e estou tentando entender o verdadeiro benefício de uma sobre a outra. Aqui está um exemplo de configuração:

*nat
-A PREROUTING -i eth1 -p tcp -m tcp --dport 80 -j DNAT --to 192.168.5.1:8080
-A POSTROUTING -o eth0 -j MASQUERADE
COMMIT
*filter
COMMIT

Novamente, essa configuração também funciona e me fornece tudo o que preciso da perspectiva de log ...

Qual é o certo, ou talvez MAIS certo, do que o outro?

Obrigado por reservar um tempo para ler até aqui ...

QWade
fonte

Respostas:

14

REDIRECTaltera o endereço IP de destino para enviar para a própria máquina. Em outras palavras, os pacotes gerados localmente são mapeados para o endereço 127.0.0.1. É para redirecionar pacotes locais. Se você deseja apenas redirecionar o tráfego entre serviços na máquina local, será uma boa escolha.

DNATé a tradução real do endereço de rede . Se você deseja que os pacotes destinados fora do sistema local tenham o destino alterado, é a melhor escolha dos dois, pois REDIRECTnão funcionará.

Warner
fonte
ok, então se eu tenho um cliente atrás do proxy, digamos 192.168.5.234, e quero "processar" suas solicitações HTTP através do proxy 192.168.5.1, você está sugerindo que eu deveria fazer o tráfego da porta de saída DNAT 80 para 192.168 .5.1: 8080 no proxy. Eu posso comprar isso, mas POR QUE ???? Tem algo a ver com a forma como o tráfego é tratado depois que o ETH0 do proxy está saindo pelo gateway padrão da Internet? Eu preciso Grokar isso ou a minha cabeça vai explodir
QWade
2
O DNAT altera o endereço à medida que o pacote passa pelo firewall para chegar ao host desejado e, ao contrário, parece ter vindo do firewall. O DNAT quase nunca se aplica ao tráfego de saída, tratado pela regra MASQUERADE. Se o privproxy estivesse em outro host, o DNAT seria apropriado, com uma exceção apropriada para esse host.
BillThor
Bill, obrigado. É para onde meu cérebro reptiliano estava indo, mas é sempre bom ter validação. Portanto, se eu enviar um pacote destinado ao google.com a partir de 192.168.5.234 e ele tiver seu gw padrão definido como 192.168.5.1 (eth1 no proxy), devo "REDIRECIONAR" esse pacote para a porta 8080 no proxy e deixar o privoxy o resto. A razão para isso é porque o privoxy vive em 192.168.5.1 e não em outro host. Estou fumando algo que não deveria?
QWade 8/09/10
9

REDIRECTaltera o endereço IP de destino a ser enviado para a máquina, conforme respondido por Warner @. Mas eu diria que a resposta não é totalmente correta ou um pouco enganadora.

REDIRECTnão é apenas para redirecionar pacotes locais. É realmente DNATem que o endereço IP de destino a ser usado está implícito, 127.0.0.1 se for um pacote local ou o endereço IP da interface da máquina, caso contrário, 192.168.5.1 no caso do OP.

Portanto, nesta questão, não importa qual seja o destino final, os pacotes devem primeiro alcançar o proxy, portanto, REDIRECTé perfeitamente adequado.

Como REDIRECTvocê não precisa especificar o endereço IP, ele será o correto, mas ele terá algumas vantagens DNAT:

  • Se o endereço IP da máquina for alterado por algum motivo, você não precisará modificar suas regras e, em particular DNAT, não funcionará para interfaces controladas por DHCP.

  • Você pode escrever e manter as mesmas regras para vários sistemas (várias instâncias de proxy, por exemplo) sem manter versões ligeiramente diferentes devido aos endereços IP específicos.

Julio Diez
fonte
de alguma forma, como snat / mascarada.
Jichao
@Hod, eu ouvi dizer que REDIRECT é um caso especial do DNAT, mas eu uso REDIRECT e o TOR conhece o destino real de um pacote, então concluo que o daddr e o dport das estruturas iphdr e tcphdr estão intactos, e o pacote acabou de retornar ao destino REDIRECT por núcleo. O DNAT realmente modificará as estruturas. Estou errado?
wick