Stavo facendo un esperimento sul bridge linux e la mia topologia di rete è come:
Come puoi vedere, ci sono due host situati in una LAN, Host1 (10.74.68.58) e Host2 (10.74.68.47). Su Host1, ho creato un ponte br0 e assegnato un IP per esso (192.168.3.101). Quindi ho attaccato eth0 al bridge:
[root@10.74.68.58:~] # bridge link
2: eth0 state UP : <BROADCAST,MULTICAST,PROMISC,UP,LOWER_UP> mtu 1500 master br0 state forwarding priority 32 cost 2
Ho impostato il percorso predefinito come br0 ed è ok per ping 10.74.68.47
:
[root@10.74.68.58:~] # ip r
default dev br0 scope link
172.17.0.0/16 dev docker0 proto kernel scope link src 172.17.42.1
192.168.3.0/24 dev br0 proto kernel scope link src 192.168.3.101
Ma le cose sono diventate inspiegabili quando ho impostato il percorso predefinito su eth0 :
[root@10.74.68.58:~] # ip r
default dev eth0 scope link
172.17.0.0/16 dev docker0 proto kernel scope link src 172.17.42.1
192.168.3.0/24 dev br0 proto kernel scope link src 192.168.3.101
Quando eth0 è l'interfaccia di route predefinita, provo a eseguire il ping di host2 in due modi diversi:
1, ping 10.74.68.47
Impossibile. Dopo aver controllato il file tcpdump (acquisito sull'interfaccia br0), ho scoperto che br0 ha ricevuto solo una risposta ARP. Quindi non ci sono informazioni ARP sull'interfaccia eth0, quindi non può ottenere il mac di host2. Penso che questo sia il comportamento giusto, la mia comprensione è giusta?
2, poi ho provato ping -I br0 10.74.68.47
Volevo usare l'opzione -I per evitare la rotta predefinita, ma ho anche fallito. Dopo aver verificato il file tcpdump (acquisito sull'interfaccia br0), ho scoperto che esiste già una coppia di richieste di eco echo e pacchetti di risposte echo. Questo mi ha confuso molto. Ora che br0 ha ricevuto la risposta echo, perché non riesco a eseguire il ping su host2 correttamente?
[root@10.74.68.58:~] # ping -I br0 10.74.68.47
2 packets transmitted, 0 received, 100% packet loss, time 1006ms
Ragazzi, potete darmi dei consigli?