Mehrere physische Schnittstellen mit IPs im selben Subnetz

13

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 eth1die Adresse des Empfängers erfolgreich anpingen. (zB von einem zweiten Computer auf dem gleichen Switch, 192.168.123.1antwortet 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)

frustrierter_tester
quelle
Können Sie die Routing-Tabelle posten?
Ponsfonze
2
Was ist Ihr Ziel beim Erstellen dieser Konfiguration? Was versuchst du zu erreichen?
David Schwartz
Auf diese Weise liegt der Wahnsinn.
Sirex
Wenn Sie diese Schnittstellen verbinden möchten, müssen Sie sie tatsächlich verbinden.
Resmon6
1
@DavidSchwartz Nein, der Computer soll nicht wie ein Switch (oder Router) funktionieren. Stellen Sie sich vor, Sie führen 8 virtuelle Maschinen mit einer dedizierten physischen Netzwerkkarte für jede VM aus ( Hinweis: Ich verwende keine VMs, dies ist nur eine Analogie ). Aus der Sicht einer anderen Box im selben Netzwerk sollte mein einzelner PC absolut nicht von acht separaten PCs zu unterscheiden sein.
frustrated_tester

Antworten:

17

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:

  1. Konfigurieren Sie auf allen Schnittstellen arp_filter = 1 und arp_ignore = 2.

  2. Fügen Sie ein schnittstellenbasiertes, quellbasiertes Routing für ausgehenden Datenverkehr hinzu. (Die Zielschnittstelle muss basierend auf der Quelladresse ausgewählt werden.)

  3. 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.

David Schwartz
quelle
6

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.

Be2eB
quelle
AFAIK, das sollte eigentlich die richtige Antwort für Linux sein. Linux umgeht viele der in Davids Antwort genannten Probleme durch die Verwendung von Bridge-Geräten (auch bekannt als Vermeidung von L3-Problemen durch den Aufbau eines besseren logischen L2-Netzwerks).
Dave
4

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.

Bahamat
quelle
4

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.

Skaperen
quelle
Ressourcen lesen: Unix-Netzwerkprogrammierung: Die Sockets Networking-API von Stevens, Fenner und Rudoff. Siehe auch RFC1122 und RFC4907.
Skaperen
0

Ja, es ist möglich, dem Vorschlag von David Schwartz zu folgen:

echo -ne 0 > /proc/sys/net/ipv4/conf/all/rp_filter
echo -ne 0 > /proc/sys/net/ipv4/conf/eth0/rp_filter
echo -ne 0 > /proc/sys/net/ipv4/conf/eth3/rp_filter

// Für eine ordnungsgemäße Funktionalität, dh ARP antwortet von eth1 und wird generiert, wenn sich eth0 und eth1 im selben Subnetz befinden

echo -ne 0 > /proc/sys/net/ipv4/conf/all/arp_filter
echo -ne 2 > /proc/sys/net/ipv4/conf/all/arp_ignore
echo -ne 0 > /proc/sys/net/ipv4/conf/eth0/arp_filter
echo -ne 2 > /proc/sys/net/ipv4/conf/eth0/arp_ignore
echo -ne 0 > /proc/sys/net/ipv4/conf/eth1/arp_filter
echo -ne 2 > /proc/sys/net/ipv4/conf/eth1/arp_ignore

//Create a table called "new_rt_table" and create a routing rule that says any packet with a mark equal to '1' gets routed according to the "new_rt_table"(can name it whatever you want) table. The file /etc/iproute2/rt_tables is the only source of table names on the system. Internally, routing tables have integer identifiers.

echo 1 new_rt_table >> /etc/iproute2/rt_tables
ip rule add from all fwmark 1 table new_rt_table

// Richten Sie die Tabelle "new_rt_table" ein, um die Pakete über eth1 weiterzuleiten

ip route add default dev eth1 table new_rt_table
ip route show table new_rt_table

// Pakete markieren, damit 'ip route' sie durch eth1 routen kann

iptables -F -t mangle
iptables -t mangle -I OUTPUT -s <ip addr of eth1> -o eth0 -j MARK --set-mark 1

// 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.

Noel Av
quelle