Force Loopback UDP sobre o fio

1

Estou tentando configurar um pequeno programa de loopback em python para enviar pacotes UDP de uma interface para outra. Sem modificar o iptables, o kernel apenas provocará um curto-circuito em qualquer comunicação e o enviará diretamente para uma interface específica sem nunca passar pelo fio. Usando o seguinte, consegui que os pings viajassem pela rede (de esta postagem ), mas não sei ao certo como para fazer com que o UDP faça a mesma coisa.

ifconfig eth2 10.50.0.1/24
ifconfig eth3 10.50.1.1/24

# nat source IP 10.50.0.1 -> 10.60.0.1 when going to 10.60.1.1
iptables -t nat -A POSTROUTING -s 10.50.0.1 -d 10.60.1.1 -j SNAT --to-source 10.60.0.1

# nat inbound 10.60.0.1 -> 10.50.0.1
iptables -t nat -A PREROUTING -d 10.60.0.1 -j DNAT --to-destination 10.50.0.1

# nat source IP 10.50.1.1 -> 10.60.1.1 when going to 10.60.0.1
iptables -t nat -A POSTROUTING -s 10.50.1.1 -d 10.60.0.1 -j SNAT --to-source 10.60.1.1

# nat inbound 10.60.1.1 -> 10.50.1.1
iptables -t nat -A PREROUTING -d 10.60.1.1 -j DNAT --to-destination 10.50.1.1

ip route add 10.60.1.1 dev eth2
arp -i eth2 -s 10.60.1.1 00:1B:21:C1:F6:0F # eth3's mac address

ip route add 10.60.0.1 dev eth3 
arp -i eth3 -s 10.60.0.1 00:1B:21:C1:F6:0E # eth2's mac address

ping 10.60.1.1

Gostaria que tp pudesse transmitir uma mensagem UDP em 10.50.0.1 e ler em 10.50.1.1

Como posso fazer isso?

    
por Tyler 24.01.2018 / 17:27

1 resposta

0

Não é uma resposta completa porque, no momento, estou no celular, mas isso também é muito longo para um comentário:

Por padrão, todas as NICs são gerenciadas por uma única pilha IP no kernel do Linux e, por causa disso, o kernel “sabe” que o tráfego do endereço IP 10.50.0.1 na eth2 para 10.50.1.1 não precisa ser enviado para o roteador na sub-rede 10.50.0.0/24 e irá ignorar esse roteamento completamente e enviá-lo diretamente para a eth3.

Geralmente essa é a coisa mais inteligente a fazer, já que isso praticamente não fornecerá latência e muito mais largura de banda do que as velocidades reais de fio da eth2 e eth3 e do (s) roteador (s) intermediário (s).

Você pode evitar isso configurando instruções específicas de roteamento, o que parece ser o que você está tentando com o iptables, mas, sem dúvida, uma solução melhor é fazer uso de namespaces de rede. Atribuindo cada NIC a um namespace diferente, o kernel do Linux não tratará mais o tráfego de eth2 para eth3 como local e, em vez de simplesmente enviar os pacotes apenas na memória de 10.50.0.1 para 10.50.1.1, eles vão sair na linha.

    
por 24.01.2018 / 20:18

Tags