Welche IP verwendet eine Schnittstelle, wenn der Host als Client fungiert?
Nehmen wir an, ich habe eth0 mit 2 IP-Adressen konfiguriert: 192.168.1.7 und 192.168.1.8
Der Route-Befehl zeigt ungefähr Folgendes:
$ route
Kernel IP routing table
Destination Gateway Genmask Flags Metric Ref Use Iface
192.168.240.0 0.0.0.0 255.255.240.0 U 256 0 0 eth0
...
Das bedeutet im Wesentlichen, dass beim Versuch, eine Verbindung zu einem beliebigen Host im 192.168.240.0
Netzwerk herzustellen, die Schnittstelle eth0 verwendet wird. Ok, aber ... Welche IP-Adresse dieser Schnittstelle?
Wenn der Host als Server fungiert und ein Client über die IP-Adresse eine Verbindung zu meinem Computer herstellt, 192.168.1.7
ist mir klar, dass eth0 diese zur Kommunikation mit dem Client verwendet 192.168.1.7
. Was aber, wenn ich der Client bin?
BEARBEITEN
Die IP-Adressen sind erfunden. Ich kann einer Schnittstelle in meinem Ubuntu WSL keine weitere IP-Adresse hinzufügen, da ich diesen Fehler erhalte:
$ ip address add 192.168.1.7/24 dev eth0
RTNETLINK answers: Permission denied
Die Ausgabe ip r s
sieht ungefähr so aus:
$ ip r s
none 224.0.0.0/4 dev eth0 proto unspec metric 256
none 255.255.255.255 dev eth0 proto unspec metric 256
none 224.0.0.0/4 dev eth1 proto unspec metric 256
none 255.255.255.255 dev eth1 proto unspec metric 256
...
BEARBEITEN 2
Ich habe auf WSL2 aktualisiert und jetzt funktioniert der Befehl zum Hinzufügen von IP-Adressen (mit sudo).
$ ip -4 a s dev eth0
4: eth0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc mq state UP group default qlen 1000
inet 192.168.249.181/20 brd 192.168.255.255 scope global eth0
valid_lft forever preferred_lft forever
inet 192.168.1.7/24 scope global eth0
valid_lft forever preferred_lft forever
inet 192.168.1.8/24 scope global secondary eth0
valid_lft forever preferred_lft forever
Antwort1
Für Linux lautet die Antwort auf Ihre Fragehier gegeben:
Die anfängliche Quelladresse für ein ausgehendes Paket wird gemäß der folgenden Regelreihe ausgewählt.
Die Anwendung kann eine bestimmte IP anfordern. Der Kernel verwendet den SRC-Hinweis des gewählten Routenpfads. Wenn dieser Hinweis fehlt, wählt der Kernel die erste auf der Schnittstelle konfigurierte Adresse, die im selben Netzwerk liegt wie die Zieladresse oder der Nexthop-Router.
Antwort2
Der Client sucht nach den ROUTEN, die der Adresse entsprechen, mit der er eine Verbindung herstellen möchte. Wenn es, wie in Ihrem Beispiel, mehr als eine passende Route gibt, wählt er den Routeneintrag mit der höchsten Metrik aus und sendet das Paket über die in der Routentabelle gefundene Schnittstelle unter Verwendung der IP-Adresse dieser Schnittstelle.
Sie haben die Ausgabe der Route abgeschnitten und nicht gesagt, womit Sie eine Verbindung herstellen. Daher kann ich Ihnen nicht sagen, welche Schnittstelle das sein wird.
Auf dem Server... nun, da wird es etwas komplizierter. Ich habe Centos- und Redhat-Hosts mit mehreren Schnittstellen im selben Subnetz. Diese antworten auf dieselbe Adresse/Schnittstelle, an die die Pakete gesendet wurden. Aber ich habe auch neuere Ubuntu- und Debian-Systeme, die die Routing-Tabelle erneut aufrufen, um die zu verwendende Schnittstelle und Adresse zu finden, wobei sie die Adressierung des Pakets des Clients ignorieren. Der Client ignoriert die Pakete, die von einer IP-Adresse zurückkommen, mit der er nicht kommuniziert.