roteamento multi-hop sem NAT

1

Comecei recentemente a jogar um pouco com iptables e roteamento e me deparei com o seguinte problema:

Eu tenho quatro servidores A, B, C, D com ip_forwarding habilitado e meu objetivo é simplesmente rotear as solicitações de eco icmp através da cadeia, mantendo o IP original. infelizmente, o encaminhamento não está funcionando corretamente.

(A = 192.168.0.1 = eth0) < --- > (B = 192.168.0.2 = eth0, 192.168.1.2 = eth1) < --- > (B = 192.168.1.3 = eth0, 192.168.2.3 = eth1) < --- > (D = 192.168.2.4 = eth0)

Além disso, tenho as seguintes rotas:

  • A: 192.168.2.4 através de 192.168.0.2
  • B: 192.168.2.4 através de 192.168.1.3
  • C: -
  • D: -

então minha intenção por trás desse exemplo de brinquedo era que as solicitações fossem roteadas pela cadeia de acordo com as rotas estáticas. Claro que eu sei que o ping não terá sucesso, porque o D & C não tem rotas para A. Mas minha intenção era simplesmente detectar o tráfego com o tcpdump.

Em geral, achei que os pacotes seriam simplesmente encaminhados pesquisando rotas na tabela de roteamento e depois enviados para o respectivo destino ou gateway. No entanto, sem usar o NAT, isso não parece funcionar. as solicitações icmp são recebidas por C em eth0, no entanto, C não as encaminha para D.

Claro que eu poderia usar algum masquerade / snat em B e (eu não testei isso), mas tenho certeza que D irá receber o pedido de B ("instead" of A).

Em geral, é possível executar o roteamento "multi-hop" sem usar o NAT? Ou há apenas algumas regras FORWARD do iptables em falta que me permitiriam fazer isso?

Existe alguma possibilidade de depurar / procurar o que o iptables faz com os pacotes? Atualmente, eu só encontrei o alvo LOG, mas para ser honesto, criar todas as regras duas vezes é realmente irritante ..

    
por douglas030 10.05.2018 / 19:27

1 resposta

1

O Linux implementa o encaminhamento / filtragem de caminho reverso do RFC1704 , e a maioria das distribuições o habilita por padrão. Isto é, permitir receber / encaminhar pacotes somente se o caminho reverso (como definido pela tabela de rotas) usasse a mesma interface de saída da interface em que o pacote veio (ou com o modo solto, se houver alguma interface que tenha uma rota para este pacote). É feito para proteger contra falsificação.

Para fazer testes em rotas assimétricas ou quando outras configurações não convencionais forem feitas, basta desativar rp_filter em ambas as interfaces envolvidas (+" todos ") em cada nó (aqui C e D são suficientes, outros têm suficiente rotas):

for i in /proc/sys/net/ipv4/conf/{eth[01],all}/rp_filter; do echo 0 > "$i"; done

Isso permite que o servidor D receba o icmp ping (mas é claro que não pode responder).

    
por 10.05.2018 / 23:48