
Ich habe eine Dual-Port-Ethernet-Netzwerkkarte und habe beispielsweise beide Ports in einer Schleife verbunden und den beiden Ethernet-Schnittstellen die folgenden IPs zugewiesen:
- eth2 -> 192.168.2.1
- eth3 -> 192.168.3.1
Ich möchte Datenverkehr von einem der Ports über das physische Netzwerk an den anderen senden, z. B. Ping 192.168.3.1
von 192.168.2.1
. Der TCP/IP-Stapel im Linux-Kernel erkennt jedoch, dass diese beiden Adressen lokal sind, und sendet den Datenverkehr stattdessen an den Loopback-Adapter, sodass der Datenverkehr nie das physische Netzwerk erreicht.
Die beste Lösung für mich ist AnastasovsAn mich selbst senden-Patch, das leider seit Kernel 3.6 nicht mehr unterstützt wird, sodass es bei mir unter Ubuntu 13.10 (Kernel 3.11) nicht funktioniert. Ich habe versucht, den Patch für 3.11 neu zu schreiben, kann dies jedoch in der Ubuntu-Distribution nicht finden:
- include/linux/inetdevice.h
- net/ipv4/devinet.c
- net/ipv4/fib_frontend.c
- net/ipv4/route.c
- Dokumentation/Netzwerk/ip-sysctl.txt
Gibt es eine Möglichkeit, den Send-to-self-Patch zum Laufen zu bringen, oder eine alternative Lösung?
Antwort1
Erstellen Sie einen Netzwerk-Namespace und verschieben Sie eine der Schnittstellen dorthin:
ip netns add test
ip link set eth1 netns test
Starten Sie eine Shell im neuen Namespace:
ip netns exec test bash
Fahren Sie dann fort, als hätten Sie zwei Maschinen. Wenn Sie fertig sind, beenden Sie die Shell und löschen Sie den Namespace:
ip netns del test
Antwort2
Ich habe das noch nicht ausprobiert, aber ich vermute, dass es mehrere Möglichkeiten zur Problemumgehung gibt:
virtuelle Maschinen
Lösen Sie das IP-Stack-Problem, indem Sie mindestens eine der Netzwerkkarten vom IP-Stack des Hosts trennen: Weisen Sie sie einer virtuellen Maschine zu. Für Leistungstests ist dies jedoch möglicherweise nicht wünschenswert. Wenn jedoch genügend CPU-Leistung vorhanden ist, wird die zusätzliche Softwareschicht möglicherweise nicht zum Flaschenhals (aber woher wissen Sie das?).
unterschiedliche Zieladressen
Ich schätze, Sie möchten das Paket nur für einen NIC-Leistungstest auf Schicht 2 übertragen. Sie können also IP-Pakete mit einer anderen IP-Adresse verwenden (einer nicht lokalen, damit die Pakete in jedem Fall über das Kabel gesendet werden). Und dann schummeln Sie: Sie ip neigh
erstellen einen permanenten ARP-Eintrag, der diese gefälschte IP-Adresse der MAC-Adresse der anderen NICs zuordnet.
Auf diese Weise könnten Sie sogar IP-Verbindungen herstellen. Dazu müssten Sie jedoch iptables
mit SNAT
und verwenden DNAT
, damit beide Netzwerkkarten glauben, sie würden mit einer der beiden erforderlichen gefälschten IPs kommunizieren.
Rohzugriff
Wenn Sie bereit sind, etwas nicht triviale Programmierung durchzuführen, können Sie Raw Sockets öffnen und die Ethernet-Frames selbst erstellen. Dies ist wahrscheinlich die schnellste Lösung.