Warum läuft Linux-Netzwerkverkehr nur über eth0?


20

Ich habe zwei Netzwerkkarten auf der Serverseite, eth0? 192.168.8.140 und eth1? 192.168.8.142. Der Client sendet Daten an 192.168.8.142, und ich erwarte iftop, dass der Datenverkehr für eth1 angezeigt wird, dies ist jedoch nicht der Fall. Alle Netzwerke durchlaufen eth0. Wie kann ich die beiden Netzwerkkarten testen?

Warum läuft der gesamte Datenverkehr über eth0 anstelle von eth1? Ich habe erwartet, ich könnte 1 Gbit / s pro Schnittstelle bekommen. Was stimmt nicht mit meinem Setup oder meiner Konfiguration?

Server

ifconfig

eth0    Link encap:Ethernet  HWaddr 00:00:00:19:26:B0
        inet addr:192.168.8.140  Bcast:0.0.0.0  Mask:255.255.252.0
        inet6 addr: 0000::0000:0000:fe19:26b0/64 Scope:Link
        UP BROADCAST RUNNING MULTICAST  MTU:1500  Metric:1
        RX packets:45287446 errors:0 dropped:123343 overruns:2989 frame:0
        TX packets:3907747 errors:0 dropped:0 overruns:0 carrier:0
        collisions:0 txqueuelen:1000
        RX bytes:66881007720 (62.2 GiB)  TX bytes:261053436 (248.9 MiB)
        Memory:f7e00000-f7efffff

eth1    Link encap:Ethernet  HWaddr 00:00:00:19:26:B1
        inet addr:192.168.8.142  Bcast:0.0.0.0  Mask:255.255.255.255
        inet6 addr: 0000::0000:0000:fe19:26b1/64 Scope:Link
        UP BROADCAST RUNNING MULTICAST  MTU:1500  Metric:1
        RX packets:19358 errors:0 dropped:511 overruns:0 frame:0
        TX packets:14 errors:0 dropped:0 overruns:0 carrier:0
        collisions:0 txqueuelen:1000
        RX bytes:1772275 (1.6 MiB)  TX bytes:1068 (1.0 KiB)
        Memory:f7c00000-f7cfffff

Serverseite

# Listen for incomming from 192.168.8.142
nc -v -v -n -k -l 192.168.8.142 8000 | pv > /dev/null
Listening on [192.168.8.142] (family 0, port 8000)
Connection from 192.168.8.135 58785 received!

Klient

# Send to 192.168.8.142
time yes | pv |nc -s 192.168.8.135 -4 -v -v -n 192.168.8.142 8000 >/dev/null
Connection to 192.168.8.142 8000 port [tcp/*] succeeded!

Serverseite

$ iftop -i eth0
interface: eth0
IP address is: 192.168.8.140

TX:             cumm:  6.34MB   peak: 2.31Mb   rates: 2.15Mb  2.18Mb  2.11Mb
RX:                    2.55GB          955Mb           874Mb   892Mb   872Mb
TOTAL:                 2.56GB          958Mb           877Mb   895Mb   874Mb

$ iftop -i eth1
interface: eth1
IP address is: 192.168.8.142

TX:             cumm:      0B   peak:     0b   rates:     0b      0b      0b
RX:                    4.51KB         3.49Kb          3.49Kb  2.93Kb  2.25Kb
TOTAL:                 4.51KB         3.49Kb          3.49Kb  2.93Kb  2.25Kb

$ ip link show eth0
2: eth0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc mq state UP mode DEFAULT group default qlen 1000
    link/ether 00:00:00:19:26:b0 brd ff:ff:ff:ff:ff:ff
$ ip link show eth1
3: eth1: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc mq state UP mode DEFAULT group default qlen 1000
    link/ether 00:00:00:19:26:b1 brd ff:ff:ff:ff:ff:ff

1
Es hört sich so an, als ob Sie wirklich nach Interface-Bonding suchen: wiki.linuxfoundation.org/networking/bonding
Flexo

@flexo hat vollkommen recht - abhängig von Ihrem endgültigen Ziel kann das Verbinden der beiden Netzwerkschnittstellen zu einer größeren Gesamtbandbreite führen, die Verbindungsoptionen variieren jedoch. Das Beste, was Sie bekommen können, sind 2 Streams mit ~ 1 Gbit und nicht 1 Stream mit 2 Gbit. Außerdem benötigen Sie die Dienste eines verwalteten Ethernet-Switch. Ebenso könnte Bonding 4 4x 1 Gbit Flows auf einmal ergeben.
Criggie

Antworten:


32

Es gibt zwei mögliche Entwurfsmodelle für einen TCP / IP-Netzwerkstapel: ein starkes Hostmodell und ein schwaches Hostmodell. Sie erwarten ein Verhalten, das dem starken Hostmodell entspricht. Linux ist so konzipiert, dass es das schwache Hostmodell verwendet. Im Allgemeinen tritt das schwache Hostmodell häufiger auf, da es die Komplexität des Routing-Codes verringert und somit möglicherweise eine bessere Leistung bietet. Ansonsten sind die beiden Host-Modelle nur unterschiedliche Konstruktionsprinzipien: keines ist von Natur aus besser als das andere.

Grundsätzlich bedeutet das schwache Hostmodell, dass ausgehender Datenverkehr unabhängig von der Quell-IP über die erste in der Routing-Tabelle aufgeführte Schnittstelle gesendet wird, die der IP-Adresse des Ziels (oder des ausgewählten Gateways, wenn das Ziel nicht direkt erreichbar ist) entspricht Adresse .

Aus diesem Grund ist es im Allgemeinen nicht ratsam, zwei separate physische Schnittstellen zu verwenden, wenn Sie zwei IP-Adressen im selben Netzwerksegment benötigen. Weisen Sie stattdessen zwei IP-Adressen für eine Schnittstelle zu (IP-Aliase: z. B. eth1 = 192.168.8.142 und eth1: 0 = 192.168.8.140). Wenn Sie mehr Bandbreite benötigen, als eine einzelne Schnittstelle zur Verfügung stellen kann, verbinden (oder teamen, falls zutreffend) Sie zwei oder mehr Schnittstellen miteinander und führen dann beide IPs für die Verbindung / das Team aus.

Indem Sie eine Reihe von sysctl-Einstellungen anpassen und die "Advanced Routing" -Funktionalität verwenden, um unabhängige Routing-Tabellen für jede Netzwerkkarte einzurichten, können Sie Linux dazu bringen, sich wie ein System mit starkem Host-Modell zu verhalten. Aber das ist eine sehr spezielle Konfiguration, und ich würde empfehlen, vor der Implementierung zweimal darüber nachzudenken.

Siehe die Antworten unter Linux Source Routing, Strong End System Model / Strong Host Model? wenn du es wirklich brauchst.


Der Standardmodus ist auch eine böse Überraschung, wenn versucht wird, den Datenverkehr mit iptables zu formen :)
Rackandboneman

Ja, ich hatte in der Vergangenheit Spaß daran, das starke Host-Modell zu implementieren. Es war für dieses Projekt erforderlich, aber ich würde nicht die Mühe machen, diese Kopfschmerzen für eine persönliche Maschine durchzugehen.
Baldrickk

11

Ein weiterer zu berücksichtigender Punkt ist, dass die eth1-Schnittstelle mit einer Subnetzmaske von 255.255.255.255 konfiguriert ist.

Dies bedeutet, dass die eth1-Schnittstelle so konfiguriert ist, dass sie keine anderen Geräte (Hosts) auf ihrer Netzwerkschnittstelle erwartet. Dies bedeutet, dass es nicht mit Ihrem 192.168.8.142-Client kommunizieren kann.


2

Nach langem Suchen habe ich herausgefunden, warum netcat nicht die richtige Schnittstelle für die IP verwendet. , und das ist das gleiche Problem. Wie @telcoM sagte, wird ausgehender Datenverkehr an die erste Schnittstelle gesendet, und das ist das Problem. Der einfachste Weg, dies zu lösen, ist:

ip route add default via 192.168.8.142 dev eth1 table 142
ip rule add from 192.168.8.142 table 142

Diese Route gibt ip route get 192.168.8.135 from 192.168.8.142eth1 anstelle von eth0 zurück. Dann funktioniert alles wie erwartet.


3
Wenn Sie die in der Frage, auf die ich mich bezog, erwähnten ARP sysctl-Einstellungen weglassen und sich mit Switches und Routern der Enterprise-Klasse befassen, ist Ihr Netzwerkadministrator ein wenig unzufrieden, wenn Sie unnötige "IP-Adress-Flapping" -Nachrichten am Router verursachen Das System kann weiterhin auf ARP-Anforderungen für beide IPs an beiden Schnittstellen antworten. Wenn Sie über einen IP-Hijacking-Schutz im Netzwerk verfügen, wird möglicherweise der gesamte Datenverkehr auf Ihrem System aktiviert und deaktiviert.
telcoM
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.