Ich habe einen Computer (mit Linux) mit zwei Ethernet-Schnittstellen. Ich möchte diese testen, ohne einen anderen PC einzubeziehen.
Die Einrichtung:
(192.168.1.5) eth1-------.
Linux PC/device | loopback cable
(192.168.1.6) eth2-------'
ich renne
ping -I eth1 192.168.1.6
aber es kommt keine Antwort.
Ich verstehe das Problem nicht. Warum verhindert Linux diese Aktion? Wie kann ich dieses Problem lösen?
Antwort1
Warum?
Ich kann es nicht vollständig erklären.
Wie kann ich dieses Problem lösen?
NormalerweiseLinux erreicht lokal zugewiesene IP-Adressen internund es funktioniert einfach. Das Problem scheint dann aufzutreten, wenn Pakete wirklich nach außen (z. B. über ein Kabel) und zurück transportiert werden müssen – wie in Ihrem Fall.
Sie können es zum Laufen bringen, indem Sie Netzwerk-Namespaces verwenden. Ich habe angepasstdiese andere Antwort von mirauf Ihre Bedürfnisse.
Anmerkungen:
- Ich habe es auf Debian 10 getestet.
- An der Stelle, an der sich der Befehl befindet,
ip …
werden Sie wahrscheinlich Folgendes benötigensudo ip …
. Aus Gründen der Lesbarkeit lasse ich Folgendes wegsudo
. Arbeiten Sie in einer Shell mit erhöhten Rechten, oder definieren Sie (vorübergehend),alias ip='sudo ip'
um bequem kopieren und einfügen zu können. - Ich gehe davon aus, dass keine Automatisierung eingreift, also kein Daemon vorhanden ist, der versucht, die entsprechenden Schnittstellen auf seine Art zu konfigurieren.
- Um einen Befehl in einem nicht standardmäßigen Netzwerk-Namespace auszuführen, verwende ich
ip netns exec …
. Es ist möglich, eine Shell auf diese Weise auszuführen; dann verwendet alles, was Sie von der Shell aus ausführen, den Netzwerk-Namespace. Diese Antwort wirdip netns exec …
jedes Mal verwendet, wenn wir etwas in einem nicht standardmäßigen Netzwerk-Namespace ausführen müssen.
Gehen Sie wie folgt vor:
Definieren Sie nützliche Variablen. Hier
ns1
ist ein beliebiger Name für einen Namespace;eth1
undeth2
hier sind die Geräte, die Sie verwenden möchten.netns=ns1 dev1=eth1 dev2=eth2
Erstellen Sie einen neuen Netzwerk-Namespace.
ip netns add "$netns"
Bringen Sie die Geräte in den Standard-Namespace herunter.
ip link set dev "$dev1" down ip link set dev "$dev2" down
Fügen Sie eines der Geräte zum neuen Namespace hinzu (es verschwindet aus dem Standard-Namespace). Hier wähle ich die Verschiebung
$dev2
zum neuen Namespace.ip link set dev "$dev2" netns "$netns"
IP-Adressen zuweisen.
ip address add 192.168.1.5/24 dev "$dev1" ip netns exec "$netns" ip address add 192.168.1.6/24 dev "$dev2"
Bestätigen Sie, dass sich die beiden Geräte mit den richtigen IP-Adressen am richtigen Ort befinden.
ip address show ip netns exec "$netns" ip address show # examine output
Verbinden Sie die beiden Schnittstellen physisch mit einem Kabel, falls noch nicht geschehen.
Rufen Sie die Schnittstellen auf. Der Namespace enthält sein eigenes Loopback-Gerät
lo
. Ich rufe es nur für den Fall auf, weil Programme sich im Allgemeinen darauf verlassen möchten.ip link set dev "$dev1" up ip netns exec "$netns" ip link set dev "$dev2" up ip netns exec "$netns" ip link set dev lo up
Routen prüfen. In meinem Debian 10 erscheinen automatisch sinnvolle Routen. Dieser Befehl
ip route show
Drucke (unter anderem)
192.168.1.0/24 dev eth1 proto kernel scope link src 192.168.1.5
und dieser Befehl
ip netns exec "$netns" ip route show
druckt
192.168.1.0/24 dev eth2 proto kernel scope link src 192.168.1.6
Pingen Sie auf die eine oder andere Weise.
ping 192.168.1.6 ip netns exec "$netns" ping 192.168.1.5
Sie können es verwenden
-I
, es ist aber nicht notwendig. Die Adresse192.168.1.6
ist keiner Schnittstelle im Standardnetzwerk-Namespace zugewiesen und192.168.1.5
wird auch nicht im nicht standardmäßigen Namespace zugewiesen.
Und das ist es. Es sollte funktionieren. Meine Tests zeigen, dass diese ping
s das Kabel wirklich nutzen. Ich kann es sagen, weil:
- das Abziehen des Kabels stoppt die Übertragung; zum Vergleich: „Interne“ Pings (von einer kabelgebundenen Schnittstelle an die eigene IP-Adresse) fließen auch ohne Kabel;
iptraf-ng
Die Überwachung der angepingten Schnittstelle zeigt ICMP-Echoanforderungen und ICMP-Echoantworten. Zum Vergleich: Für eine kabelgebundene Schnittstelle zeigt das Tool keine „internen“ Pings an.
Grundlegende Bereinigung: Löschen Sie den Netzwerk-Namespace.
ip netns del "$netns"
Dadurch wird das zweite Gerät zurück in den Standardnetzwerk-Namespace verschoben.
Keiner der von uns verwendeten Befehle führt eine dauerhafte Änderung durch. Führen Sie im Problemfall also einfach einen Neustart durch.