Translated message

A translation of this page exists in English.

Warning message

This translation is outdated. For the most up-to-date information, please refer to the English version.

Come connettere due interfaccie di rete nella stessa subnet?

Solution Verified - Updated -

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.