Puncte:0

Windows 10 ignorând tabelul de rutare

drapel pk

Am un PC cu Windows 10 care are 2 interfețe de rețea. Una dintre aceste interfețe merge în LAN-ul principal unde se află serverul de fișiere, dns și routerul pentru internet. A doua interfață este un LAN minuscul care are un PLC și un HMI. Ambele sunt fizic în aceeași rețea LAN, dar pe subrețele diferite (îmi pare rău, nu pot schimba asta, în afara controlului meu).

Deci am două interfețe fizice și una logică: eth0: DHCP, 172.16.x.y, MASK 255.255.255.0, implicit gw 172.16.x.z eth1: static 192.168.1.158, MASCA 255.255.255.0 static 192.168.19.158, MASCA 255.255.255.0

HMI-ul este accesibil sub 192.168.19.135

Acum, când repornesc HMI, pornesc un ping pentru a vedea când este din nou accesibil. Acest lucru ar trebui să se întâmple după aproximativ 30 de secunde.Dar primesc un răspuns pozitiv la ping numai după 80-90 de secunde.

Ping wird ausgeführt für 192.168.19.135 cu 32 de octeți Data:
Răspuns de la 192.168.19.158: Zielhost nicht erreichbar.
Zeitüberschreitung der Anforderung.
Zeitüberschreitung der Anforderung.
Zeitüberschreitung der Anforderung.

(Îmi pare rău pentru textul în germană, dar cred că ar trebui să fie încă clar ceea ce vedem aici) Primesc alt răspuns pentru primul ping decât pentru al doilea.

Se pare că Windows după XP a început să facă ceva „magie de rutare” și să trimită date pe ruta implicită dacă nu poate ajunge la țintă pe o rută mai specifică. Se pare că și alții au avut această problemă

Am găsit câteva „soluții” care nu sunt soluții reale pentru mine (mai multe despre asta mai jos)

  1. Deci ping are un parametru frumos „-S” pentru a defini adresa sursă. Și da, asta „rezolvă” problema. Primesc un răspuns instantaneu dacă HMI-ul este activat. Dar folosesc acea comandă într-un script powershell, iar parametrul sursă pentru „test-connection” are un înțeles complet diferit. Și din moment ce folosesc acest lucru într-un script, acesta eșuează de îndată ce IP-ul local se schimbă.
  2. Am configurat eth0 static în loc de prin DHCP și nu am definit o rută implicită. Acest lucru a „rezolvat” și problema (cred că vă puteți imagina de ce aceasta nu este cu adevărat o soluție)
  3. Am explorat doar teoretic acest lucru, dar aș putea instala un router bazat pe Linux cu 3 interfețe între PC, LAN și LAN izolat cu PLC și HMI și să-l las să facă toată rutarea (acest lucru ar rezolva cu siguranță problema! Dar sincer, am nevoie de un computer suplimentar doar pentru a rezolva rutarea ferestrelor sparte?)
  4. ´arp -d *´ pare să ajute și el, dar au nevoie de privilegii ridicate

Am încercat să adaug rute statice cu diferiți parametri și metrici. Nicio schimbare! Adăugarea static a MAC-ului HMI nu ajută, deoarece acest MAC se poate schimba.

Deci intrebarile mele sunt:

  1. Există vreo documentație despre această schimbare de comportament în Windows?
  2. Există o modalitate de a forța Windows să folosească interfața definită
Puncte:0
drapel pk

Așadar, după ce nu am găsit o soluție ușoară, am decis să-mi programez drumul în jurul problemei create de Microsoft prin încurcarea prost de rutare pe Windows.

Nu folosesc ping clasic cu parametrul -S în loc de conexiunea de testare cmdlet în powershell

partea ping a codului meu acum arată astfel:

$localIPs = (Get-NetIPConfiguration -InterfaceAlias ​​„PLC”).IPv4Address.IPAddress

# deoarece această comandă returnează un șir, atunci când interfața are o singură adresă IP, dar o matrice de șiruri dacă interfața are mai multe adrese, trebuie să verificăm aceasta
if ($localIPs.GetType().Name -eq „șir”) { # doar un singur IP
  $localIP = $localIPs
}
else { # mai mult de un IP
  $localIP = $localIPs[0] # deoarece se pare că Windows folosește adresa IP ca sinonim pentru interfață, nu este important care dintre adresele acelei interfețe folosim. Deci îl alegem pe primul
}

$pingcount = 180

face {
  ping $HMI4IP -n 1 -w 1000 -S $localIP | Out-Null # redirecționează rezultatul ping către /dev/null
  $pingreply = $?
  $pingcount = $pingcount - 1
}
până la ($pingcount -eq '0' -sau $pingreply)
dacă ($pingreply) {
  # cod aici
}
else {
  ieșire 1337 # return cu un cod de eroare, nu ne-am atins ținta
}

Pentru aceasta trebuie doar să mă asigur că interfața la care sunt conectate PLC-ul și HMI-ul poartă numele de „PLC”. Apoi primesc adresa ca șir sau o matrice de adrese (în funcție de dacă interfața are una sau mai multe adrese) pe care trebuie să le gestionez (bun venit la tastarea dinamică...). Decat este la fel de usor ca si furnizarea acestor date la ping (pentru ca Test-Connection incearca sa fie prea inteligenta pentru binele lui). În $? Obțin adevărat că ultima comandă a returnat un succes și false dacă a fost un eșec. Deci este ușor de gestionat de acolo încolo.

Din câte văd, nu există nicio documentare de la Microsoft despre acest comportament și despre cum să-l gestionez, ceea ce cred că este destul de trist.

Postează un răspuns

Majoritatea oamenilor nu înțeleg că a pune multe întrebări deblochează învățarea și îmbunătățește legătura interpersonală. În studiile lui Alison, de exemplu, deși oamenii își puteau aminti cu exactitate câte întrebări au fost puse în conversațiile lor, ei nu au intuit legătura dintre întrebări și apreciere. În patru studii, în care participanții au fost implicați în conversații ei înșiși sau au citit transcrieri ale conversațiilor altora, oamenii au avut tendința să nu realizeze că întrebarea ar influența – sau ar fi influențat – nivelul de prietenie dintre conversatori.