Eu criei um par de dispositivos veth da seguinte forma no Ubuntu 16.04:
$ sudo ip link add veth1 type veth peer name veth2
$ sudo ip link set dev veth1 up
$ sudo ip link set dev veth2 up
$ sudo ip address add 10.0.10.50/24 dev veth1
$ sudo ip address add 10.0.10.51/24 dev veth2
O par de dispositivos veth está no mesmo namespace. Estou tentando testar o ping de um dispositivo veth para o outro. Então eu tento o ping da seguinte forma:
$ ping -I veth1 10.0.10.51
PING 10.0.10.51 (10.0.10.51) from 10.0.10.50 veth1: 56(84) bytes of data.
From 10.0.10.50 icmp_seq=1 Destination Host Unreachable
From 10.0.10.50 icmp_seq=2 Destination Host Unreachable
From 10.0.10.50 icmp_seq=3 Destination Host Unreachable
Quando eu faço check in wireshark trace para veth2, a solicitação ARP não obtém nenhuma resposta (trace semelhante também é observado para veth1):
Broadcast ARP 42 Who has 10.0.10.51? Tell 10.0.10.50
Eu quero perguntar por que veth2 não pode responder à solicitação ICMP quando está no mesmo namespace que veth1 ?
Atualização : Se eu tentar o ping da seguinte forma, recebo uma resposta ICMP, mas o wireshark não mostra nenhum rastreamento para os dispositivos veth1 e veth2.
$ ping -I 10.0.10.50 10.0.10.51
PING 10.0.10.51 (10.0.10.51) from 10.0.10.50 : 56(84) bytes of data.
64 bytes from 10.0.10.51: icmp_seq=1 ttl=64 time=0.016 ms
64 bytes from 10.0.10.51: icmp_seq=2 ttl=64 time=0.022 ms
Alguém pode explicar a diferença de resultado para os dois testes de ping?
Resposta parcial:
Para a segunda variante, faça a
tcpdump -ni lo
(ou use Wireshark), e você verá que a comunicação acontece na interface de loopback. Isso ocorre porque o kernel percebe que ambos os endereços são endereços locais e, portanto, usa a interface de loopback, não importa a qual interface esses endereços sejam atribuídos.Para a primeira variante, não sei exatamente por que a transmissão não é respondida, mas, em geral, o kernel considera a comunicação que sai de uma interface e aparece em outra interface como um erro de roteamento e a suprime. A transmissão pode passar porque é uma transmissão.
Com um esforço considerável, você pode ajustar isso para permitir um ping de bumerangue , mas isso não é particularmente útil normalmente.
Os pares eth virtuais realmente só fazem sentido se você os usar para conectar diferentes namespaces de rede. Da maneira como você os configura, eles são tão inúteis quanto ter duas placas Ethernet físicas diferentes no mesmo segmento de LAN.