Come connettere due interfaccie di rete nella stessa subnet?
Environment
- Red Hat Enterprise Linux 6
- Red Hat Enterprise Linux 5
- Interfacce di rete multiple, ciascuna con un indirizzo IP nella stessa subnet
Issue
- Come connettere due interfaccie di rete nella stessa subnet?
- Nel nostro ambiente, ci sono tre dispositivi bonding connessi con lo stesso segmento.
- Abbiamo catturato un packet e trovato quel packet, dovrebbe essere trasmesso dal bond0, ma è stato trasmesso dal bond1
- Inoltre è stato confermato che la porta di trasmissione è stata sfalsata anche se non ci sono impostazioni di bonding.
+---------------------+
| Linux |
| .168 .169 |
+-----+--------+------+
│ │
+-----+--------+------+
| Switch |
+---------+-----------+
│
+---------+-----------+
| .1 |
| Gateway |
+---------------------+
Resolution
Aggiunta di tabelle di routing e regole che vincolino la fonte di indirizzi IP per ogni percorso, e aggiunga questi come gateway di default per ogni interfaccia di rete.
Assumendo questo ambiente di rete :
+------------------------------------------+
| Linux |
| eth0 eth1 |
| 10.64.208.180 10.64.208.208 |
+------------------------------------------+
# ip addr show
2: eth0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP qlen 1000
inet 10.64.208.180/24 brd 10.65.211.255 scope global eth0
3: eth1: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP qlen 1000
inet 10.64.208.208/24 brd 10.65.211.255 scope global eth1
-
Aggiunta di nuove tabelle di routing in
/etc/iproute2/rt_tables
# cat /etc/iproute2/rt_tables 100 t1 101 t2
-
Aggiunta di percorsi a queste tabelle di routing
# ip route add 10.64.208.0/24 dev eth0 src 10.64.208.180 table t1 # ip route add table t1 default via 10.64.208.254 dev eth0 # ip route show table t1 10.64.208.0 dev eth0 scope link src 10.64.208.180 default via 10.64.208.254 dev eth0 # ip route add 10.64.208.0/24 dev eth1 src 10.64.208.208 table t2 # ip route add table t2 default via 10.64.208.254 dev eth1 # ip route show table t2 10.64.208.0 dev eth1 scope link src 10.64.208.208 default via 10.64.208.254 dev eth0
-
Aggiunta di regole da applicare il traffico alle tabelle di routing
# ip rule add table t1 from 10.64.208.180 # ip rule add table t2 from 10.64.208.208 # ip route show 10.64.208.0/24 dev eth0 proto kernel scope link src 10.64.208.180 10.64.208.0/24 dev eth1 proto kernel scope link src 10.64.208.208 169.254.0.0/16 dev eth1 scope link default via 10.64.208.254 dev eth0
-
Impostare interfacce pronte per ricevere le risposte ARP
# sysctl net.ipv4.conf.default.arp_filter=1
-
Controllare il ping con
-I IPADDR
# ping -I 10.64.208.180 DSTADDR
-
Per fare questo percorso persistente, i seguenti file di configurazione devono essere cambiati
-
Per indirizzi di rete e percorsi:
# cat /etc/sysconfig/network-scripts/ifcfg-eth* # ifcfg-eth0 DEVICE=eth0 BOOTPROTO=none ONBOOT=yes NETMASK=255.0.0.0 IPADDR=10.64.208.180 GATEWAY=10.64.208.254 TYPE=Ethernet # ifcfg-eth1 DEVICE=eth1 BOOTPROTO=none ONBOOT=yes NETMASK=255.0.0.0 IPADDR=10.64.208.208 GATEWAY=10.64.208.254 TYPE=Ethernet # cat /etc/sysconfig/network-scripts/route-eth* # route-eth0 10.0.0.0/8 dev eth0 src 10.64.208.180 table t1 default via 10.64.208.254 dev eth0 table t1 # route-eth1 10.0.0.0/8 dev eth1 src 10.64.208.208 table t2 default via 10.64.208.254 dev eth1 table t2
-
Per regole di routing:
# cat /etc/sysconfig/network-scripts/rule-eth* # rule-eth0 table t1 from 10.64.208.180 # rule-eth1 table t2 from 10.64.208.208
-
Per ricevere risposte ARP:
# grep arp_filter /etc/sysctl.conf net.ipv4.conf.all.arp_filter = 1 net.ipv4.conf.default.arp_filter = 1
-
Per inviare ARP:
# grep /etc/sysctl.conf net.ipv4.conf.all.arp_announce = 2 net.ipv4.conf.default.arp_announce = 2
-
Nota bene: Faccia riferimento a /usr/share/doc/kernel-doc-<version>/Documentation/networking/ip-sysctl.txt
per maggiori informazioni riguardo queste impostazioni.
Root Cause
- Quando ci sono due interfacce nella stessa subnet non c'è garanzia su quale interfaccia verrà usata per trasmettere traffico e che la macchina accetterà il traffico per entrambi gli IP su entrambe le interfacce.
- Questo perché in Linux l'indirizzo IP appartiene all'host e non è associato con l'interfaccia.
- Se Lei fa il ping con
-I DEV
, provando ad usare un'interfaccia determinata, non c'è garanzia che il pacchetto di risposta (se ce ne fosse almeno uno) torni con la stessa interfaccia, quindi il ping fatto con-I DEV
potrebbe non funzionare.
Diagnostic Steps
- Imposti il sistema con due interfacce nella stessa subnet.
- Faccia un ping su un target e catturi i pacchetti con
tcpdump
.
This solution is part of Red Hat’s fast-track publication program, providing a huge library of solutions that Red Hat engineers have created while supporting our customers. To give you the knowledge you need the instant it becomes available, these articles may be presented in a raw and unedited form.
Comments