Рейтинг:0

Windows 10 игнорирует таблицу маршрутизации

флаг pk

У меня есть ПК с Windows 10, который имеет 2 сетевых интерфейса. Один из этих интерфейсов входит в основную локальную сеть, где расположены файловый сервер, DNS и маршрутизатор для Интернета. Второй интерфейс представляет собой крошечную локальную сеть, в которой есть ПЛК и ЧМИ. Они оба физически находятся в одной и той же локальной сети, но в разных подсетях (извините, я не могу это изменить, вне моего контроля).

Итак, у меня есть два физических интерфейса и один логический: eth0: DHCP, 172.16.xy, МАСКА 255.255.255.0, gw по умолчанию 172.16.xz eth1: статический 192.168.1.158, МАСКА 255.255.255.0 статический 192.168.19.158, МАСКА 255.255.255.0

HMI доступен по адресу 192.168.19.135.

Теперь, когда я перезагружаю HMI, я запускаю эхо-запрос, чтобы увидеть, когда он снова будет доступен. Это должно произойти примерно через 30 с.Но я получаю положительный ответ на пинг только через 80-90 секунд.

Ping wird ausgeführt für 192.168.19.135 с 32 байтами Дата:
Ответ от 192.168.19.158: Zielhost nicht erreichbar.
Zeitüberschreitung der Anforderung.
Zeitüberschreitung der Anforderung.
Zeitüberschreitung der Anforderung.

(извините за немецкий текст, но я думаю, должно быть ясно, что мы здесь видим) Я получаю другой ответ на первый пинг, чем на второй.

Кажется, что Windows после XP начала делать некоторую «магию маршрутизации» и просто отправлять данные по маршруту по умолчанию, если они не могут достичь цели по более конкретному маршруту. Кажется, у других также было Эта проблема

Я нашел несколько «решений», которые для меня не являются реальными решениями (подробнее об этом ниже)

  1. Таким образом, ping имеет хороший параметр «-S» для определения исходного адреса. И да, это "решает" проблему. Я получаю ответ мгновенно, если HMI работает. Но я использую эту команду в сценарии powershell, и параметр источника для «тестового соединения» имеет совершенно другое значение. И поскольку я использую это в скрипте, это не работает, как только локальный IP-адрес меняется.
  2. Я настроил eth0 статически вместо DHCP и не определил маршрут по умолчанию. Это также «решило» проблему (я думаю, вы можете себе представить, почему это на самом деле не решение)
  3. Я исследовал это только теоретически, но я мог бы установить маршрутизатор на базе Linux с 3 интерфейсами между ПК, локальной сетью и изолированной локальной сетью с ПЛК и ЧМИ и позволить ему выполнять всю маршрутизацию (это наверняка решит проблему! Но, честно говоря, нужен ли мне дополнительный компьютер только для того, чтобы обойти маршрутизацию сломанных окон?)
  4. ´arp -d *´ тоже помогает, но нужны повышенные привилегии

Я пробовал добавлять статические маршруты с разными параметрами и показателями. Без изменений! Статическое добавление MAC-адреса HMI не помогает, поскольку этот MAC-адрес может измениться.

Итак, мои вопросы:

  1. есть ли какая-либо документация по этому изменению поведения в окнах?
  2. есть ли способ заставить окна использовать определенный интерфейс
Рейтинг:0
флаг pk

Итак, не найдя простого решения, я решил запрограммировать свой способ обойти проблему, которую Microsoft создала, сильно испортив маршрутизацию в Windows.

Я использую классический ping с параметром -S вместо командлета test-connection в powershell

ping-часть моего кода теперь выглядит так:

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

# поскольку эта команда возвращает строку, если интерфейс имеет один IP-адрес, но массив строк, если интерфейс имеет более одного адреса, нам нужно проверить это
if ($localIPs.GetType().Name -eq "string") { # только один IP
  $localIP = $localIPs
}
else { # более одного IP
  $localIP = $localIPs[0] # поскольку кажется, что Windows использует IP-адрес как синоним интерфейса, не важно, какой из адресов этого интерфейса мы используем. Так что мы просто выбираем первый
}

$pingcount = 180

делать {
  ping $HMI4IP -n 1 -w 1000 -S $localIP | Out-Null # перенаправить вывод ping в /dev/null
  $пингответ = $?
  $pingcount = $pingcount - 1
}
до ($pingcount -eq '0' -или $pingreply)
если ($pingreply) {
  # код здесь
}
еще {
  exit 1337 # вернуться с кодом ошибки, мы не достигли цели
}

Для этого мне просто нужно убедиться, что интерфейс, к которому подключены ПЛК и ЧМИ, называется «ПЛК». Затем я получаю адрес в виде строки или массива адресов (в зависимости от того, имеет ли интерфейс один или несколько адресов), которые мне нужно обработать (добро пожаловать в динамическую типизацию...). Затем это так же просто, как передать эти данные для ping (потому что Test-Connection пытается быть слишком умным для своего же блага). В $? Я получаю истину о том, что последняя команда вернула успех, и ложь, если это был сбой. Так что с этим легко справиться.

Насколько я вижу, у Microsoft нет документации об этом поведении и о том, как с этим справиться, что, на мой взгляд, довольно печально.

Ответить или комментировать

Большинство людей не понимают, что склонность к познанию нового открывает путь к обучению и улучшает межличностные связи. В исследованиях Элисон, например, хотя люди могли точно вспомнить, сколько вопросов было задано в их разговорах, они не чувствовали интуитивно связи между вопросами и симпатиями. В четырех исследованиях, в которых участники сами участвовали в разговорах или читали стенограммы чужих разговоров, люди, как правило, не осознавали, что задаваемый вопрос повлияет — или повлиял — на уровень дружбы между собеседниками.