Звездочки во время трассировки через IPsec

Недавно обратился клиент с вопросом почему у него при трассировке появляются звездочки. Трассировка проходила через IPsec тоннель, поэтому коротким ответом было: потому что IPsec не возвращает ICMP reply. Но у клиента также была проблема с маршрутизацией, причину которой он связывал со "звездочками". И все это происходило на фаерволе USG Huawei, с которым клиент имел дело впервые. Иными словами, коротким ответом он не удовлетворился.

Это условно топология, которая была у клиента. С AR3 клиент запускал tracert до AR2, который находился за IPSec тоннелем между FWA и FWC, и получал звездочки. Вопрос был почему при команде tracert клиент видит *, и никакой другой информации?

Цифры слева в первом столбике означают количество переходов (hops).

Звездочки - это количество ICMP запросов (3 отправляется по умолчанию).

Если ICMP Reply приходит на интерфейс, то ПК фиксирует время в милисекундах. Это Delta time, то есть время, которое прошло от момент отравки сообщения до его получения - round trip time (RTT). IP адрес хопа (hop) - это адрес маршрутизирующего устройства, которое отправило Reply.

В данном случае у нас было три перехода: локальный фаервол USG, удаленный фаервол, и AR2 (10.77.1.222).

Wireshark дамп с принимающего интерфейса Gi1/0/1 на FWA показал, что было отправлено 3 пакета, затем еще 3 пакета, и на них не было ответа. И только на следующие три запроса были получены ICMP reply от 10.77.1.222.

Почему не были получены ответы на первые 6 пакетов? Потому что их никто не отправлял.

Первое. На локальном фаерволе для теста был настроен пропуск всего трафика: на интерфейсах прописана команды undo security-manage enable, в security-policy прописана команда default action permit. То есть локальный фаервол не мог отбросить ICMP reply, если бы они были.

IPSec шифровал трафик локальных сетей:

display ipsec sa

    Flow source       : 10.1.180.0/255.255.255.0 0/0-65535

    Flow destination  : 10.77.1.0/255.255.255.0 0/0-65535

Это значит, что трафик из сети 10.1.180.0/24 в сеть назначения 10.77.1.0/24 должен шифроваться.

Второе, это поле TTL в ICMP пакете: в каждой серии пакетов оно разное: 1, 2 и 3:

Когда маршрутизирующее устройство получает пакет, в котором TTL равно 1, оно должно отправить в ответ ICMP Reply, в котором оно сообщит о том, что TTL в этом пакете достигло минимального значения и дальше пересылаться не может, автоматически при этом сообщив свой IP.

Это сообщение получает ПК, который отправляет traceroute, и эту полученную информацию вставляет в первую строчку (1). Если ответа не поступает, то появляется звездочка.

Фаервол видел, что адрес отправителя и адрес получателя пакета мачился его IPsec ACL, и брался за его обработку. После он обнаруживал, что TTL в этом пакете был равен 1, и отбрасывал его, не отправляя никакого ответа, не предоставляя информации о себе: не отправлял ICMP-сообщение Time Exceeded ICMP, а молча отбрасывал пакет.

Другие 3 следующие пакета в них TTL был равен 2. Это значило, что фаервол FWA пропустил их, уменьшив TTL на одну единицу и отправил дальше, в данном случае фаерволу FWC. В Wireshark эти три пакета на исходящем линке FWA:

Эти три пакета имели другие адреса отправителя и получателя. Это потому что оригинальный пакет инкапсулировался ESP протоколом.

Kогда IPSec фаервола FWC получал эти пакеты с TTL равным 1, то он тоже отбрасывал их, и не отправлял никакого ответа обратно. Так получалась вторая строчка со звездочками.

Только следующие финальные три пакета с TTL 3, достигнув адреса назначения 10.77.1.222, сгенерировали ICMP reply. AR2, получив эти запросы, ответил на них, потому что он - адрес назначения пакета, и потому что пакет этот уже деинкапсулирован, то есть без ESP, иными словами, обычный ICMP запрос.

ICMP запросы и ответы на линке между FWC и AR2
ICMP запросы и ответы на линке между FWC и AR2

Почему переходов только три, а не множество, ведь маршрут шел через Интернет. Потому что туннелированный пакет (оригинальный пакет) не входил в Интернет. Он инкапсулировался во внешний пакет, который пересекал эту зону. Соответственно, туннель уменьшал TTL только на 1, и traceroute рассматривал туннель как один переход, независимо от количества переходов, которые принимал внешний пакет.

--

Более подробно про то, как работает traceroute - Глубокое погружение в TTL: traceroute.

Проблема с маршрутизацией, в которой клиент винил "звездочки", но которая к ним не имела никакого отношения - Локальная сеть 10.77.1.0/24 не видна за IPsec тоннелью.