Диагностика сети: ping, traceroute, dig, nc, tcpdump

↑ Этап 1 · Фундамент: Linux, Bash, сети

Желательно~5 мин чтенияУровень: junior

Зачем это на собесе

«Сайт не открывается» — основа сценарного интервью. Важна последовательность проверок и знание инструментов каждого уровня.

Алгоритм

  1. Воспроизвести и уточнить: кому и откуда недоступно, что именно (ошибка/таймаут), когда началось, что менялось.
  2. Сузить уровень: DNS → маршрут → порт → TLS → HTTP → приложение.
  3. Проверить с разных точек (клиент, сервер, другая сеть).
  4. Собрать доказательства (вывод команд, пакеты), зафиксировать.

ping и traceroute/mtr

ping -c 4 8.8.8.8            # доступность по ICMP и RTT (ICMP может быть закрыт — «нет ping» ≠ «недоступно»)
ping -c 4 example.com        # отличить DNS от сети
ping -M do -s 1472 host      # проверка MTU (DF-бит, 1472 + 28 = 1500)
traceroute example.com       # маршрут по TTL; traceroute -T -p 443 (по TCP)
mtr -rwzbc 100 example.com   # комбинированно: потери и задержка по каждому хопу

Чтение mtr: потери на промежуточном хопе, не продолжающиеся дальше — ограничение ICMP на роутере, не проблема; потери, сохраняющиеся до конечного узла — реальная проблема.

dig и DNS

dig +short example.com
dig @1.1.1.1 example.com
dig +trace example.com
resolvectl query example.com; getent hosts example.com

nc (netcat) и порты

nc -vz host 443                 # TCP: открыт ли порт
nc -vzu host 53                 # UDP (менее надёжно)
nc -l 9000                      # слушать порт (проверка firewall на приёмной стороне)
echo "GET / HTTP/1.0\r\n\r\n" | nc host 80
# bash без nc
timeout 3 bash -c '</dev/tcp/host/443' && echo open || echo closed

Интерпретация: Connection refused — хост достижим, порт никто не слушает (или RST от firewall); timed out — пакеты теряются/DROP (firewall, маршрут, хост недоступен); No route to host — ICMP unreachable.

curl для L7

curl -v https://example.com                # TLS, заголовки, статус
curl -I https://example.com                # только заголовки
curl -w "@format.txt" -o /dev/null -s URL  # тайминги
curl --resolve example.com:443:203.0.113.10 https://example.com    # конкретный IP (обход DNS/балансировщика)
curl -H "Host: example.com" http://203.0.113.10/
openssl s_client -connect example.com:443 -servername example.com -showcerts </dev/null   # сертификат, цепочка, срок
openssl x509 -noout -dates -subject -issuer -in cert.pem

tcpdump и Wireshark

Перехват пакетов — «правда на проводе».

sudo tcpdump -ni any port 443 and host 203.0.113.10
sudo tcpdump -ni eth0 -w capture.pcap 'tcp port 5432'        # в файл → Wireshark
sudo tcpdump -ni any 'tcp[tcpflags] & (tcp-syn|tcp-rst) != 0'     # только SYN и RST
sudo tcpdump -ni any udp port 53
sudo tcpdump -A -s0 port 80                                      # содержимое HTTP (незашифрованное)

Что искать:

  • SYN без SYN-ACK — пакет не доходит или DROP на пути;
  • SYN → RST — порт закрыт;
  • повторные передачи (retransmission), нулевое окно (zero window) — проблемы пропускной способности/получателя;
  • неполное TLS-рукопожатие;
  • разные IP в запросе и ответе (асимметрия, NAT);
  • большие пакеты не проходят (MTU).

Правила: фильтровать по хосту/порту, ограничивать время и объём (-c 1000), не захватывать чувствительные данные без необходимости; -n без резолвинга.

ss, ip, ethtool

ss -tulpn; ss -tan state established '( dport = :443 )'; ss -ti dst host     # метрики TCP: rtt, cwnd, retrans
ip -s link show eth0                    # ошибки и drops интерфейса
ip route get 203.0.113.10; ip neigh
ethtool eth0; ethtool -S eth0 | grep -i -E 'err|drop'

Другие инструменты

  • nmap -sT -p 1-1000 host: сканирование портов (только со своими системами!);
  • iperf3 -s / iperf3 -c host: пропускная способность;
  • nslookup, host, whois;
  • arping, ip neigh: L2;
  • ss -s, netstat -s: статистика протоколов;
  • iftop, nethogs, bmon: кто использует канал;
  • curl -w и httpstat; hey, wrk, k6: нагрузка.

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

ШагПроверкаВывод
1dig site.comнет ответа → DNS
2ping IP / mtr IPнет → сеть/маршрут
3nc -vz IP 443refused → сервис не слушает/закрыт; timeout → firewall/SG
4openssl s_clientошибка → сертификат/TLS
5curl -v502/503/504 → бэкенд/прокси; 404 → маршрутизация; 403 → права/WAF
6на сервере: ss -tulpn, логи nginx/приложения, ресурсысервис упал, перегружен
7изменения: деплой, сертификат, DNS, firewallоткат/исправление

Вопросы с ответами