O equivalente em DNAT e REDIRECT é aplicado ao tráfego destinado localmente?

6

Na configuração do nosso ambiente OpenStack, me deparei com um problema que impedia que as instâncias entrassem em contato com um servidor em execução no host. O serviço de metadados (que expõe uma API HTTP) é executado na porta 8775 no host, e o código de rede OpenStack adiciona a seguinte regra DNAT para conceder acesso por meio de um endereço especial na porta 80:

-A PREROUTING -d 169.254.169.254/32 
  -p tcp -m tcp --dport 80 -j DNAT --to-destination 127.0.0.1:8775 

Instâncias são conectadas ao host por meio de um dispositivo de ponte local e 169.254.169.254 é atribuído a lo .

Embora essa regra corresponda com êxito aos pacotes originados de uma instância guest tentando acessar http://169.254.168.254/ , eles nunca alcançam o serviço de escuta.

A substituição dessa regra DNAT por um REDIRECT amplamente equivalente faz tudo funcionar corretamente:

-A PREROUTING -d 169.254.169.254/32 
  -p tcp -m tcp --dport 80 -j REDIRECT --to-ports 8775 

Estou tentando entender por que o REDIRECT funciona e o DNAT falha. Não está claro na documentação do iptables se a regra DNAT deve ou não funcionar para o tráfego destinado localmente. Espero que alguém aqui possa fornecer uma resposta autoritativa, idealmente apoiada por documentação, ou possa sugerir o que pode estar errado na minha configuração que esteja impedindo que a regra DNAT funcione como esperado.

    
por larsks 20.06.2012 / 23:34

2 respostas

3

O que você está tentando fazer é explicitamente negado pelo kernel .

You can't send packets from non 127/8 addresses to 127/8. The kernel filters them out and drops them as it considers them "martians".

Isso presumivelmente acontece porque rp_filter está ativado. Possivelmente desativá-lo pode alterar esse comportamento (embora isso desative algumas proteções de segurança potencialmente cruciais).

Com o REDIRECT você não está mudando o IP, e é por isso que funciona. Em outras palavras, se você for usar o DNAT, pode enviá-lo para qualquer coisa fora de 127.0.0.0/8.

    
por 21.06.2012 / 00:15
2

De acordo com o netfilter NAT HOWTO :

There is a specialized case of Destination NAT called redirection: it is a simple convenience which is exactly equivalent to doing DNAT to the address of the incoming interface.

É um pouco mais inteligente, pois escolhe o endereço de destino DNAT como o endereço do dispositivo no qual o pacote foi recebido. No seu caso, ele DNAT os pacotes para o endereço no dispositivo de ponte, e não para 127.0.0.1.

    
por 21.06.2012 / 00:00