Pingen Sie eine Schnittstelle vom anderen, gleichen Host aus an

Pingen Sie eine Schnittstelle vom anderen, gleichen Host aus an

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ötigen sudo ip …. Aus Gründen der Lesbarkeit lasse ich Folgendes weg sudo. 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 wird ip netns exec …jedes Mal verwendet, wenn wir etwas in einem nicht standardmäßigen Netzwerk-Namespace ausführen müssen.

Gehen Sie wie folgt vor:

  1. Definieren Sie nützliche Variablen. Hier ns1ist ein beliebiger Name für einen Namespace; eth1und eth2hier sind die Geräte, die Sie verwenden möchten.

    netns=ns1
    dev1=eth1
    dev2=eth2
    
  2. Erstellen Sie einen neuen Netzwerk-Namespace.

    ip netns add "$netns"
    
  3. Bringen Sie die Geräte in den Standard-Namespace herunter.

    ip link set dev "$dev1" down
    ip link set dev "$dev2" down
    
  4. Fügen Sie eines der Geräte zum neuen Namespace hinzu (es verschwindet aus dem Standard-Namespace). Hier wähle ich die Verschiebung $dev2zum neuen Namespace.

    ip link set dev "$dev2" netns "$netns"
    
  5. 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"
    
  6. 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
    
  7. Verbinden Sie die beiden Schnittstellen physisch mit einem Kabel, falls noch nicht geschehen.

  8. 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
    
  9. 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
    
  10. 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 Adresse 192.168.1.6ist keiner Schnittstelle im Standardnetzwerk-Namespace zugewiesen und 192.168.1.5wird auch nicht im nicht standardmäßigen Namespace zugewiesen.

Und das ist es. Es sollte funktionieren. Meine Tests zeigen, dass diese pings 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-ngDie Ü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.

verwandte Informationen