Learning Platform
Глоссарий Troubleshooting
Урок 13.04 · 25 мин
Средний
pingdignslookupssnetstatnctracerouteDNS

Сетевая диагностика: ping, dig, ss, nc, traceroute

DE постоянно сталкивается с сетевыми проблемами: «Airflow не видит Postgres», «s3 timeout», «Kafka брокер недоступен». Чтобы не звать DevOps на каждую проблему — нужно базовое умение диагностировать сетевые проблемы самостоятельно.

В этом уроке — набор инструментов: ping для проверки доступности, dig для DNS, ss для просмотра открытых портов, nc для проверки TCP connectivity, traceroute для пути.


ping и traceroute: диагностика сетевого пути

ping — проверить, жив ли хост

# Простой ping
ping google.com

# Отправить 4 пакета и выйти (Linux)
ping -c 4 google.com

# Интервал 0.5 секунды
ping -i 0.5 google.com

# Только IPv4
ping -4 google.com

# С таймаутом
ping -W 2 google.com    # таймаут 2 секунды на ответ

Output ping:

PING google.com (142.250.74.78): 56 data bytes
64 bytes from 142.250.74.78: icmp_seq=0 ttl=116 time=12.4 ms
64 bytes from 142.250.74.78: icmp_seq=1 ttl=116 time=11.8 ms
...
4 packets transmitted, 4 packets received, 0.0% packet loss

Что смотрим:

  • icmp_seq — номер пакета. Если пропадают (1, 2, 4 — нет 3) — packet loss.
  • time — задержка в миллисекундах. Стабильность важна (если jitter большой — нестабильная связь).
  • TTL — Time To Live. Уменьшается на 1 на каждом hop. Может намекать на маршрут.
WARNING

ping использует ICMP, а не TCP/UDP. Многие компании блокируют ICMP в firewall ради security. Если ping не отвечает — это не всегда значит, что хост недоступен. Может работать TCP к нужному порту. Проверяй через nc или curl.

# Альтернатива ping для проверки доступности TCP-порта
nc -zv host 80     # проверка порта 80
nc -zv host 443    # 443

dig — DNS lookup

dig (Domain Information Groper) — главный инструмент для DNS-запросов.

# Простой A-record lookup
dig google.com

# Только короткий ответ (IP)
dig +short google.com
# 142.250.74.78

# Конкретный тип записи
dig google.com A
dig google.com AAAA      # IPv6
dig google.com MX        # mail servers
dig google.com NS        # name servers
dig google.com TXT       # текстовые записи, часто SPF/DKIM
dig google.com CNAME     # alias

# Через конкретный DNS-сервер
dig @8.8.8.8 google.com
dig @1.1.1.1 google.com

# Обратный lookup (IP -> имя)
dig -x 142.250.74.78

Полный вывод dig содержит много информации:

;; ANSWER SECTION:
google.com.        239    IN    A    142.250.74.78

;; Query time: 12 msec
;; SERVER: 192.168.1.1#53(192.168.1.1)

SERVER — какой DNS-резолвер использован. Это уровень /etc/resolv.conf.

# Текущий DNS resolver
cat /etc/resolv.conf
# nameserver 192.168.1.1
# nameserver 8.8.8.8

DE-сценарий: «Postgres host не резолвится»:

dig postgres.internal.company.com
# Если NXDOMAIN — DNS не знает имя
# Если есть answer но не правильный IP — DNS возвращает мусор (часто из-за split DNS / VPN)
# Проверить через другой DNS
dig @8.8.8.8 postgres.internal.company.com

dig и DNS диагностика: разбор ответа DNS полностью

nslookup — старый DNS клиент

nslookup — старый инструмент, ещё работает, но dig лучше:

nslookup google.com
# Server:    192.168.1.1
# Address:   192.168.1.1#53
#
# Non-authoritative answer:
# Name:      google.com
# Address:   142.250.74.78

# В скриптах лучше dig +short

Используется в туториалах из 2000-х. В современных DE — dig.


ss/netstat для диагностики: что занимает порты

ss — открытые сокеты и порты

ss (socket statistics) — заменил netstat (который deprecated, но всё ещё везде есть).

# Все TCP сокеты
ss -t

# Listening TCP сокеты (порты, на которых что-то слушает)
ss -tl

# Listening с PID процесса
sudo ss -tlnp

# UDP
ss -ul

# Что слушает порт 5432 (Postgres)?
sudo ss -tlnp | grep :5432
# LISTEN 0    128    *:5432    *:*    users:(("postgres",pid=1300,fd=4))

# Все established соединения
ss -t state established

# С конкретным удалённым IP
ss -t '( dst 10.0.5.42 )'

Флаги:

Главные флаги ss

Запомни 4 буквы: -tlnp

-tTCP (по умолчанию все)
-uUDP
-lListening (sockets, на которых сервис слушает)
-nNumeric — не резолвить имена в номера. Быстрее и без surprises
-pProcess — показать какой процесс владеет сокетом. Нужны sudo для чужих
# Стандартная DE-команда: что слушает на сервере
sudo ss -tlnp

# Результат:
# State    Recv-Q Send-Q  Local Address:Port  Peer Address:Port  Process
# LISTEN   0      128     *:80                 *:*               users:(("nginx",pid=1234,fd=6))
# LISTEN   0      128     127.0.0.1:5432       *:*               users:(("postgres",pid=2345,fd=4))
# LISTEN   0      128     *:8080               *:*               users:(("airflow",pid=3456,fd=12))

Колонки:

  • Local Address:Port — где слушает. *:5432 — на всех интерфейсах. 127.0.0.1:5432 — только localhost.
  • Peer Address:Port — удалённая сторона (для listening = *:*).
  • Process — кто слушает (нужны sudo для чужих процессов).

netstat (deprecated, но встречается)

# Старая команда — то же что ss -tlnp
sudo netstat -tlnp

# Все соединения
netstat -an

netstat deprecated с 2014 года. На современных дистрибутивах часто не установлен — нужно ставить net-tools. Используйте ss где возможно.


nc — Swiss Army knife сетевой

nc (netcat) — универсальный инструмент для всего TCP/UDP:

# Тест: открыт ли TCP порт
nc -zv host.com 5432
# -z = port scan (не передавать данные)
# -v = verbose (показать результат)

# Если порт открыт:
# Connection to host.com 5432 port [tcp/postgresql] succeeded!

# Если закрыт или фильтруется:
# nc: connect to host.com port 5432 (tcp) failed: Connection refused

Это must-know для DE. Когда «Airflow не подключается к Postgres» — первый шаг диагностики:

# С самого Airflow-сервера проверяем доступность Postgres
nc -zv pg.internal.company.com 5432

# Если OK — проблема в авторизации/credentials
# Если timeout — проблема в сети/firewall

nc также умеет:

# Простой TCP-сервер для тестирования
nc -l 1234
# Слушает порт 1234 — что прислали, выведет в stdout

# Из другого терминала — клиент
nc localhost 1234
# Печатайте текст — придёт на сервер

# Передать файл
# На приёмнике:
nc -l 1234 > received.txt
# На отправителе:
nc receiver-host 1234 < file.txt

В DE используется редко, но полезно знать.


telnet — interactive TCP

telnet устарел для удалённого shell (заменён ssh), но отличный для interactive TCP:

# Подключиться к SMTP, посмотреть banner
telnet mail.example.com 25

# К HTTP
telnet google.com 80
# (если соединение есть)
GET / HTTP/1.1
Host: google.com
(пустая строка)
# Получим HTTP-ответ

# К Redis
telnet localhost 6379
PING
+PONG
QUIT

Полезно для manual protocol testing: послать команду «руками», увидеть ответ. Для Postgres protocol сложнее (бинарный), для Redis/SMTP/HTTP — просто.


traceroute / mtr — путь до хоста

# Linux
traceroute google.com

# macOS
traceroute google.com

# Modern: mtr — combination of ping + traceroute, интерактивный
mtr google.com

Вывод:

 1  192.168.1.1     1 ms     1 ms     1 ms
 2  10.50.50.1      8 ms     8 ms     9 ms
 3  isp-router      12 ms    11 ms    12 ms
 ...
12  google.com      45 ms    46 ms    44 ms

Каждая строка — hop (роутер) между вами и destination. Видно, где задержка возникает.

DE-сценарий: «Connection к AWS S3 медленный из московского офиса». Trace показывает на каком hop задержка — обычно на cross-Atlantic линке.


DE-сценарии

1. «Airflow worker не подключается к Postgres»

# Шаг 1: с airflow-сервера проверяем DNS
ssh airflow-worker
dig postgres.internal.company.com +short
# Если ничего — DNS не работает
# Если IP — двигаемся дальше

# Шаг 2: проверяем TCP connectivity
nc -zv postgres.internal.company.com 5432
# Если refused — postgres не слушает на том порту, или firewall блокирует
# Если timeout — сеть/firewall
# Если succeeded — TCP работает, ищем проблему в credentials/SSL

# Шаг 3: если TCP OK, попробовать psql
psql -h postgres.internal.company.com -U airflow -d airflow
# Возможные ошибки: pg_hba.conf не разрешает, неверный пароль, SSL mismatch

2. «Сервис на порту 8080 запущен, но не отвечает»

# На сервере: что реально слушает на 8080?
sudo ss -tlnp | grep :8080

# Если ничего — сервис не слушает на этом порту
# Если есть, но на 127.0.0.1:8080 — слушает только localhost (не из сети)
# Если 0.0.0.0:8080 или *:8080 — слушает на всех интерфейсах

# Проверить firewall
sudo iptables -L -n | grep 8080
# или (modern)
sudo nft list ruleset | grep 8080

3. «Высокая latency до s3.amazonaws.com»

# Сначала где основная задержка
mtr s3.amazonaws.com
# Видно, на каком hop появляется latency

# DNS правильно резолвится?
dig s3.amazonaws.com
# Несколько IP — это нормально, S3 — round-robin

# Возможно DNS медленный?
time dig s3.amazonaws.com
# Если >100ms — DNS resolver медленный, поменять на 8.8.8.8

4. «Какие сетевые сервисы у меня запущены»

# Все listening
sudo ss -tlnp

# Только internet-facing (не localhost)
sudo ss -tlnp | grep -v 127.0.0.1
sudo ss -tlnp | grep -E '^.*\s+0\.0\.0\.0:|^.*\s+\*:'

# По именам процессов
sudo ss -tlnp | awk '{print $5, $7}' | sort -u

5. «Открыть SSH-tunnel на ноуте, проверить что работает»

# Туннель в фоне
ssh -L 5432:db.internal:5432 -N user@bastion &

# Проверить, что локальный порт 5432 слушает
ss -tlnp | grep :5432
# LISTEN 0    128    127.0.0.1:5432    *:*    users:(("ssh",pid=...,fd=...))

# Подключиться
nc -zv localhost 5432
# succeeded!

DNS troubleshooting checklist

# 1. Что в /etc/resolv.conf?
cat /etc/resolv.conf

# 2. Через текущий resolver
dig myhost.company.com

# 3. Через сторонний DNS
dig @8.8.8.8 myhost.company.com

# 4. Если ответы разные — split DNS (внутренний vs внешний)
# Возможно нужен VPN или /etc/hosts override

# 5. Проверить /etc/hosts на статические записи
cat /etc/hosts

# 6. systemd-resolved кэш?
sudo systemd-resolve --statistics
sudo systemd-resolve --flush-caches

# 7. nscd?
sudo systemctl status nscd 2>/dev/null  # обычно нет в Ubuntu современных

Попробуй сам

# 1. Ping
ping -c 4 google.com

# 2. DNS
dig +short google.com
dig +short google.com AAAA
dig +short @1.1.1.1 google.com

# 3. Что слушает у тебя?
sudo ss -tlnp

# 4. Тест порта (на твоём localhost)
nc -zv localhost 22
# Если ssh server есть — succeeded
nc -zv localhost 9999
# Если ничего не слушает — refused

# 5. Простой TCP-сервер и клиент
# Терминал 1:
nc -l 12345
# Терминал 2:
nc localhost 12345
# Печатай в терминал 2, появится в терминале 1

# 6. Traceroute / mtr
traceroute -n google.com
# mtr -n google.com   # если установлен

# 7. Diagnose: открыт ли GitHub?
nc -zv github.com 443
nc -zv github.com 22

# 8. DNS lookup для разных типов
dig +short github.com NS
dig +short github.com MX

Cross-link: предыдущий урок 03 — rsync. Следующий урок 05 — собранные инструменты для типичных DE-задач. Модуль 17 — bash-скрипты с health checks.


Проверка знанийKnowledge check
Junior DE говорит: «Я делаю psql -h pg.internal.company.com и получаю «could not connect to server: Connection refused». Postgres точно работает — я только что подключился из другого сервера». Какие три шага диагностики ты бы сделал, по порядку?
ОтветAnswer
Workflow диагностики «Connection refused»: 1) Шаг первый — DNS: dig +short pg.internal.company.com. Возможно DNS возвращает другой IP (split DNS, VPN не подключён, или DNS кэш испорчен). Сравнить с IP с того другого сервера откуда подключается. Если DNS возвращает 127.0.0.1 или wrong IP — проблема в DNS, не в сети. 2) Шаг второй — TCP connectivity: nc -zv pg.internal.company.com 5432. Если refused — TCP до порта 5432 на этом IP не работает (firewall, route, либо сервис не слушает). Если timeout — пакеты не доходят (route, firewall блокирует тихо). Если succeeded — TCP-уровень OK, проблема выше. 3) Шаг третий — если TCP OK, но psql ругается: возможно у Postgres pg_hba.conf не разрешает подключение с этого IP, или Postgres слушает только на 127.0.0.1 (тогда nc -zv тоже не сработал бы на удалённый IP). Зайти ssh на pg.internal.company.com, sudo ss -tlnp | grep :5432 — посмотреть слушает Postgres на 0.0.0.0 или 127.0.0.1. Если 127.0.0.1 — нужно изменить listen_addresses в postgresql.conf на '*' и перезапустить. Если на 0.0.0.0 — проблема в pg_hba.conf (нужно добавить строку host all all <src_subnet> md5).

Проверьте понимание

Результат: 0 из 0
Концептуальный
Вопрос 1 из 5. ping до сервера не отвечает. Можно ли заключить, что сервер недоступен?

Закончили урок?

Отметьте его как пройденный, чтобы отслеживать свой прогресс

Войдите чтобы оценить урок

Прогресс модуля
0 из 5