Frage Zwei Netzwerkschnittstellen und zwei IP-Adressen im selben Subnetz in Linux


Ich bin kürzlich in eine Situation geraten, in der ich zwei IP-Adressen in demselben Subnetz benötigte, das einem Linux-Host zugewiesen war, so dass wir zwei SSL / TLS-Sites ausführen konnten. Mein erster Ansatz war die Verwendung von IP-Aliasing, z. mit eth0: 0, eth0: 1, etc, aber unsere Netzwerkadministratoren haben einige ziemlich strenge Einstellungen für die Sicherheit, die diese Idee zerquetscht:

  1. Sie verwenden DHCP-Snooping und erlauben normalerweise keine statischen IP-Adressen. Die statische Adressierung erfolgt über statische DHCP-Einträge, so dass die gleiche MAC-Adresse immer die gleiche IP-Adresse erhält. Diese Funktion kann per Switchport deaktiviert werden, wenn Sie fragen, und Sie haben einen Grund dafür (zum Glück habe ich eine gute Beziehung zu den Netzwerk-Jungs und das ist nicht schwer zu tun).
  2. Da das DHCP-Snooping auf dem Switchport deaktiviert war, mussten sie eine Regel auf den Switch schreiben, die besagt, dass die MAC-Adresse X die IP-Adresse Y haben darf. Leider hatte dies den Nebeneffekt, dass die MAC-Adresse X NUR erlaubt ist IP-Adresse Y. IP-Aliasing erforderte, dass der MAC-Adresse X zwei IP-Adressen zugewiesen wurden, so dass dies nicht funktionierte.

Es gab möglicherweise einen Weg, diese Probleme bei der Switch-Konfiguration zu umgehen, aber um gute Beziehungen zu den Netzwerkadmins zu erhalten, versuchte ich, einen anderen Weg zu finden. Mit zwei Netzwerkschnittstellen schien der nächste logische Schritt zu sein. Zum Glück ist dieses Linux-System eine virtuelle Maschine, so dass ich problemlos eine zweite Netzwerkschnittstelle hinzufügen konnte (ohne Neustart, könnte ich hinzufügen - ziemlich cool). Ein paar Tastenanschläge später hatte ich zwei Netzwerk-Schnittstellen zum Laufen und beide zogen IP-Adressen von DHCP.

Aber dann kam das Problem: Die Netzwerkadministratoren konnten (auf dem Switch) den ARP-Eintrag für beide Schnittstellen sehen, aber nur die erste Netzwerkschnittstelle, die ich ansprach, reagierte auf Pings oder irgendeine Art von TCP- oder UDP-Verkehr.

Nachdem ich viel gegraben und gestochert habe, habe ich Folgendes herausgefunden. Es scheint zu funktionieren, aber es scheint auch eine Menge Arbeit für etwas zu sein, das scheinbar einfach sein sollte. Irgendwelche alternativen Ideen da draußen?


Schritt 1: Aktivieren Sie die ARP-Filterung für alle Schnittstellen:

# sysctl -w net.ipv4.conf.all.arp_filter=1
# echo "net.ipv4.conf.all.arp_filter = 1" >> /etc/sysctl.conf

Aus der Datei networking / ip-sysctl.txt in der Linux-Kernel-Dokumentation:

arp_filter - BOOLEAN
    1 - Allows you to have multiple network interfaces on the same
    subnet, and have the ARPs for each interface be answered
    based on whether or not the kernel would route a packet from
    the ARP'd IP out that interface (therefore you must use source
    based routing for this to work). In other words it allows control
    of which cards (usually 1) will respond to an arp request.

    0 - (default) The kernel can respond to arp requests with addresses
    from other interfaces. This may seem wrong but it usually makes
    sense, because it increases the chance of successful communication.
    IP addresses are owned by the complete host on Linux, not by
    particular interfaces. Only for more complex setups like load-
    balancing, does this behaviour cause problems.

    arp_filter for the interface will be enabled if at least one of
    conf/{all,interface}/arp_filter is set to TRUE,
    it will be disabled otherwise

Schritt 2: Implementieren Sie das quellenbasierte Routing

Ich habe im Grunde nur die Anweisungen von http://lartc.org/howto/lartc.rpdb.multiple-links.htmlobwohl diese Seite mit einem anderen Ziel geschrieben wurde (im Umgang mit zwei ISPs).

Angenommen, das Subnetz ist 10.0.0.0/24, das Gateway ist 10.0.0.1, die IP-Adresse für eth0 ist 10.0.0.100 und die IP-Adresse für eth1 ist 10.0.0.101.

Definieren Sie zwei neue Routing-Tabellen namens eth0 und eth1 in / etc / iproute2 / rt_tables:

... top of file omitted ...
1    eth0
2    eth1

Definieren Sie die Routen für diese beiden Tabellen:

# ip route add default via 10.0.0.1 table eth0
# ip route add default via 10.0.0.1 table eth1
# ip route add 10.0.0.0/24 dev eth0 src 10.0.0.100 table eth0
# ip route add 10.0.0.0/24 dev eth1 src 10.0.0.101 table eth1

Definieren Sie die Regeln für die Verwendung der neuen Routingtabellen:

# ip rule add from 10.0.0.100 table eth0
# ip rule add from 10.0.0.101 table eth1

Die Haupt-Routingtabelle wurde bereits von DHCP übernommen (und es ist nicht einmal klar, dass es in diesem Fall unbedingt notwendig ist), aber es entspricht im Wesentlichen dem:

# ip route add default via 10.0.0.1 dev eth0
# ip route add 130.127.48.0/23 dev eth0 src 10.0.0.100
# ip route add 130.127.48.0/23 dev eth1 src 10.0.0.101

Und voila! Alles scheint gut zu funktionieren. Das Senden von Pings an beide IP-Adressen funktioniert einwandfrei. Senden von Pings von diesem System an andere Systeme und Erzwingen des Ping zur Verwendung einer bestimmten Schnittstelle funktioniert gut (ping -I eth0 10.0.0.1, ping -I eth1 10.0.0.1). Und am wichtigsten ist, dass der gesamte TCP- und UDP-Verkehr zu / von beiden IP-Adressen wie erwartet funktioniert.


Meine Frage lautet also: Gibt es einen besseren Weg, dies zu tun? Dies scheint eine Menge Arbeit für ein scheinbar einfaches Problem zu sein.


Aktualisieren:  Die obige Lösung endete unvollständig. Die Dinge funktionierten gut, wenn der Verkehr im selben Subnetz blieb, aber die Kommunikation mit anderen Subnetzen, die die 2. Schnittstelle verwenden, würde nicht richtig funktionieren. Anstatt ein größeres Loch zu graben, habe ich mit den Netzwerkadministratoren gesprochen und sie dazu gebracht, mehrere IP-Adressen für die eine Schnittstelle zuzulassen und IP-Aliasing zu verwenden (z. B. eth0 und eth0: 0).


21
2017-11-29 23:04


Ursprung


Der wichtigste Unterschied ist, dass die IP nicht zur Schnittstelle gehört, sondern zur Maschine gehört. Es ist also richtig, in diesem Setup eine Schnittstelle für beide IP-Adressen zu senden, weshalb es einige Tricks erfordert nicht TU das. - MikeyB
Ich glaube, dass Source-Routing in diesem Fall nicht notwendig ist, da die Arp-Filterung nur dann angewendet werden sollte, wenn der Switch zu einer Schnittstelle sendet / sie zwischen seinen Ports finden muss. Ich könnte mich irren, aber wenn das Gerät Daten an den Switch sendet, wird die IP im Quellfeld (IP-Header) nicht geprüft, sondern nur das ARP, das das Paket sendet. - AndreasM
MikeyB ist richtig, Source-Routing ist der einzige Weg. Der Computer kann jede ausgehende Schnittstelle auswählen, an die er Daten senden möchte, solange er sich im selben Subnetz befindet. Es spielt keine Rolle, ob sich die IP wirklich auf dieser Schnittstelle befindet oder nicht. - Patrick
AndreasM: Die eingehenden Pakete sind nicht das Problem, sondern die ausgehenden Pakete sind das Problem. Ohne Quellenrouting verwenden alle ausgehenden Pakete die Standardroute, die an die eine oder die andere Schnittstelle gebunden ist. Obwohl die ausgehenden Pakete die richtige Quell-IP-Adresse haben, können die Filter auf dem Switch sie nicht auslassen, da diese IP-Adresse nicht zur MAC-Adresse dieser Schnittstelle gehört. Für den Switch sieht es so aus, als ob ein Client versucht, die IP eines anderen Clients zu manipulieren. (Dies sind Smart-Layer-3-Switches). - Scott Duckworth
IP-Aliase sind obsolet und ein Hack, spiegeln nicht die Realität wider, ganz zu schweigen davon, dass das Abbauen der primären Aliase alle Aliasnamen entfernt. Benutzen ip von iproute2 um mehr als eine Adresse zu derselben Schnittstelle hinzuzufügen. - pilona


Antworten:


Ja, der bessere Weg besteht darin, einen richtigen Geschäftsfall zu erstellen und die Regeln für die Switches zu lockern, sodass Sie mehrere IPs auf einer NIC haben können.


8
2017-11-29 23:10