Windows 10 ignoriert Routing-Tabelle

Windows 10 ignoriert Routing-Tabelle

Ich habe einen Windows 10-PC mit zwei Netzwerkschnittstellen. Eine dieser Schnittstellen führt in das Haupt-LAN, in dem sich der Dateiserver, DNS und der Router für das Internet befinden. Die zweite Schnittstelle ist ein kleines LAN mit einer SPS und einer HMI. Beide befinden sich physisch im selben LAN, aber in unterschiedlichen Subnetzen (leider kann ich das nicht ändern, da ich darauf keinen Einfluss habe).

Ich habe also zwei physische Schnittstellen und eine logische: eth0: DHCP, 172.16.xy, MASK 255.255.255.0, Standard-GW 172.16.xz eth1: statisch 192.168.1.158, MASK 255.255.255.0 statisch 192.168.19.158, MASK 255.255.255.0

Das HMI ist erreichbar unter 192.168.19.135

Wenn ich jetzt das HMI neu starte, starte ich einen Ping, um zu sehen, wann es wieder erreichbar ist. Dies sollte nach etwa 30 Sekunden passieren. Aber ich bekomme erst nach 80-90 Sekunden eine positive Ping-Antwort.

Ping wird ausgeführt für 192.168.19.135 mit 32 Bytes Daten:
Antwort von 192.168.19.158: Zielhost nicht erreichbar.
Zeitüberschreitung der Anforderung.
Zeitüberschreitung der Anforderung.
Zeitüberschreitung der Anforderung.

(Entschuldigung für den deutschen Text, aber ich denke, es sollte trotzdem klar sein, was wir hier sehen) Ich bekomme auf den ersten Ping eine andere Antwort als auf den zweiten.

Es scheint, dass Windows nach XP angefangen hat, etwas „Routing-Magie“ anzuwenden und Daten einfach über die Standardroute zu senden, wenn sie das Ziel nicht über eine spezifischere Route erreichen können. Es scheint, dass auch anderedieses Problem

Ich habe einige „Lösungen“ gefunden, die für mich keine echten Lösungen sind (mehr dazu weiter unten)

  1. Ping hat also einen netten „-S“-Parameter, um die Quelladresse zu definieren. Und ja, das „löst“ das Problem. Ich bekomme sofort eine Antwort, wenn das HMI aktiv ist. Aber ich verwende diesen Befehl in einem Powershell-Skript und der Quellparameter für „Testverbindung“ hat eine völlig andere Bedeutung. Und da ich dies in einem Skript verwende, schlägt dies fehl, sobald sich die lokale IP ändert.
  2. Ich habe eth0 statisch statt per DHCP konfiguriert und keine Standardroute definiert. Das hat das Problem auch "gelöst" (ich denke, Sie können sich vorstellen, warum das keine wirkliche Lösung ist).
  3. Ich habe dies nur theoretisch untersucht, aber ich könnte einen Linux-basierten Router mit 3 Schnittstellen zwischen dem PC, dem LAN und dem isolierten LAN mit der SPS und der HMI installieren und ihn das gesamte Routing durchführen lassen (das würde das Problem mit Sicherheit lösen! Aber mal ehrlich: Brauche ich einen zusätzlichen Computer, nur um das defekte Windows-Routing zu umgehen?)
  4. ´arp -d *´ scheint auch zu helfen, erfordert aber erhöhte Rechte

Ich habe versucht, statische Routen mit unterschiedlichen Parametern und Metriken hinzuzufügen. Keine Änderung! Das statische Hinzufügen der MAC des HMI hilft nicht, da sich diese MAC ändern kann.

Meine Fragen sind also:

  1. gibt es eine Dokumentation zu dieser Verhaltensänderung in Windows?
  2. Gibt es eine Möglichkeit, Windows zu zwingen, die definierte Schnittstelle zu verwenden?

Antwort1

Nachdem ich keine einfache Lösung gefunden hatte, beschloss ich, das Problem, das Microsoft durch die gravierende Störung des Routings unter Windows verursacht hatte, per Programmierung zu umgehen.

Ich verwende nur noch den klassischen Ping mit dem Parameter -S statt dem Cmdlet test-connection in Powershell

Der Ping-Teil meines Codes sieht jetzt so aus:

$localIPs = (Get-NetIPConfiguration -InterfaceAlias "PLC").IPv4Address.IPAddress

# because this command returns a string, when the interface has a single IP-address but an array of strings if the interface has more than one address, we need to check for this
if ($localIPs.GetType().Name -eq "string") { # only a single IP
  $localIP = $localIPs
}
else { # more than one IP
  $localIP = $localIPs[0] # since it seems that windows does use the ip address as a synonym for the interface, it's not important which of the addresses of that interface we use. So we're just picking the first one
}

$pingcount = 180

do {
  ping $HMI4IP -n 1 -w 1000 -S $localIP | Out-Null # redirect the output of ping to /dev/null
  $pingreply = $?
  $pingcount = $pingcount - 1
}
until ($pingcount -eq '0' -or $pingreply)
if ($pingreply) {
  # code here
}
else {
  exit 1337 # return with an error code, we've not reached our target
}

Dazu muss ich nur sicherstellen, dass die Schnittstelle, an die die SPS und die HMI angeschlossen sind, „SPS“ heißt. Dann erhalte ich die Adresse als Zeichenfolge oder Array von Adressen (je nachdem, ob die Schnittstelle eine oder mehrere Adressen hat), die ich verarbeiten muss (willkommen bei der dynamischen Typisierung ...). Dann ist es so einfach, diese Daten an Ping weiterzugeben (weil Test-Connection versucht, zu schlau für sein eigenes Wohl zu sein). In $? erhalte ich „true“, wenn der letzte Befehl erfolgreich zurückgegeben wurde, und „false“, wenn es ein Fehler war. Von da an ist das also einfach zu handhaben.

Soweit ich sehen kann, gibt es von Microsoft keine Dokumentation zu diesem Verhalten und wie man damit umgeht, was ich ziemlich schade finde.

verwandte Informationen