Сеть не работает - и это самый частый и самый размытый тикет в жизни администратора. Задача урока - научить вас не тыкать команды наугад, а двигаться по слоям снизу вверх: есть ли линк и адрес, видит ли машина шлюз, доходит ли пакет до удалённого хоста, не теряется ли он по дороге, отвечает ли нужный порт, резолвится ли имя. Каждый слой отсекает половину гипотез. В итоге вы локализуете проблему до конкретного звена, а не пересказываете начальству, что пинг не идёт.

Как это работает
Сетевой стек - это уровни, и проблема всегда живёт на каком-то одном из них. Снизу вверх: физика и канальный уровень (линк, MAC, ARP), сетевой (IP-адрес, маршрут, шлюз), транспортный (TCP/UDP, порты, состояние сокетов), прикладной (DNS, сам сервис). Методика проста: проверяй слой за слоем и не лезь выше, пока нижний не подтверждён. Если у интерфейса нет IP, бессмысленно дебажить DNS.
Канальный уровень - это ARP. Чтобы отправить IP-пакет соседу в той же подсети, ядро должно знать его MAC. Оно спрашивает широковещательно who-has, кэширует ответ в ARP-таблице. Дубликат IP в сети проявляется именно здесь: два хоста отвечают на один ARP-запрос, и связь становится мерцающей в зависимости от того, чей ответ пришёл последним.
Сетевой уровень - маршрутизация. Ядро смотрит таблицу маршрутов и выбирает, в какой интерфейс и на какой next-hop отдать пакет. Тут возникает асимметричная маршрутизация: пакет уходит одним путём, а ответ возвращается другим. Само по себе это законно, но ломается на stateful-фаерволах и при включённом rp_filter (reverse path filtering), который отбрасывает пакет, пришедший не с того интерфейса, через который ушёл бы ответ.
Отдельная боль - MTU и фрагментация. MTU это максимальный размер кадра. Если на пути есть звено с меньшим MTU (типичный случай - VPN или PPPoE, где -50 или -80 байт), большой пакет с установленным флагом DF (Don't Fragment) должен породить ICMP-сообщение "fragmentation needed". Если файрвол по дороге режет весь ICMP, отправитель не узнаёт о проблеме - это PMTUD blackhole. Симптом классический: ping и ssh-логин проходят, а реальная передача данных (большие страницы, scp) виснет.
Команды и примеры
Слой 1-2: линк, адрес, ARP. Команда ip заменила ifconfig/arp/route везде.
Код: Выделить всё
ip -br link # краткий статус интерфейсов: UP/DOWN
ip -br addr # адреса в одну строку на интерфейс
ip neigh show # ARP/NDP кэш (REACHABLE, STALE, FAILED)
ip -s link show eth0 # счётчики ошибок, дропов, коллизий
Код: Выделить всё
arping -D -I eth0 192.0.2.10 # -D: duplicate address detection
# ненулевой код возврата и ответ с чужого MAC = дубликат
Код: Выделить всё
ip route get 8.8.8.8 # покажет, КАКОЙ маршрут и интерфейс выберет ядро
ip route show # вся таблица
ip rule show # policy routing, если маршрутизация многотабличная
Слой 4: сокеты и порты. ss заменил netstat.
Код: Выделить всё
ss -tlnp # слушающие TCP-порты с именами процессов
ss -tn state established # установленные соединения
ss -s # сводка по сокетам
Код: Выделить всё
ping -c 4 -M do -s 1472 192.0.2.1 # тест MTU: DF + 1472+28=1500 байт
mtr -rwc 100 cyberlake.ru # 100 циклов, отчёт по потерям на каждом хопе
traceroute -n -T -p 443 cyberlake.ru # TCP-трейс на 443, обходит ICMP-фильтры
DNS - прикладной слой. dig вместо устаревшего nslookup.
Код: Выделить всё
dig +short cyberlake.ru
dig @1.1.1.1 cyberlake.ru A # спросить конкретный сервер в обход локального
dig +trace cyberlake.ru # пройти делегирование от корня
dig -x 192.0.2.10 # обратная зона PTR
Код: Выделить всё
apt install iproute2 iputils-ping traceroute mtr-tiny dnsutils
Код: Выделить всё
dnf install iproute iputils traceroute mtr bind-utils
Код: Выделить всё
ncat -zv cyberlake.ru 443
echo > /dev/tcp/cyberlake.ru/443 && echo open
- Делать выводы по ICMP-потерям на промежуточном хопе mtr. Роутеры режут ICMP к себе - судите только по конечному хопу.
- Списывать всё на DNS, не проверив L3. Если ip route get не даёт маршрут, dig вообще ни при чём.
- Забыть про rp_filter при асимметрии. sysctl net.ipv4.conf.all.rp_filter в режиме 1 молча дропает обратный трафик - смотрите счётчик в /proc/net/netstat.
- Тестировать MTU без флага DF. Без -M do ядро фрагментирует пакет само и вы ничего не увидите.
- Путать "порт закрыт" и "порт фильтруется". ncat с reject (RST) - порт закрыт, таймаут - чаще файрвол.
- Доверять кэшу ARP/DNS. STALE-запись или закэшенный старый адрес дают фантомные симптомы. Сбросьте: ip neigh flush dev eth0, resolvectl flush-caches.
- Гонять ping до домена и думать, что проверили сервис. ICMP жив, а 443-й порт может лежать.
- На стенде с двумя машинами в одной подсети снимите ip -br addr и ip neigh show, запомните MAC соседа.
- Намеренно поднимите на второй машине IP первой (ip addr add), запустите arping -D с первой и зафиксируйте обнаружение дубликата. Уберите конфликт.
- Уменьшите MTU на интерфейсе до 1400 (ip link set eth0 mtu 1400) и подберите ping -M do -s, при котором пакет перестаёт проходить. Посчитайте: размер + 28 = ваш реальный MTU.
- Заблокируйте исходящий ICMP type 3 на промежуточном узле и воспроизведите PMTUD blackhole: маленький ping идёт, scp большого файла виснет.
- Прогоните mtr -rwc 50 до внешнего хоста и до соседа, сравните, где появляются устойчивые потери.
- Сравните dig +short и dig @8.8.8.8 для одного имени - найдите расхождение, если локальный резолвер кэширует старую запись.
- В каком порядке вы проверяете слои при жалобе "не открывается сайт" и почему именно снизу вверх?
- Чем ip route get отличается от ip route show и когда первая команда незаменима?
- Как формула размера пакета связана с -s в ping и реальным MTU канала? Почему +28?
- Почему потери на промежуточном хопе в mtr могут быть ложными, а на конечном - нет?
- Что такое rp_filter и как он связан с асимметричной маршрутизацией?
- Как отличить закрытый порт от отфильтрованного по поведению ncat?