Mögliches Duplikat:
So überbrücken Sie zwei verschiedene Internetverbindungen
ich suche nach der besten Methode, um über nur einen Ethernet-Adapter eine Verbindung zu mehreren Routern herzustellen, und nach den damit verbundenen Nebenwirkungen.
Ich habe einen Linux-PC mit einem Ethernet-Port, der an einen Switch angeschlossen ist. Dieser Switch ist mit mehreren Routern mit unterschiedlichen Netzwerken verbunden (z. B. 192.168.1.1, 192.168.2.1, 192.168.3.1). Ich möchte in der Lage sein, einen Socket an ein bestimmtes „Gerät“ zu binden, daher verwende ich für diese Verbindung den entsprechenden Router.
Ich glaube, dass dies erreicht werden kann, indem man für jeden Router eine virtuelle ETH-Schnittstelle erstellt und für jeden die richtige IP/das richtige Subnetz/das richtige GW einstellt.
Die Fragen sind: Ist das richtig? Wie geht das? Sollte ich seltsame Nebenwirkungen befürchten?
* Die gesamte Netzwerkgeschwindigkeit aller Router zusammen wird nicht einmal 10 M überschreiten.
Antwort1
Hier sind keine virtuellen Schnittstellen erforderlich. Was Sie möchten, sind mehrere IP-Adressen auf demselben Gerät und gute Routing-Tabellen mit Policy-Routing, um auszuwählen, welche Routing-Tabelle verwendet werden soll. Nun zum Konfigurationsteil. Lassen Sie uns Ihre IP-Adressen mit /32 konfigurieren, damit wir unsere On-Link-Routen selbst erstellen können
ip addr flush dev eth0
ip addr add 192.168.1.yourhost/32 dev eth0
ip addr add 192.168.2.yourhost/32 dev eth0
ip addr add 192.168.3.yourhost/32 dev eth0
Nun zur Routing-Tabelle. Die erste Routing-Tabelle gleicht Pakete ab, die an Ihre LANs gehen.
ip route add 192.168.1.0/24 dev eth0 src 192.168.1.yourhost table 2
ip route add 192.168.2.0/24 dev eth0 src 192.168.1.yourhost table 2
ip route add 192.168.3.0/24 dev eth0 src 192.168.1.yourhost table 2
table 2
gibt an, welche Routing-Tabelle verwendet werden soll. 2 ist eine beliebige Zahl. Zahlen können Namen zugeordnet werden, indem /etc/iproute2/rt_tables bearbeitet wird. Fügen wir 2 lan
dieser Datei Folgendes hinzu, jetzt können Sie einfach verwenden table lan
.
Lassen Sie uns nun standardmäßig diese Routing-Tabelle verwenden:
ip rule add table lan
Wenn Sie sich nun die Ausgabe von ansehen ip rule
, sehen Sie in etwa Folgendes:
0: from all lookup local
99: from all lookup lan
32766: from all lookup main
32767: from all lookup default
local
ist eine reservierte Tabelle, die verwendet wird, damit der Kernel prüfen kann, ob eine IP-Adresse seine eigene IP-Adresse ist, lan
ist unsere Tabelle, main
ist die übliche Routing-Tabelle, die Sie kennen, und default
ist eine spezielle Tabelle für Pakete, die wir nicht routen können. Grundsätzlich probiert der Kernel diese Regeln aus, indem er mit der ersten beginnt, und wenn er in dieser Tabelle keine Route finden kann, geht er zur nächsten Regel über.
Also haben wir eine weitere Routing-Tabelle hinzugefügt, in der wir unsere Routen zum LAN ablegen, die vor der main
Tabelle getestet werden. Jetzt fügen wir eine Standardroute in main hinzu: Wenn Sie einen Socket nicht an eine IP-Adresse binden, verwenden Sie nur diese Standardroute. Wählen wir 192.168.1.1:
ip route add default via 192.168.1.1 src 192.168.1.yourhost
Wenn Sie Ihren Socket nun an 192.168.2.IhrHost binden, möchten Sie nicht diese Standardroute verwenden, sondern eine andere. Fügen wir diese Standardroute zu einer anderen Routing-Tabelle hinzu:
ip route add default via 192.168.2.1 src 192.168.2.yourhost dev eth0 table 3
# and while we are at it, let's do this for 192.168.3.1 as well
ip route add default via 192.168.3.1 src 192.168.3.yourhost dev eth0 table 4
Jetzt möchten Sie diese Routing-Tabelle verwenden, aber nur, wenn Ihr Socket an diese anderen IP-Adressen gebunden ist.
ip rule add from 192.168.2.yourhost iif lo table 3
ip rule add from 192.168.3.yourhost iif lo table 4
from 192.168.2.yourhost
bewirkt, dass der Kernel die Tabelle nur dann ausprobiert, wenn die IP-Quelladresse im Paket 192.168.2.IhrHost lautet. iif
Ermöglicht die Angabe, von welcher Schnittstelle das Paket empfangen wurde (was beim Weiterleiten von Datenverkehr nützlich ist), mit einer speziellen Ausnahme: Dies iif lo
bedeutet, dass der Datenverkehr lokal generiert wurde.
ip route get
Jetzt können Sie überprüfen, ob es funktioniert, indem Sie es versuchen oder Befehle zum Testen Ihrer Routing-Tabellen verwenden :
$ ip route get 192.168.2.5
192.168.2.5 dev eth0 src 192.168.2.yourhost
cache
$ ip route get 64.34.119.12
64.34.119.12 via 192.168.1.1 dev eth0 src 192.168.1.yourhost
cache
$ ip route get 64.34.119.12 from 192.168.2.yourhost
64.34.119.12 via 192.168.2.1 dev eth0 src 192.168.2.yourhost
cache