Ich habe eine Linux-Box mit 9 Netzwerkkarten und möchte, dass acht davon eindeutige Adressen im selben Subnetz haben, z.
ifconfig eth1 192.168.123.1 netmask 255.255.0.0
ifconfig eth2 192.168.123.2 netmask 255.255.0.0
ifconfig eth3 192.168.123.3 netmask 255.255.0.0
...
ifconfig eth8 192.168.123.8 netmask 255.255.0.0
Das standardmäßige ARP-Verhalten ist in diesem Fall äußerst kontraproduktiv, da es dazu führt, dass der gesamte Datenverkehr für alle IP-Adressen ausschließlich durchlaufen wird eth1
, was ziemlich genau das Gegenteil von dem ist, was ich möchte.
Also habe ich mich umgesehen und am Ende ein paar Änderungen an sysctl vorgenommen:
net.ipv4.conf.all.arp_filter=1
net.ipv4.conf.all.arp_ignore=1
net.ipv4.conf.all.arp_announce=2
Das verhinderte eth1
, dass ich mich als alle anderen ausgeben konnte, aber ich kann immer noch nichts anderes als eth1
die Adresse des Empfängers erfolgreich anpingen. (zB von einem zweiten Computer auf dem gleichen Switch, 192.168.123.1
antwortet nur auf Ping)
Ich vermute, dass ich etwas mit Arptables oder iproute oder ETWAS machen muss, aber ich bin auf diesem Gebiet auf See verloren.
Bonuspunkte: Die Lösung muss mit Linux 2.6.27.27 kompatibel sein. (Genauer gesagt, Slax 6.1.2)
quelle
Antworten:
Sie benötigen ein starkes Endsystemmodell . Linux basiert im Wesentlichen auf einem schwachen Sendesystemmodell, daher ist es für diese Anwendung keine gute Wahl für das Betriebssystem.
Sie müssen jedes Teil des Verhaltens vortäuschen, das Sie benötigen, von ARP über Richtlinienweiterleitung bis hin zur Auswahl der Quelladresse. Sie benötigen auch Filter, um zu verhindern, dass Pakete akzeptiert werden, wenn sie auf der falschen Schnittstelle ankommen.
Die definitiv notwendigen Schritte sind:
Konfigurieren Sie auf allen Schnittstellen arp_filter = 1 und arp_ignore = 2.
Fügen Sie ein schnittstellenbasiertes, quellbasiertes Routing für ausgehenden Datenverkehr hinzu. (Die Zielschnittstelle muss basierend auf der Quelladresse ausgewählt werden.)
Fügen Sie die Eingangsfilterung für die einzelnen Schnittstellen hinzu, um auf der falschen Schnittstelle empfangene Pakete stillschweigend zu verwerfen. (Pakete mit einer Zieladresse, die einer anderen Schnittstelle zugewiesen wurde.)
Leider besteht kein Konsens darüber, ob diese drei Schritte alles sind, was benötigt wird. Das schwache Systemmodell ist in den gesamten Linux-TCP / IP-Stack integriert, und es ist nicht klar, was bei subtilen Problemen wie Multicast schief gehen könnte.
Es ist nicht klar, wie Sie beispielsweise die Ausgabeschnittstelle für Broadcasts auswählen würden. Sollte es alle von ihnen ausgehen? Könnte sein. Was ist das richtige Verhalten, wenn der Stack ein ausgehendes Broadcast mit einer Quelladresse erhält, die keiner der Schnittstellen zugewiesen ist?
Auch hier haben Sie das falsche Werkzeug für den Job ausgewählt.
quelle
Sie möchten mit größerer Wahrscheinlichkeit eine Bridge mit den 8/9-Schnittstellen erstellen und dieser Bridge dann eine IP-Adresse zuweisen (Bridge-Utils-Paket, Befehl 'brctl add').
Auf diese Weise fungiert die Bridge als Switch und kann eine IP-Adresse in Ihrem Subnetz haben.
quelle
Ich würde empfehlen, die physischen Schnittstellen zu verbinden und dann alle Adressen auf der einzelnen verbundenen Schnittstelle zu konfigurieren.
Sie benötigen auch Unterstützung für den Switch.
Hier ist ein Mini-Tutorial , mit dem Sie loslegen können.
quelle
Anscheinend möchten Sie eine Testumgebung, die 9 verschiedenen Computern entspricht, und haben angenommen, dass 9 Schnittstellen auf einem Computer dies emulieren könnten. Unter Linux kann dies aus den von David Schwartz beschriebenen Gründen einfach nicht über einen einzelnen Stack erfolgen. BTDT und haben die Narben. Es war schon schlimm genug mit 2 Schnittstellen.
Eine bessere Lösung könnte darin bestehen, 8 oder 9 separate virtuelle Maschinen auf einem Host auszuführen und 8 oder 9 Schnittstellen zu diesen virtuellen Maschinen zu überbrücken.
quelle
Ja, es ist möglich, dem Vorschlag von David Schwartz zu folgen:
// Für eine ordnungsgemäße Funktionalität, dh ARP antwortet von eth1 und wird generiert, wenn sich eth0 und eth1 im selben Subnetz befinden
// Richten Sie die Tabelle "new_rt_table" ein, um die Pakete über eth1 weiterzuleiten
// Pakete markieren, damit 'ip route' sie durch eth1 routen kann
// Unterstützung für mehrere Routing-Tabellen in der Kernel-Konfiguration aktivieren.
Kernel-Konfiguration
→ Netzwerkunterstützung → Netzwerkoptionen
[*] IP: Fortgeschrittener Router
[*] IP: Richtlinienweiterleitung
CONFIG_IP_ADVANCED_ROUTER
CONFIG_IP_MULTIPLE_TABLES
// Die obigen Schritte leiten Pakete um, die von eth0 ausgegeben werden sollen, um eth1 ordnungsgemäß zu verlassen.
Schlagen Sie bitte andere Methoden vor, wenn irgendjemand es zum Laufen bringt.
quelle