Pull to refresh

Односторонний ping в Windows

Недавно столкнулся на работе со странной проблемой.

Выездная бригада должна была проверить сеть на объекте, подключив 2 ноутбука (А и B)к разным её частям. Картина предстала следующая:

A> ping IP_B - успешно
B> ping IP_A - успешно
A> ping IP_B - с этого момента всегда "превышен интервал ожидания"

Естественно, ноутбуки были немедленно соединены напрямую, но ситуация не изменилась. После ping с ноутбука B, он переставал отвечать на ICMP запросы других узлов сети. При этом сам B пинговал и получал ответы от всех исправно.

Бригада справилась и без ноутбуков, которые с виноватым видом вручили мне: «Посмотри. Сломали может чего...»

Забегая вперед, скажу, что проблема была решена, «виновник» найден. Но причины этой проблемы так и остались покрыты мраком…

Конечно же, коллеги, пытаясь решить проблему, отключили, а затем и снесли антивирус с его брандмауэром, отключили встроенный брандмауэр Windows (на обоих ноутбуках стоит 7 Professional) и перелопатили политики безопасности. В Интернет подобная проблема как-то тоже явно не описана (что странно).

Известно, что односторонний ping, как правило, возникает из-за проблем с маршрутизацией. Но тут были два ноутбука с единственными включенными сетевыми адаптерами (wifi и виртуальные сети, конечно же, тоже отключили) соединенные напрямую двумя метрами витой пары… Необходимость ввода в дело тяжёлой артиллерии в виде WireShark стала очевидна через несколько минут. И вот результат:

IP_A = 192.168.1.10, IP_B = 192.168.1.20

No.     Time           Source                Destination           Protocol Length Info
      1 0.000000000    192.168.1.10          192.168.1.20          ICMP     74     Echo (ping) request  id=0x0001
      2 0.000829000    192.168.1.20          192.168.1.10          ICMP     74     Echo (ping) reply    id=0x0001
      3 1.000483000    192.168.1.10          192.168.1.20          ICMP     74     Echo (ping) request  id=0x0001
      4 1.001482000    192.168.1.20          192.168.1.10          ICMP     74     Echo (ping) reply    id=0x0001
      5 2.000877000    192.168.1.10          192.168.1.20          ICMP     74     Echo (ping) request  id=0x0001
      6 2.001817000    192.168.1.20          192.168.1.10          ICMP     74     Echo (ping) reply    id=0x0001
      7 3.001261000    192.168.1.10          192.168.1.20          ICMP     74     Echo (ping) request  id=0x0001
      8 3.002127000    192.168.1.20          192.168.1.10          ICMP     74     Echo (ping) reply    id=0x0001
     13 24.140313000   192.168.1.20          192.168.1.10          ICMP     74     Echo (ping) request  id=0x0100
     14 24.140386000   192.168.1.10          192.168.1.20          ICMP     74     Echo (ping) reply    id=0x0100
     15 25.145144000   192.168.1.20          192.168.1.10          ICMP     74     Echo (ping) request  id=0x0100
     16 25.145211000   192.168.1.10          192.168.1.20          ICMP     74     Echo (ping) reply    id=0x0100
     17 26.148099000   192.168.1.20          192.168.1.10          ICMP     74     Echo (ping) request  id=0x0100
     18 26.148166000   192.168.1.10          192.168.1.20          ICMP     74     Echo (ping) reply    id=0x0100
     19 27.151163000   192.168.1.20          192.168.1.10          ICMP     74     Echo (ping) request  id=0x0100
     20 27.151231000   192.168.1.10          192.168.1.20          ICMP     74     Echo (ping) reply    id=0x0100
     23 35.536903000   192.168.1.10          192.168.1.20          ICMP     74     Echo (ping) request  <b>id=0x0001</b>
     24 35.537891000   192.168.1.20          192.168.1.10          ICMP     74     Echo (ping) reply    <b>id=0x0100</b>
     25 40.179728000   192.168.1.10          192.168.1.20          ICMP     74     Echo (ping) request  <b>id=0x0001</b>
     26 40.180542000   192.168.1.20          192.168.1.10          ICMP     74     Echo (ping) reply    <b>id=0x0100</b>
     28 45.181687000   192.168.1.10          192.168.1.20          ICMP     74     Echo (ping) request  <b>id=0x0001</b>
     29 45.182177000   192.168.1.20          192.168.1.10          ICMP     74     Echo (ping) reply    <b>id=0x0100</b>
     31 50.185640000   192.168.1.10          192.168.1.20          ICMP     74     Echo (ping) request  <b>id=0x0001</b>
     32 50.186516000   192.168.1.20          192.168.1.10          ICMP     74     Echo (ping) reply    <b>id=0x0100</b>

1-8 это ping A->B
13-20 - ping B->A
23-32 снова ping A->B

Формальная причина «недоступности» ноутбука B выделена жирным шрифтом. Ноутбук начинал отвечать на запросы, искажая поле id в Echo-reply! И утилита ping обосновано считала эти ответы чужими, предназначенными кому-то ещё. Напомню, речь идёт о совершенно стандартном Windows 7 с совершенно стандартным стеком TCP/IPv4 и об обычной утилите ping.

По запросу о возможных причинах такого искажения id (очень похожего на bytes swapping при проблемах с пониманием Little- и Big-Endian) Интернет-таки выдал пару туманных советов смотреть в сторону Windows ICS (Internet connection sharing). Казалось бы, не наш случай — на компьютерах по одному сетевому адаптеру и «расшаривать» их просто некому! Попробуйте ка оставить у себя только одно сетевое соединение и зайти в его свойства. Вы даже не найдёте там вкладки «Доступ», где и включается ICS…

Так вот, причина была всё-таки во включённом ICS на ноутбуке B. Другой сотрудник чуть ли не год назад включал ICS, и, выполнив работу, просто удалил вторую сеть, для которой открывался доступ к основному сетевому адаптеру ноутбука. Вкладка «Доступ» из свойств соединения исчезла, но ICS остался включён. Как этот факт может влиять на искажение Echo-reply да ещё и сугубо после запуска ping на самом проблемном компьютере? На этот вопрос пока ответ только один: может. Если кто-нибудь укажет на философские причины такого поведения ICMP в Windows, буду премного благодарен.

Пока же вывод один: если уж пришлось использовать Windows ICS, отключайте его сразу по окончании работы. Ну, конечно же, если хотите чтоб компьютер корректно отвечал на ICMP-запросы.

Спасибо за внимание!
Tags:
Hubs:
You can’t comment this publication because its author is not yet a full member of the community. You will be able to contact the author only after he or she has been invited by someone in the community. Until then, author’s username will be hidden by an alias.