Суть Читай реальные packet-дампы, route-таблицы и вывод traceroute; декодируй header, предскажи решение forwarding и выбери фикс с наибольшим рычагом.
Высота — путь к senior
НольJuniorMiddleSenior
Ты на senior-высоте — в орбите
◷ 14 min
Packet-дампы, route-таблицы и вывод traceroute — это место, где реально диагностируются проблемы на уровне IP. Прочитай каждый, разберись, что значат байты и колонки, затем выбери решение, которое senior-инженер сделает первым.
Цель
Отработай петлю каждого инцидента с routing или path-MTU: декодируй header или таблицу перед глазами, предскажи поведение и возьмись за фикс, который не зависит от сигнала, который ты не можешь гарантировать.
Сниппет 1 — декодируй IPv4 header
Захват tcpdump -X показывает первые 20 байт IPv4-packet:
Из этого header: какой протокол L4, какой TTL, и о чём значение TTL = 40 скорее всего говорит о пути packet до этого момента?
Heads-up Protocol 6 — это TCP (17 — UDP), а TTL это счётчик hop, а не время, несмотря на название — каждый роутер уменьшает его на единицу.
Heads-up ICMP — это protocol 1; 6 — это TCP. TTL ограничивает максимум оставшихся hop, но ничего не гарантирует о длине пути впереди.
Heads-up IHL считает 32-битные слова: 5 слов = 20 байт, минимальный header. Для 60-байтного header IHL должен быть 15.
Сниппет 2 — route-таблица
$ ip route showdefault via 203.0.113.1 dev eth010.0.0.0/8 via 10.4.0.1 dev eth110.4.0.0/16 via 10.4.0.1 dev eth110.4.2.0/24 dev eth2 scope link
Викторина
Completed
Приходит packet для 10.4.2.9. Какая строка его пересылает и какая обработает packet для 8.8.8.8?
Heads-up Порядок в таблице не решает forwarding — longest-prefix match выбирает /24. И 8.8.8.8 не отбрасывается: default route совпадает со всем как последний резерв.
Heads-up /24 специфичнее /16, поэтому он побеждает для 10.4.2.9. А 8.8.8.8 вне 10.0.0.0/8, поэтому использует default route, а не /8.
Heads-up Default (0.0.0.0/0) — наименее специфичный prefix; он используется, только когда не совпал более длинный. Для 10.4.2.9 есть три более специфичных совпадения.
Сниппет 3 — traceroute
$ traceroute -n example.com 1 192.168.1.1 0.9 ms 2 203.0.113.1 8.4 ms 3 * * * 4 198.51.100.7 24.1 ms 5 93.184.216.34 71.2 ms
Викторина
Completed
На hop 3 три звёздочки, а hop 4 и 5 отвечают нормально. Что происходит на hop 3 и сломан ли путь?
Heads-up Если бы hop 3 отбрасывал трафик data plane, hop 4 и 5 не смогли бы ответить. Звёздочки значат лишь отсутствие ICMP-ответа по TTL, а не сбой forwarding.
Heads-up Петля никогда не дала бы трейсу дойти до hop 4 и 5. Звёздочки — это отсутствующий или rate-limited ICMP-ответ, частая и безобидная конфигурация.
Heads-up Роутеры не шифруют пересылаемые IP-packet. Пропущенная строка — чисто о том, что роутер не возвращает ICMP time-exceeded.
Сниппет 4 — MSS clamping на gateway
# VPN/PPPoE gateway, packet зависают на больших передачах# рассматриваемое правило iptables:iptables -t mangle -A FORWARD -p tcp --tcp-flags SYN,RST SYN \ -j TCPMSS --clamp-mss-to-pmtu
Викторина
Completed
Большие передачи через этот gateway зависают, мелкие проходят. Что делает это правило и почему оно лучше, чем просто разблокировать ICMP?
Heads-up Правило правит опцию MSS внутри SYN; оно не блокирует SYN. Оно предотвращает слишком большие packet, понижая согласованный размер segment, а не обрывая соединения.
Heads-up MSS clamping вообще избегает fragmentation, держа segment мелкими на этапе согласования. Оно правит handshake, а не разбивает packet.
Heads-up Разблокировка ICMP помогает, только если каждый middlebox на пути пропускает ICMP. MSS clamping работает независимо от фильтрации ICMP — именно поэтому это прагматичный фикс.
Итог
Каждый инцидент на уровне IP читается в байтах и колонках: первый ниббл IPv4-header даёт version и длину, байт 8 — это TTL (счётчик hop, а не часы), байт 9 — protocol L4; route-таблица разрешается по longest-prefix match с default route как последним резервом; звёздочки traceroute обычно значат hop, скрывающий ICMP, а не сломанный путь; а правило MSS-clamp чинит зависания path-MTU без опоры на ICMP. Декодируй то, что перед тобой, предскажи поведение, затем чини причину — а не симптом.