OPS Troubleshooting и packet capture — навык №1 на работе

Настроить сеть способен и junior по методичке. Чинить, когда «не работает» и неясно почему — вот за что платят. Это финальный модуль трека: он связывает всё предыдущее в единую методологию. Не «тыкать наугад», а действовать системно — сужать область, проверять гипотезы, читать пакеты. Это же мышление переносится в DevOps один в один.

Инцидент из очереди

«Приоритет ВЫСОКИЙ. После ночных работ в ЦО магазины региона не проводят оплату: кассовое ПО висит на „подключение к серверу…“. Интернет в магазинах есть, сервер в ЦО жив, мониторинг зелёный. Бизнес теряет деньги каждую минуту, на мосту — твой руководитель и директор розницы». Всё «зелёное», а ничего не работает — самый частый и самый неприятный тип инцидента. Паникующий инженер начинает перезагружать всё подряд. Методичный — за 15 минут доходит до причины. Этот урок — о том, как быть вторым. Инцидент разберём до конца в разделе 7.

Что узнаешь — после урока ты сможешь
Вспомни из прошлых модулей — здесь сойдётся всё

Модуль 2: ARP и MAC-таблицы — половина «странных» проблем живёт на L2. Модуль 5: маршрут нужен туда и обратно; longest prefix match. Модуль 10: stateful firewall помнит соединения — и ломается от асимметрии. Модуль 11: ping … source и ping … df-bit есть у всех вендоров — сегодня они главные герои. Если что-то забыл — вернись, этот модуль стоит на плечах всех предыдущих.

1. Мышление: гипотеза, а не догадка

Разница между junior и senior — не в количестве известных команд, а в дисциплине поиска. Senior не «пробует всё подряд», он:

  1. точно формулирует симптом («что именно не работает, для кого, с какого момента»);
  2. выдвигает гипотезу («похоже, нет обратного маршрута»);
  3. делает одну проверку, которая гипотезу подтвердит или опровергнет;
  4. фиксирует результат и сужает область — и так до причины.
Золотое правило: меняй по одному параметру за раз. Поменял три вещи разом и «заработало» — ты не знаешь, что починило, и не научился. Хуже — мог замаскировать настоящую проблему.
Второе золотое правило: «что менялось?» — первый вопрос, а не последний. 80% инцидентов — следствие недавнего изменения. В нашем инциденте из заявки первая зацепка уже есть: «после ночных работ в ЦО». Список ночных изменений — твой главный список подозреваемых.

2. Четыре методологии

МетодСутьКогда применять
Bottom-upснизу вверх по OSI: кабель → линк → IP → транспорт → приложение«вообще ничего не работает», физические подозрения
Top-downсверху вниз: от приложения к физике«одно приложение барахлит», остальное ок
Follow-the-pathидём по реальному пути пакета хоп за хопомпроблема «где-то между A и B»
Divide-and-conquerпроверяем середину пути/стека, отсекаем половинудлинный путь/стек, хотим быстро локализовать
Bottom-up по OSI: проверяем уровень за уровнем
L1 Физикаshow interface · свет на порту · кабель L2 КаналMAC-таблица · ARP · VLAN · STP L3 Сетьping · ip route · gateway · NAT L4 Транспортпорт открыт? · ACL/firewall · TCP-флаги L7 ПриложениеDNS · сертификат · логи приложения проверяем снизу вверх Нашёл проблему на уровне N — выше можно не лезть, пока не починишь N.
Самая частая стартовая стратегия: 80% проблем сидят на L1–L3, и их быстро видно снизу.

3. Вопросы на каждом уровне OSI

🌉 Этот OSI-чеклист — универсальная отмычка и в DevOps. «Сервис в Kubernetes недоступен» проверяется тем же путём: под жив (L1/L7 контейнера) → Service/endpoints (L3/L4) → NetworkPolicy/SG (L4) → DNS (CoreDNS, L7) → Ingress/сертификат (L7).

4. Инструменты: что когда

ИнструментОтвечает на вопрос
pingесть ли L3-связность и какая задержка/потери
traceroute / mtrпо какому пути идёт трафик и на каком хопе проблема
ip route get / show ip routeкаким маршрутом пакет уйдёт (до отправки)
ss / show ip ... briefслушается ли порт, в каком состоянии соединения
dig / nslookupправильно ли резолвится DNS
telnet host 443 / nc -zvоткрывается ли конкретный TCP-порт (быстрее захвата)
tcpdump / Wiresharkчто РЕАЛЬНО летит по проводу — последняя инстанция истины
mtr = traceroute + ping в реальном времени. Показывает потери и задержку на каждом хопе непрерывно — идеален для «иногда тормозит». Часто это лучший первый инструмент после ping.

5. Ликбез: TCP-рукопожатие и флаги — азбука чтения захватов

Чтобы читать захваты, нужен минимум теории TCP, который в этом треке ещё не звучал. Каждое TCP-соединение начинается с рукопожатия из трёх пакетов:

SYN → : «хочу соединиться»
Клиент шлёт пакет с флагом SYN на порт сервера. Это тот самый «стук в дверь».
← SYN-ACK: «слышу, заходи»
Сервер отвечает SYN+ACK — порт открыт и готов. Нет этого пакета — нет и соединения, всё остальное бессмысленно проверять.
ACK → : «иду» — соединение установлено
Клиент подтверждает — дальше летят данные. Закрытие — флагами FIN (вежливое) или RST (грубый разрыв «уходи немедленно»).

Словарь флагов, который покрывает 95% диагностики:

Что видишь в захватеЧто это значит
SYN → SYN-ACK → ACKсоединение установилось — L1–L4 в порядке, ищи проблему выше
SYN → SYN → SYN (повторы)ответа нет: порт за молчаливым firewall (drop) или пакет не доходит
SYN → RSTсервер жив, но порт закрыт (или reject на firewall) — до сервера пакет дошёл!
retransmission / dup ACKпотери на пути: физика, перегруз, полисер
RST посреди сессиикто-то разорвал: приложение упало, firewall прибил idle-сессию, IPS вмешался
Запомни пару «drop vs reject»: тишина в ответ на SYN = drop (молча выкинули), мгновенный RST/ICMP unreachable = reject (вежливо отказали). По одному этому признаку ты уже знаешь, как настроен firewall на пути.

6. Packet capture: «когда сомневаешься — захвати трафик»

Все show-команды показывают, что устройство думает. Захват пакетов показывает, что происходит на самом деле. Это конечная истина: «дошёл ли пакет», «кто ответил», «какие флаги», «где обрывается».

Где ставить захват: в точке, где гипотеза проверяется
клиент R1 R2 сервер 📷дошёл сюда? 📷прошёл R1? 📷долетел до сервера? Захватывая в нескольких точках, видишь, на каком отрезке пакет пропадает — и сужаешь до устройства.
Запрос ушёл, но ответа нет? Захват на сервере покажет: «запрос дошёл, ответ ушёл» → теряется обратный путь.
# tcpdump: классика на сервере/Linux-роутере $ tcpdump -ni eth0 host 10.0.0.10 and port 443 # только нужный трафик $ tcpdump -ni eth0 'tcp[tcpflags] & tcp-syn != 0' # только SYN — кто стучится $ tcpdump -ni any icmp # весь ICMP (ping) $ tcpdump -ni eth0 -w capture.pcap # в файл → открыть в Wireshark $ tcpdump -ni eth0 port 443 and not port 22 # работаешь по SSH? исключи его, # иначе захват ловит сам себя # Cisco: встроенный захват (EPC) R1# monitor capture CAP interface gi0/0 both match ipv4 any any R1# monitor capture CAP start R1# monitor capture CAP export tftp://10.0.0.5/cap.pcap # забрать и открыть в Wireshark

Как читать строку tcpdump — по кусочкам:

14:02:11.324 IP 10.0.0.5.51002 > 10.0.0.10.443: Flags [S], seq 883, win 64240, length 0 время кто (IP.порт) кому (IP.порт) флаги (S=SYN) номер окно байт данных

Главные display-фильтры Wireshark

ip.addr == 10.0.0.10 # весь трафик с/на хост tcp.port == 443 # по порту tcp.flags.syn == 1 && tcp.flags.ack == 0 # только SYN (попытки соединения) tcp.analysis.retransmission # ретрансмиты → потери/перегруз tcp.analysis.flags # все «проблемные» пакеты разом dns # DNS-запросы и ответы tls.handshake.type == 1 # Client Hello (начало TLS) icmp # ping и ICMP-ошибки (в т.ч. fragmentation needed)
Три кнопки Wireshark, которые делают половину работы: ПКМ по пакету → Follow → TCP Stream (вся сессия как диалог), Statistics → Conversations (кто с кем и сколько говорил — мгновенно видно «главного болтуна»), Analyze → Expert Information (все аномалии списком). Не листай пакеты глазами — спрашивай у Wireshark.

7. Разбор руками: инцидент «всё зелёное, кассы стоят» до конца

Вернёмся к инциденту из начала урока и пройдём его по методологии, шаг за шагом:

Симптом точно
Кассовое ПО всех магазинов региона не соединяется с сервером ЦО (TCP 9443). Интернет в магазинах работает. Началось после ночных работ. Формулировка уже сужает: не «сеть лежит», а «конкретный поток магазины→ЦО:9443 не ходит». Метод — follow-the-path.
Что менялось?
Читаем журнал ночных работ: «перенос кассового сервера на новую ферму, IP сохранён; обновление правил на новом firewall ЦО». Два подозреваемых. Гипотеза №1: новый firewall режет 9443.
Дешёвые проверки с магазина
ping 10.50.0.10 (сервер) — ходит! Значит L3 до сервера жив, ICMP firewall пропускает. telnet 10.50.0.10 9443 — висит и отваливается по таймауту. Тишина, не RST → похоже на молчаливый drop (раздел 5). Гипотеза №1 крепнет.
Захват на сервере — и сюрприз
На сервере: tcpdump -ni eth0 port 9443. Ожидали тишину (firewall дропает до сервера), а видим:
10.20.3.5.50112 > 10.50.0.10.9443: Flags [S] # SYN магазина ДОШЁЛ 10.50.0.10.9443 > 10.20.3.5.50112: Flags [S.] # сервер ответил SYN-ACK… 10.20.3.5.50112 > 10.50.0.10.9443: Flags [S] # …но клиент шлёт SYN снова: SYN-ACK до него не дошёл!
Запрос доходит, ответ уходит — но теряется обратный путь. Гипотеза №1 отклонена, новая: асимметрия — SYN-ACK возвращается не через новый firewall.
Проверяем обратный маршрут
На новой ферме: ip route get 10.20.3.5 → default через старый шлюз! При переносе сервера маршрут на сети магазинов не переехал. Итог: SYN входит через новый stateful firewall, SYN-ACK выходит через старый — новый firewall не видит ответа, сессия не собирается, а старый дропает «незнакомый» SYN-ACK (модуль 10: stateful ломается от асимметрии).
Фикс, проверка, фиксация
Добавляем на ферме маршрут сетей магазинов через новый шлюз → telnet с магазина на 9443 открывается → кассы проводят оплату. В тикет: причина (асимметричный обратный маршрут после переноса), проверка (захват), фикс, и пункт в чек-лист переноса серверов на будущее: «проверить обратные маршруты». Инцидент закрыт — и команда стала умнее.
Чему учит этот разбор Мониторинг был «зелёным», ping ходил, порт слушался — все косвенные признаки говорили «всё хорошо». Правду сказал только захват: одна строка с повторным SYN при ушедшем SYN-ACK. И заметь: мы не перезагрузили ни одного устройства и не поменяли ничего наугад — каждая проверка отвечала на конкретную гипотезу.

8. Разбор типовых сценариев

Сценарий A: «сайт не открывается»

Идём bottom-up быстро: ping IP сервера — идёт? Значит L1–L3 ок, проблема выше. ping по имени — не идёт? → DNS. Резолвится, но порт не открывается? → tcpdump покажет, кто молчит.

── tcpdump на клиенте: видим SYN без ответа ── 10.0.0.5.51002 > 10.0.0.10.443: Flags [S], seq 1 # SYN ушёл 10.0.0.5.51002 > 10.0.0.10.443: Flags [S], seq 1 # retransmit — ответа нет 10.0.0.5.51002 > 10.0.0.10.443: Flags [S], seq 1 # снова тишина → порт закрыт / firewall дропает

SYN уходит, SYN-ACK не приходит → либо порт не слушается, либо firewall/ACL молча дропает (если бы reject — пришёл бы RST). Дальше — захват на сервере: дошёл ли SYN туда вообще.

Сценарий B: «работает, но медленно/рвётся»

mtr покажет потери на конкретном хопе. В Wireshark — массовые tcp.analysis.retransmission и duplicate ack = потери. Если задержка скачет — jitter/перегрузка (вспомни QoS, модуль 9).

Сценарий C: «маленькие пакеты идут, большие — нет» — классика MTU

Симптом-маркер: ping обычным размером — ок, ping -s 1500 — теряется; SSH подключается, но «виснет» при выводе; сайт открывается, но картинки не грузятся. Это проблема MTU / fragmentation (туннель, VXLAN, PPPoE съели часть MTU, а DF-бит мешает фрагментации).

── ICMP подсказывает прямо ── ICMP 10.0.12.2 > 10.0.0.5: frag needed and DF set (mtu 1400) # роутер кричит: уменьши пакет!

Проверка: ping -M do -s 1472 IP (Linux) — подбираешь максимальный проходящий размер. Лечение: правильный MTU/MSS clamping на туннеле.

Сценарий D: «иногда не туда» — асимметрия/дубликат IP

Дубликат IP (две машины с одним адресом) — ARP «прыгает», часть трафика уходит не туда. Видно в захвате как ARP-ответы от разных MAC на один IP. Асимметричный маршрут ломает stateful firewall (ответ идёт другим путём) — ты видел это в разделе 7 на живом инциденте.

Сценарий E: «всё открывается, но с задержкой ровно в несколько секунд»

Подозрительно одинаковая задержка (2, 5, 10 секунд) перед каждым соединением — почти всегда таймаут DNS: первый DNS-сервер в настройках мёртв, клиент ждёт таймаут и идёт ко второму. Проверка: dig @первый-DNS имя (молчит?) и фильтр dns в Wireshark — виден запрос без ответа и повтор к другому серверу. Лечение: убрать/починить мёртвый резолвер. Ровные «ступеньки» задержки — это таймауты, а не «медленная сеть».

9. Боевой чеклист (распечатай и держи рядом)

Когда «не работает»
  1. Сформулируй симптом точно: кто, что, куда, с каких пор, всем или одному.
  2. Воспроизводится ли? Менялось ли что-то недавно (главный подозреваемый)?
  3. Локализуй: один хост или все? одно приложение или всё? один сайт или весь интернет?
  4. ping по IP → ping по имени (отсекаешь DNS) → traceroute/mtr (где обрыв).
  5. Проверь маршрут туда и обратно (обратный забывают чаще всего).
  6. Порт: слушается? ACL/firewall/SG? (ss, telnet/nc на порт, захват SYN).
  7. Сомневаешься — захвати трафик в подозрительной точке.
  8. Меняй по одному. Зафиксируй, что починило. Запиши в заметки.

10. Мини-лаба: поймай свои первые пакеты сегодня

Всё, что нужно, — твой компьютер и бесплатный Wireshark. 20 минут:

Поймай TCP-рукопожатие
Запусти захват в Wireshark, открой любой сайт, останови. В фильтр: tcp.flags.syn == 1. Найди пару SYN → SYN-ACK и следом ACK — ты видишь живое рукопожатие из раздела 5. Посмотри время между SYN и SYN-ACK — это RTT до сервера.
Прочитай DNS-диалог
Фильтр dns. Найди запрос A-записи и ответ с IP. Сколько миллисекунд между ними? Теперь ты знаешь, как выглядит «нормальный» DNS — и узнаешь ненормальный (запрос без ответа, сценарий E).
Follow TCP Stream
Найди любой HTTP-пакет (фильтр http; если всё в TLS — открой http://neverssl.com), ПКМ → Follow → TCP Stream. Перед тобой сессия целиком: запрос браузера и ответ сервера как текст. Это главный приём чтения прикладных протоколов.
Устрой себе drop и посмотри на него
Запусти захват и сходи telnet'ом на закрытый порт живого хоста (telnet 8.8.8.8 4444). Смотри в захвате: SYN, SYN, SYN — и тишина (drop по пути). Теперь на telnet localhost 4444: мгновенный RST (порт закрыт, reject). Ты только что увидел разницу drop vs reject собственными глазами.
Найди потолок MTU
Windows: ping 8.8.8.8 -f -l 1472, Linux/mac: ping -M do -s 1472 8.8.8.8. Проходит? Уменьшай, если нет. Запусти при этом захват с фильтром icmp — если по пути узкий MTU, увидишь «frag needed» своими глазами.

11. Словарик урока

ТерминПо-английскиСмысл в одну строку
Рукопожатие3-way handshakeSYN → SYN-ACK → ACK: три пакета, открывающие любое TCP-соединение
Ретрансмитretransmissionповтор пакета, на который не пришло подтверждение — маркер потерь
Drop / rejectмолча выкинуть пакет (тишина) / отказать явно (RST или ICMP unreachable)
RSTresetгрубый разрыв соединения: «порт закрыт» или «сессию прибили»
Захватpacket capture, pcapзапись реальных пакетов с интерфейса; .pcap — её формат
Capture vs display filterфильтр при записи (tcpdump/BPF) vs фильтр при просмотре (Wireshark)
SPAN / зеркало портаport mirroringкоммутатор копирует трафик порта на порт с анализатором
Асимметричный маршрутasymmetric routingтуда и обратно — разными путями; убийца stateful firewall
MSS clampingTCP MSS adjustпринудительное уменьшение размера TCP-сегментов на туннеле — лечение MTU-блэкхола
Экспертная сводкаExpert Informationсписок всех аномалий захвата одним окном в Wireshark

12. Мост в DevOps

Эта методология — самое ценное, что ты унесёшь в DevOps. Она не про Cisco, она про мышление:

🌉 Финал трека

Ты прошёл путь от кабеля (модуль 1) до отладки целой сети. Сетевик, который понимает пакет и умеет его поймать, становится незаменимым в любой DevOps-команде — потому что «непонятные сетевые проблемы» есть везде, а решать их умеют единицы. Дальше — сетевая автоматизация (NetDevOps) и облако. У тебя теперь есть фундамент, которого нет у 90% входящих в DevOps.

13. Вопросы с собеседования

❓ «Пользователь говорит — интернет не работает». Твои первые шаги?
Уточнить симптом (всё или один сайт, один ПК или все). Затем: ping по IP (есть ли L3) → ping по имени (DNS?) → traceroute/mtr (где обрыв) → проверить gateway/маршрут. Сужаю область, не тыкаю наугад.
❓ Чем bottom-up отличается от top-down?
Bottom-up — от физики вверх по OSI (когда «всё лежит»). Top-down — от приложения вниз (когда барахлит одно приложение, а сеть в целом жива). Выбор зависит от симптома.
❓ Ping маленьким пакетом проходит, большим — нет. Что это?
Классическая проблема MTU (туннель/VXLAN/PPPoE уменьшили MTU, DF-бит мешает фрагментации). Проверяю ping -M do -s …, лечу MSS clamping / правильным MTU.
❓ SYN уходит, ответа нет. Drop или reject — как отличить?
Если firewall reject — придёт RST (или ICMP unreachable). Если drop — тишина, клиент ретрансмитит SYN и отваливается по таймауту. Тишина в захвате = молчаливый дроп.
❓ Захват на сервере показывает: запрос пришёл, ответ ушёл. Клиент ответа не видит. Где искать?
Обратный путь: асимметричный маршрут (ответ уходит другим путём и гибнет на stateful firewall), неверный/отсутствующий обратный маршрут, NAT в одну сторону. Проверяю ip route get <клиент> на сервере и захватом на промежуточных точках обратного пути.

14. Частые ошибки джунов

ошибка 1 Тыкают наугад и меняют всё разом. «Заработало», но непонятно почему — и проблема вернётся. Гипотеза → одна проверка.
ошибка 2 Верят show-командам больше, чем пакетам. Устройство «думает», что всё ок, а пакет не летит. Захват — последняя истина.
ошибка 3 Забывают обратный путь. «Запрос уходит, ответа нет» почти всегда = нет обратного маршрута/NAT/асимметрия.
ошибка 4 Игнорируют ICMP. А он часто прямо сообщает причину (frag needed, host unreachable, TTL exceeded). Не блокируй весь ICMP бездумно.
ошибка 5 Не спрашивают «что менялось». 80% инцидентов — следствие недавнего изменения. Это первый вопрос, а не последний.
ошибка 6 Захватывают всё подряд без фильтра. Гигабайты мусора, в которых тонет нужный пакет, а на нагруженном сервере — ещё и просадка производительности. Сначала фильтр (host/port), потом захват.

15. Задачи: поставь диагноз по захвату

Задача 1. В захвате: SYN → мгновенный RST от сервера. Порт 8080. Что это значит и куда идти дальше?

Пакет дошёл до сервера (сеть работает!), но порт 8080 никто не слушает — или локальный firewall отвечает reject. Дальше — на сервер: ss -tlnp | grep 8080 — запущено ли приложение. Это уже не сетевая проблема, а прикладная.

Задача 2. Пользователь: «всё открывается, но каждый сайт думает секунд пять, потом резко грузится». Диагноз?

Ровная задержка перед каждым соединением = таймаут, почти наверняка DNS: первый резолвер в настройках мёртв, клиент ждёт и идёт ко второму. Проверка: dig @первый-DNS и фильтр dns в Wireshark (запрос без ответа + повтор к другому серверу).

Задача 3. mtr до сервера показывает 30% потерь на хопе 4, но 0% на хопах 5–9 и на финальном. Сеть теряет пакеты?

Нет. Потери «в середине», которые исчезают на следующих хопах, — это роутер хопа 4 деприоритизирует ответы на TTL-exceeded (control plane policing), а транзитный трафик прогоняет без потерь. Смотри на потери последнего хопа — только они реальны для трафика. Классическая ловушка чтения mtr.

Задача 4. В Wireshark у одного IP в ARP-ответах то MAC aa:aa…, то MAC bb:bb…. Симптомы у пользователей: «то работает, то нет». Что происходит?

Дубликат IP: два устройства отвечают на один адрес (или кто-то поднял виртуалку со статическим IP шлюза). ARP-таблицы соседей «прыгают» между MAC. Найти оба устройства по MAC (таблицы коммутаторов, модуль 2) и разнести адреса.

Задача 5. SSH на сервер подключается, команды работают, но «cat большого файла» вешает сессию намертво. Что проверишь первым?

MTU: интерактивные команды — маленькие пакеты, вывод файла — большие, и они гибнут на узком MTU (туннель по пути). ping -M do -s 1472 сервер, затем вниз до проходящего размера; лечение — MSS clamping или починка MTU на туннеле.

Задача 6. После переноса VM «пинг до неё есть, а соединения не открываются ни на один порт». На VM захват: SYN приходят, SYN-ACK уходят. Диагноз без единой лишней команды?

Точная копия инцидента из раздела 7: обратный путь асимметричен — SYN-ACK уходит не тем маршрутом (старый шлюз в конфиге VM) и гибнет на stateful firewall. Проверка: ip route get <адрес клиента> на VM. Фикс: поправить шлюз/маршруты после переноса.