Пытаясь устранить неполадки на машине с Windows 10 с нестабильными сетевыми проблемами, я выполнил трассировку маршрута к хосту и получил несколько иные результаты, чем те, что я вижу на своей системе Ubuntu 18.04 с ядром 4.15.0-130. Чтобы исключить факторы оборудования, ненадежные стеки протоколов, проблемы с драйверами и тому подобное, я затем сравнил Windows 10 в виртуальной машине VirtualBox под управлением Linux с тем, что дает мне хост-система. VirtualBox был настроен с NAT, т. е. Windows 10 подключается к хосту, который затем обрабатывает фактический сетевой ввод-вывод. Таким образом, оба сеанса используют один и тот же сетевой адаптер, и все проходит через один и тот же стек протоколов на хосте. VPN не задействован; клиентская машина просто висит на маршрутизаторе WiFi/3G Internet.
К хосту, маршрутизацию которого я отслеживаю, можно получить доступ из Linux (с помощью веб-браузера Firefox), но не из Windows 10 (ни с другого компьютера с Windows 10 с помощью Firefox, ни в VirtualBox с помощью Chrome).
Windows (запущенная в Virtual Box на Linux) выдает мне:
>tracert -d www.brewforafrica.co.za
Tracing route to www.brewforafrica.co.za [41.203.18.81]
over a maximum of 30 hops:
1 <1 ms 1 ms <1 ms 10.0.2.2
2 3 ms 3 ms 3 ms 192.168.0.1
3 56 ms 23 ms 36 ms 10.113.42.52
4 83 ms 31 ms 22 ms 10.251.60.253
5 * * * Request timed out.
6 74 ms 34 ms 29 ms 10.251.60.233
7 88 ms 39 ms 20 ms 10.251.60.234
8 * 103 ms 39 ms 10.113.145.33
9 25 ms 33 ms 24 ms 196.207.35.36
10 82 ms 32 ms 43 ms 192.168.133.110
11 54 ms 25 ms 42 ms 41.21.235.25
12 69 ms 80 ms 62 ms 10.118.24.61
13 103 ms 35 ms 35 ms 196.60.9.24
14 46 ms 45 ms 53 ms 197.189.193.1
15 95 ms 53 ms 35 ms 41.203.18.81
Trace complete.
(Примечание: 10.0.2.2 — это адрес шлюза по умолчанию, предоставляемый VitualBox; Linux обрабатывает все сетевые соединения с этого момента, и поэтому этот переход отсутствует в трассировке ниже.) Повторение той же трассировки с использованием Linux (на той же системе, где запущен сеанс Virtual Box с указанной выше Windows 10) дает мне:
$ traceroute -n www.brewforafrica.co.za
traceroute to www.brewforafrica.co.za (41.203.18.81), 30 hops max, 60 byte packets
1 192.168.0.1 1.416 ms 1.580 ms 1.668 ms
2 10.113.42.52 24.311 ms 25.119 ms 38.804 ms
3 10.251.60.253 39.793 ms 39.875 ms 39.922 ms
4 * * *
5 10.251.60.233 40.122 ms 41.365 ms 51.445 ms
6 10.251.60.234 51.910 ms 50.416 ms 50.508 ms
7 10.113.145.33 50.836 ms 27.691 ms 27.251 ms
8 196.207.35.36 31.254 ms 73.984 ms 63.871 ms
9 192.168.133.110 73.479 ms 73.528 ms 62.612 ms
10 41.21.235.25 52.088 ms 61.699 ms 61.572 ms
11 10.118.24.61 62.102 ms 62.275 ms 61.833 ms
12 196.60.9.24 61.680 ms 51.679 ms 39.123 ms
13 197.189.193.1 40.032 ms 40.073 ms 43.791 ms
14 * * *
15 * * *
16 * * *
17 * * *
18 * * *
19 * * *
20 * * *
21 * * *
22 * * *
23 * * *
24 * * *
25 * * *
26 * * *
27 * * *
28 * * *
29 * * *
30 * * *
$
Чем вызвана эта разница и имеет ли она хоть какое-то значение?
решение1
Это не тот же traceroute. Linux traceroute
на самом деле отправляет UDP-пробы по умолчанию, а не ICMP Echo, как это делает Windows. Используйте, sudo traceroute --icmp
чтобы приблизиться к Windows. (Попробуйте, mtr
пока вы этим занимаетесь.)
Если в конечной системе установлен брандмауэр, который тихо отбрасывает пакеты UDP на неизвестных портах 1 , отсутствие ответа означает, что программа traceroute не сможет узнать, куда они отправились, и, более того, не сможет распознать, что зонды наконец достигли конечного пункта назначения и что нет необходимости продолжать зондировать все большие и большие значения TTL.
1 То же самое произойдет с любым видом traceroute-пробы 2 , но отбрасывание UDP встречается гораздо чаще, чем отбрасывание ICMP Echo. (Это даже не обязательно должна быть преднамеренная блокировка — некоторые операционные системы просто делают это по умолчанию, игнорируя UDP и даже TCP, оставаясь незамеченными, когда стандарты требуют ICMP Port Unreachable. Они часто называют это «скрытым режимом» и утверждают, что это своего рода функция безопасности.)
2 Для traceroute не существует специального типа пакета; инструменты просто отправляют то, что с большой вероятностью вызовет ответ от конечного хоста, не вмешиваясь в работу реальных служб — сюда входят ICMP Echo, а также пакеты UDP на высоких портах и даже пакеты TCP SYN.