1. Диагноз — что сломалось и где искать
Поднял сервер. Сайт не открывается. ping проходит, curl зависает. Знакомо? Это troubleshooting сети — и решается он не одной командой, а связкой по симптому.
В этой шпаргалке — команды, которые покрывают 90% сетевых инцидентов. Не теория, а рабочий справочник: симптом — команда — что увидишь — что делать дальше. Время на освоение — 15 минут чтения, годы экономии нервов.
Что внутри:
- алгоритм диагностики по уровням OSI
- команды для Linux и Windows бок о бок
- усиленный блок про PowerShell и pktmon для Windows
- боевые кейсы из продакшна с разбором
- таблица «симптом — команда» под закладку
- чит-коды для экстренных ситуаций
- FAQ по типовым ошибкам новичков
Дерево решений для самой частой жалобы «сайт не открывается» — вот так выглядит триаж:
2. Алгоритм — почему важен порядок
Главная ошибка новичков — сразу лезть в tcpdump, когда не работает ping до шлюза. Так не надо. Сеть диагностируется снизу вверх по модели OSI.
Причины почему алгоритм работает:
- L1 ломается чаще всего — кабель, порт, duplex. Если линка нет — дальше идти бесполезно.
- L3 без шлюза = ничего не работает — проверь IP и default route первым делом, до DNS.
- DNS убивает 50% запросов — «сайт не открывается» в большинстве случаев именно про него.
- Порт может быть закрыт по сотне причин — сервис лёг, файрвол, bind на localhost. Это не L3.
- Приложение — последнее что проверяешь — 502 это часто не nginx, а backend.
- Пропустил уровень — копаешь не там — классика: час крутишь iptables, а кабель полусидит.
Карта команд по уровням — какая команда на каком этаже стека работает:
3. Шпаргалка — команда по симптому
Главная таблица. Закладывай в избранное.
| Симптом | Уровень | Команда Linux | Команда Windows |
|---|---|---|---|
| Линка нет | L1 | ip link, ethtool | Get-NetAdapter |
| Нет IP-адреса | L3 | ip addr | ipconfig /all |
| Шлюз не пингуется | L3 | ping, ip route | ping, route print |
| Тормозит, потери пакетов | L3 | mtr | pathping, tracert |
| Странный путь пакета | L3 | traceroute, ip route | tracert |
| DNS не резолвит | L7 | dig, nslookup | nslookup, Resolve-DnsName |
| Порт закрыт | L4 | nc -zv, nmap | Test-NetConnection |
| Кто слушает порт | L4 | ss -tulnp | Get-NetTCPConnection |
| Кто жрёт канал | L7 | nethogs, iftop | Resource Monitor |
| Не понимаю что в кабеле | все | tcpdump | pktmon, Wireshark |
| HTTP отдаёт ошибку | L7 | curl -v | Invoke-WebRequest |
| Дубль IP в сети | L2 | ip neigh, arp -n | arp -a, Get-NetNeighbor |
Дальше — разбор каждой команды с боевыми примерами.
4. ping и mtr — живой ли хост и где теряются пакеты
ping — дедушка. Проверяет ICMP Echo. Если не отвечает — либо хост мёртв, либо ICMP режется файрволом. Не делай вывод «сервер лёг» по одному ping.
# Linux - 10 пакетов и стоп
ping -c 10 8.8.8.8
# Don't Fragment - проверка MTU
ping -M do -s 1472 8.8.8.8
# Тихий режим - только статистика
ping -c 100 -q 8.8.8.8
# Windows - 10 пакетов
ping -n 10 8.8.8.8
# DF-флаг и размер - проверка MTU
ping -f -l 1472 8.8.8.8
# С меткой времени для логов
ping -t 8.8.8.8 | ForEach-Object {"{0} - {1}" -f (Get-Date),$_}
mtr намного полезнее в продакшне. Это traceroute, который не делает один снимок, а долбит маршрут постоянно и показывает потери на каждом хопе.
# Установка
sudo apt install mtr
# Отчёт по 100 пакетам
mtr -r -c 100 google.com
# Без DNS, с AS-номерами
mtr -rn --aslookup -c 1000 google.com
# TCP вместо ICMP - если ICMP режут
mtr --tcp -P 443 google.com
sudo mtr -r -c 100 -n server-moscow.local
# HOST Loss% Snt Last Avg Best Wrst StDev
# 1. 192.168.1.1 0.0% 100 1.2 1.3 1.0 2.1 0.2
# 2. 10.0.0.1 0.0% 100 3.4 3.5 3.0 5.2 0.4
# 3. provider-gw.local 0.0% 100 12.3 12.5 11.8 18.3 1.2
# 4. provider-backbone.local 15.0% 100 45.6 46.2 44.1 89.3 12.5
# 5. moscow-gw.local 2.0% 100 78.3 78.9 77.1 92.1 3.2
Смотри на StDev. Если разброс задержки большой — проблема в jitter, а не в потерях. Для VoIP это смерть, для HTTP терпимо.
5. ip и ipconfig — конфигурация интерфейсов
Без правильного IP, маски и шлюза не работает ничего. Проверка занимает 5 секунд.
# Linux - современный ip из iproute2
ip addr show
ip a # короткая форма
ip -br addr # таблицей, очень компактно
# Маршруты
ip route show
ip route get 8.8.8.8 # покажет какой маршрут выберет ядро
# Соседи (ARP)
ip neigh show
# Поднять/опустить интерфейс
sudo ip link set eth0 up
sudo ip link set eth0 down
# Добавить IP
sudo ip addr add 192.168.1.50/24 dev eth0
# Windows - PowerShell
Get-NetIPAddress
Get-NetIPConfiguration
Get-NetAdapter
# Старый ipconfig тоже жив
ipconfig /all
ipconfig /release
ipconfig /renew
ipconfig /flushdns
ip link show eth0.10
# eth0.10@eth0: <BROADCAST,MULTICAST> mtu 1500 qdisc noop state DOWN
sudo ip link set eth0.10 up
ip link show eth0.10
# eth0.10@eth0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500
Запомни: после создания любого интерфейса — VLAN, bridge, bond — всегда делай ip link set up. Это не подразумевается по умолчанию.
6. dig и nslookup — DNS-детективы
Половина обращений в саппорт — это DNS. «Сайт не открывается» в 4 случаях из 10 = резолвер не работает или отдаёт старую запись.
dig в Linux мощнее nslookup. В Windows nslookup тоже неплох, но Resolve-DnsName в PowerShell удобнее.
# Самое полезное - короткий ответ
dig google.com +short
# Конкретный DNS
dig @8.8.8.8 google.com
# MX для почты, TXT для SPF/DKIM, NS для делегирования
dig MX gmail.com +short
dig TXT google.com +short
dig NS cloudflare.com +short
# Reverse - по IP найти имя
dig -x 8.8.8.8 +short
# Trace - путь от корневых серверов
dig +trace google.com
# Конкретный resolver и таймаут
dig @1.1.1.1 +time=2 +tries=1 example.com
# Windows
Resolve-DnsName google.com
Resolve-DnsName google.com -Type MX
Resolve-DnsName google.com -Server 8.8.8.8
# nslookup интерактивный
nslookup
> server 8.8.8.8
> set type=MX
> gmail.com
> exit
Капля никотина убивает лошадь. Одна A-запись с TTL 86400 без предупреждения — весь отдел саппорта.
7. ss и netstat — кто слушает и куда ходит
netstat жив, но ss быстрее и информативнее. На современном Linux используй ss. netstat в Windows никуда не делся.
# Все слушающие TCP-порты с процессами
sudo ss -tulnp
# Только LISTEN
ss -tln
# Кто слушает 443
sudo ss -tlnp | grep :443
# Все ESTABLISHED соединения
ss -tn state established
# Считаем по состояниям - очень полезно
ss -tan | awk '{print $1}' | sort | uniq -c | sort -rn
# Сводка
ss -s
# Соединения к конкретному IP
ss -tn dst 8.8.8.8
# Windows - кто слушает порт 80
Get-NetTCPConnection -LocalPort 80 -State Listen
Get-Process -Id (Get-NetTCPConnection -LocalPort 80).OwningProcess
# Или по-старому
netstat -ano | findstr :80
tasklist | findstr "PID"
sudo sysctl -w net.ipv4.tcp_fin_timeout=30
sudo sysctl -w net.ipv4.tcp_tw_reuse=1
echo "net.ipv4.tcp_fin_timeout=30" | sudo tee -a /etc/sysctl.conf
echo "net.ipv4.tcp_tw_reuse=1" | sudo tee -a /etc/sysctl.conf
8. nc и nmap — открыт ли порт
Самый частый вопрос troubleshooting сети: «А порт-то открыт?». nc даёт ответ за секунду, nmap — за минуту с деталями.
Что происходит на проводе при проверке порта — классический three-way handshake:
# nc - проверка одного порта
nc -zv server.com 443
# Диапазон портов
nc -zv 192.168.1.100 20-25
# UDP
nc -zvu dns.server 53
# Без nc - встроенный bash
timeout 2 bash -c '</dev/tcp/server.com/443' && echo "open" || echo "closed"
# nmap - полное сканирование
nmap -F 192.168.1.100 # топ-100 портов
nmap -p- 192.168.1.100 # все 65535
nmap -p 22,80,443 192.168.1.0/24 # конкретные порты на подсети
# Версии сервисов и ОС
sudo nmap -sV -O 192.168.1.100
# Ping scan - найти живых
nmap -sn 192.168.1.0/24
# Windows - Test-NetConnection
Test-NetConnection server.com -Port 443
Test-NetConnection -ComputerName server.com -Port 443 -InformationLevel Detailed
# Сокращение
tnc server.com -Port 443
# На сервере БД
sudo ss -tln | grep 3306
# tcp LISTEN 0 151 127.0.0.1:3306 0.0.0.0:*
# Правим /etc/mysql/mysql.conf.d/mysqld.cnf
# bind-address = 0.0.0.0
sudo systemctl restart mysql
sudo ss -tln | grep 3306
# tcp LISTEN 0 151 0.0.0.0:3306 0.0.0.0:*
Если порт открыт локально, но недоступен снаружи — проверь iptables/firewalld и security group у облачного провайдера.
9. curl — HTTP-снайпер
curl — не только «скачать файл». Это инструмент №1 для диагностики HTTP/HTTPS. Покажет где тормозит TLS, какие заголовки отдаёт сервер, как идут редиректы.
Что измеряют тайминги curl — вот вся цепочка от DNS до получения тела ответа:
# Только заголовки
curl -I https://example.com
# Полный verbose - запрос и ответ
curl -v https://example.com
# Не следовать редиректам
curl -I https://example.com
# Следовать
curl -IL https://example.com
# Указать конкретный IP - обход DNS
curl --resolve example.com:443:1.2.3.4 https://example.com
# POST с JSON
curl -X POST -H "Content-Type: application/json" \
-d '{"key":"value"}' https://api.example.com/data
# Игнорировать SSL - только для теста
curl -k https://self-signed.com
# HTTP/2 или HTTP/1.1 принудительно
curl --http2 -I https://example.com
curl --http1.1 -I https://example.com
Главная фишка curl — тайминг по фазам запроса. Покажет точно где медленно.
# Создаём шаблон вывода
cat > curl-format.txt << 'EOF'
time_namelookup: %{time_namelookup}s
time_connect: %{time_connect}s
time_appconnect: %{time_appconnect}s
time_pretransfer: %{time_pretransfer}s
time_redirect: %{time_redirect}s
time_starttransfer: %{time_starttransfer}s
----------
time_total: %{time_total}s
EOF
curl -w "@curl-format.txt" -o /dev/null -s https://example.com
# nginx ssl.conf
ssl_protocols TLSv1.2 TLSv1.3;
ssl_ciphers 'ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES128-GCM-SHA256:ECDHE-ECDSA-AES256-GCM-SHA384:ECDHE-RSA-AES256-GCM-SHA384';
ssl_prefer_server_ciphers off;
ssl_session_cache shared:SSL:10m;
ssl_session_timeout 1h;
10. tcpdump — последняя инстанция
Когда все остальные команды показывают «вроде ок», а пользователь говорит «не работает» — доставай tcpdump. Он показывает реальные пакеты на проводе. Не врёт.
# Базовый захват на интерфейсе
sudo tcpdump -i eth0
# Без DNS-резолва, с номерами портов - быстрее
sudo tcpdump -i eth0 -nn
# По хосту
sudo tcpdump -i eth0 host 192.168.1.100
# Между двумя хостами в обоих направлениях
sudo tcpdump -i eth0 'host 192.168.1.100 and host 192.168.1.200'
# По порту
sudo tcpdump -i eth0 'tcp port 443'
# Только SYN-пакеты - смотреть установление соединений
sudo tcpdump -i eth0 'tcp[tcpflags] & tcp-syn != 0'
# DNS-запросы
sudo tcpdump -i eth0 -nn 'udp port 53'
# Сохранить в pcap для Wireshark
sudo tcpdump -i eth0 -w capture.pcap host 192.168.1.100
# С ротацией - чтобы не забить диск
sudo tcpdump -i eth0 -w cap.pcap -C 100 -W 10
# Прочитать сохранённый дамп
tcpdump -r capture.pcap -nn
Wireshark делает с pcap-файлом то, что tcpdump не покажет. Установи Wireshark и используй его для анализа, а tcpdump — для захвата на сервере. Под Windows есть встроенный pktmon — о нём ниже в Windows-разделе.
11. ethtool — физика сети
Когда сервер теряет пакеты, а ip route и iptables в порядке — спускайся на L1. ethtool покажет реальную скорость, duplex и ошибки на железе.
# Что говорит интерфейс
sudo ethtool eth0
# Speed: 1000Mb/s
# Duplex: Full
# Auto-negotiation: on
# Link detected: yes
# Статистика - ошибки CRC, фреймов, коллизии
sudo ethtool -S eth0 | grep -i error
# Драйвер и версия
sudo ethtool -i eth0
# Принудительная скорость и duplex - старое железо
sudo ethtool -s eth0 speed 1000 duplex full autoneg off
# Offload-функции
sudo ethtool -k eth0
sudo ethtool -S eth0 | grep -i error
# rx_crc_errors: 15234
# rx_frame_errors: 8976
# tx_carrier_errors: 2341
# collisions: 45678
Коллизии в 2026 году — это всегда half-duplex с обеих сторон или плохой кабель. Full-duplex коллизий не имеет в принципе.
12. nethogs и iftop — кто жрёт канал
«Интернет тормозит» в офисе — значит кто-то качает. nethogs покажет по процессам, iftop — по соединениям.
# Установка
sudo apt install nethogs iftop
# nethogs - процесс и его трафик
sudo nethogs eth0
# iftop - соединения и скорость
sudo iftop -i eth0 -nNP
# Без -n будет резолвить - в забитой сети тормозит
# Базовый QoS через tc - ограничиваем torrent-порты
sudo tc qdisc add dev eth0 root handle 1: htb default 10
sudo tc class add dev eth0 parent 1: classid 1:10 htb rate 15mbit ceil 20mbit
sudo tc class add dev eth0 parent 1: classid 1:20 htb rate 2mbit ceil 5mbit
sudo tc filter add dev eth0 protocol ip parent 1:0 prio 1 \
u32 match ip dport 6881 0xffff flowid 1:20
13. arp и ip neigh — дубликаты IP
«С одной машины пингуется, с другой нет» — почти всегда конфликт MAC-адресов или ARP-spoofing.
Что происходит при ARP-конфликте — кто первый ответил, того и тапочки:
# Linux - современно
ip neigh show
# Linux - старая школа
arp -n
# Очистить кеш
sudo ip neigh flush all
sudo ip neigh flush dev eth0
# Удалить конкретную запись
sudo ip neigh del 192.168.1.50 dev eth0
# Статическая запись
sudo ip neigh add 192.168.1.50 lladdr 00:11:22:33:44:55 dev eth0 nud permanent
# Windows
arp -a
arp -d 192.168.1.50
netsh interface ip delete arpcache
# PowerShell
Get-NetNeighbor
Remove-NetNeighbor -IPAddress 192.168.1.50
14. route и ip route — таблица маршрутизации
Если ping до шлюза работает, а в интернет нет — проверь маршруты. Особенно когда два канала.
# Linux
ip route show
# Какой маршрут выберет ядро для конкретного IP
ip route get 8.8.8.8
# Добавить
sudo ip route add 10.0.0.0/24 via 192.168.1.1
# Заменить default
sudo ip route replace default via 192.168.1.1
# С метрикой - меньше = приоритетнее
sudo ip route add default via 192.168.2.1 metric 200
# Windows
route print
Get-NetRoute
# Добавить постоянный
route -p ADD 10.0.0.0 MASK 255.255.255.0 192.168.1.1
# PowerShell
New-NetRoute -DestinationPrefix "10.0.0.0/24" -NextHop "192.168.1.1" -InterfaceAlias "Ethernet"
Постоянные маршруты в Ubuntu/Debian — в /etc/netplan/, в RHEL — в /etc/sysconfig/network-scripts/route-eth0.
15. Health check Linux — всё разом
Скрипт для быстрой проверки всего за раз. Сохрани в /usr/local/bin/netcheck.sh.
#!/bin/bash
echo "=== Network Health Check ==="
echo
echo "[1] Interfaces:"
ip -br addr show | grep -v "^lo"
echo
echo "[2] Default Gateway:"
ip route | grep default
echo
echo "[3] DNS:"
grep nameserver /etc/resolv.conf
echo
echo "[4] Ping 8.8.8.8:"
ping -c 3 -W 2 8.8.8.8 | tail -3
echo
echo "[5] DNS resolve:"
dig google.com +short +time=2 +tries=1
echo
echo "[6] Connections:"
ss -s
echo
echo "[7] Listening ports:"
ss -tuln | grep LISTEN
echo
echo "[8] Errors on interfaces:"
ip -s link | grep -B1 errors | grep -A1 "^[0-9]"
echo
echo "=== Done ==="
Запусти — получи срез по сети за 5 секунд. Удобно класть в SSH banner или в скрипт первичного триажа.
16. Windows: PowerShell вместо классики
В Windows старые команды живут с NT 4.0 — и работают. Но PowerShell-командлеты дают объекты вместо текста, который надо парсить регуляркой. Для скриптов и автоматизации это разница в небо.
| Старая команда | PowerShell аналог | Что лучше |
|---|---|---|
| ipconfig /all | Get-NetIPConfiguration | Объекты, фильтрация по полям |
| ping | Test-Connection | Параллельные пинги, результат в массив |
| ping host порт | Test-NetConnection | Реальная проверка TCP-порта, не ICMP |
| nslookup | Resolve-DnsName | Все типы записей, DNSSEC, кеш |
| netstat -ano | Get-NetTCPConnection | Связь с процессом без findstr |
| route print | Get-NetRoute | Фильтрация, метрики, IPv6 раздельно |
| arp -a | Get-NetNeighbor | Состояние записи (Reachable/Stale) |
| tracert | Test-NetConnection -Traceroute | Объектный вывод |
Test-NetConnection — швейцарский нож Windows
Запомни одну команду — tnc. Заменяет ping, telnet, tracert и часть nmap.
# Простой пинг
tnc google.com
# Проверить TCP-порт - то что telnet делал
tnc smtp.gmail.com -Port 587
tnc 192.168.1.50 -Port 3306
# Подробный отчёт - аналог curl -v на L4
tnc google.com -Port 443 -InformationLevel Detailed
# Traceroute
tnc google.com -TraceRoute
# Проверить порт через конкретный интерфейс
tnc 192.168.1.1 -Port 443 -SourceAddress 192.168.1.100
В отличие от telnet, tnc возвращает True/False — удобно в скриптах.
# Проверка пачки портов одной строкой
22,80,443,3306,5432 | ForEach-Object {
$r = tnc 192.168.1.50 -Port $_ -WarningAction SilentlyContinue
[PSCustomObject]@{
Port = $_
Open = $r.TcpTestSucceeded
}
} | Format-Table -AutoSize
Get-NetTCPConnection — кто слушает и куда ходит
netstat в Windows жив, но Get-NetTCPConnection даёт объекты с PID сразу, без двойного поиска через tasklist.
# Все слушающие порты
Get-NetTCPConnection -State Listen | Format-Table LocalAddress, LocalPort, OwningProcess
# Кто слушает 443 - с именем процесса
Get-NetTCPConnection -LocalPort 443 -State Listen |
Select-Object LocalAddress, LocalPort,
@{n='Process';e={(Get-Process -Id $_.OwningProcess).Name}}
# Все ESTABLISHED соединения с группировкой по процессу
Get-NetTCPConnection -State Established |
Group-Object OwningProcess |
Select-Object Count,
@{n='Process';e={(Get-Process -Id $_.Name -ErrorAction SilentlyContinue).Name}} |
Sort-Object Count -Descending |
Format-Table -AutoSize
# Сводка по состояниям TCP - аналог ss -s
Get-NetTCPConnection | Group-Object State | Format-Table Name, Count
Захват трафика без Wireshark — pktmon
С Windows 10 1809 в системе есть встроенный pktmon — легковесный аналог tcpdump. Wireshark не нужен на сервере, для анализа дамп переносишь на рабочую станцию.
# Базовый захват всего на всех интерфейсах
pktmon start --capture
# ждём немного
pktmon stop
# С фильтром - только трафик на порт 443
pktmon filter add -p 443
pktmon start --capture --pkt-size 0
pktmon stop
pktmon filter remove
# Конвертация в pcapng для Wireshark
pktmon pcapng PktMon.etl -o capture.pcapng
# Только захват по IP
pktmon filter add MyFilter -i 192.168.1.50
pktmon start --capture
Альтернатива — tshark из пакета Wireshark CLI или netsh trace для совсем старых систем.
# netsh trace - работает на Windows 7/Server 2008 R2 и выше
netsh trace start capture=yes tracefile=C:\trace.etl
# воспроизводим проблему
netsh trace stop
Resolve-DnsName — dig для Windows
nslookup в Windows жив, но Resolve-DnsName умеет больше: DNSSEC, фильтрация по типу, работа с кешем.
# A-запись
Resolve-DnsName google.com
# Конкретный тип
Resolve-DnsName google.com -Type MX
Resolve-DnsName google.com -Type TXT
Resolve-DnsName google.com -Type NS
# Через конкретный DNS
Resolve-DnsName google.com -Server 8.8.8.8
# Без кеша - принудительный запрос
Resolve-DnsName google.com -DnsOnly
# Из кеша - что Windows запомнил
Get-DnsClientCache
# Очистить кеш
Clear-DnsClientCache
# Проверить настроенные DNS на интерфейсах
Get-DnsClientServerAddress -AddressFamily IPv4
# Поменять DNS на интерфейсе
Set-DnsClientServerAddress -InterfaceAlias "Ethernet" -ServerAddresses ("8.8.8.8","1.1.1.1")
Сетевая статистика — что в Resource Monitor нет
Get-NetAdapterStatistics показывает счётчики на уровне интерфейса — ошибки, дропы, пакеты. Аналог ip -s link в Linux.
# Статистика всех интерфейсов
Get-NetAdapterStatistics | Format-Table Name, ReceivedBytes, SentBytes, ReceivedDiscardedPackets, OutboundDiscardedPackets
# Только проблемные - где есть ошибки
Get-NetAdapterStatistics |
Where-Object {$_.ReceivedDiscardedPackets -gt 0 -or $_.OutboundDiscardedPackets -gt 0}
# Скорость и дуплекс - аналог ethtool
Get-NetAdapter | Format-Table Name, LinkSpeed, MediaConnectionState, FullDuplex
# Расширенные настройки адаптера
Get-NetAdapterAdvancedProperty -Name "Ethernet"
# Сменить скорость и duplex
Set-NetAdapterAdvancedProperty -Name "Ethernet" -DisplayName "Speed & Duplex" -DisplayValue "1.0 Gbps Full Duplex"
Файрвол — быстрая диагностика
Половина проблем «не работает на Windows» — это Windows Defender Firewall. Проверка занимает минуту.
# Профили файрвола - какие активны
Get-NetFirewallProfile | Format-Table Name, Enabled
# Найти правило, блокирующее порт
Get-NetFirewallRule -Direction Inbound -Action Block |
Where-Object Enabled -eq True |
Get-NetFirewallPortFilter |
Where-Object LocalPort -eq 80
# Открыть порт 443 во внешний мир
New-NetFirewallRule -DisplayName "Allow HTTPS" -Direction Inbound -Protocol TCP -LocalPort 443 -Action Allow
# Логирование заблокированных пакетов - диагностика
Set-NetFirewallProfile -Profile Domain,Public,Private -LogBlocked True -LogFileName "%systemroot%\system32\LogFiles\Firewall\pfirewall.log"
# Просмотр лога
Get-Content C:\Windows\System32\LogFiles\Firewall\pfirewall.log -Tail 50
Health check для Windows
# Сохрани как netcheck.ps1
# Запуск: powershell -ExecutionPolicy Bypass -File netcheck.ps1
Write-Host "=== Windows Network Health Check ===" -ForegroundColor Cyan
Write-Host ""
Write-Host "[1] Active Adapters:" -ForegroundColor Yellow
Get-NetAdapter | Where-Object Status -eq "Up" |
Format-Table Name, InterfaceDescription, LinkSpeed, MediaConnectionState
Write-Host "[2] IP Configuration:" -ForegroundColor Yellow
Get-NetIPConfiguration | Where-Object IPv4Address |
Format-Table InterfaceAlias,
@{n='IPv4';e={$_.IPv4Address.IPAddress}},
@{n='Gateway';e={$_.IPv4DefaultGateway.NextHop}},
@{n='DNS';e={$_.DNSServer.ServerAddresses -join ', '}}
Write-Host "[3] Default Route:" -ForegroundColor Yellow
Get-NetRoute -DestinationPrefix "0.0.0.0/0" |
Format-Table NextHop, InterfaceAlias, RouteMetric, ifMetric
Write-Host "[4] Internet check:" -ForegroundColor Yellow
$ping = Test-Connection 8.8.8.8 -Count 4 -ErrorAction SilentlyContinue
if ($ping) {
$avg = ($ping | Measure-Object ResponseTime -Average).Average
Write-Host " 8.8.8.8 reachable, avg $([math]::Round($avg,1))ms" -ForegroundColor Green
} else {
Write-Host " 8.8.8.8 UNREACHABLE" -ForegroundColor Red
}
Write-Host "[5] DNS resolve test:" -ForegroundColor Yellow
try {
$dns = Resolve-DnsName google.com -Type A -ErrorAction Stop
Write-Host " google.com -> $($dns[0].IPAddress)" -ForegroundColor Green
} catch {
Write-Host " DNS FAILED: $_" -ForegroundColor Red
}
Write-Host "[6] HTTPS check:" -ForegroundColor Yellow
$https = tnc google.com -Port 443 -WarningAction SilentlyContinue
if ($https.TcpTestSucceeded) {
Write-Host " 443/tcp open" -ForegroundColor Green
} else {
Write-Host " 443/tcp BLOCKED" -ForegroundColor Red
}
Write-Host "[7] TCP connections by state:" -ForegroundColor Yellow
Get-NetTCPConnection | Group-Object State |
Format-Table Name, Count -AutoSize
Write-Host "[8] Listening ports:" -ForegroundColor Yellow
Get-NetTCPConnection -State Listen |
Select-Object LocalPort,
@{n='Process';e={(Get-Process -Id $_.OwningProcess -ErrorAction SilentlyContinue).Name}} -Unique |
Sort-Object LocalPort |
Format-Table -AutoSize
Write-Host "[9] Adapter errors:" -ForegroundColor Yellow
Get-NetAdapterStatistics |
Where-Object {$_.ReceivedDiscardedPackets -gt 0 -or $_.OutboundDiscardedPackets -gt 0} |
Format-Table Name, ReceivedDiscardedPackets, OutboundDiscardedPackets
Write-Host "[10] Firewall profiles:" -ForegroundColor Yellow
Get-NetFirewallProfile | Format-Table Name, Enabled, DefaultInboundAction
Write-Host "=== Done ===" -ForegroundColor Cyan
17. Осложнения — типовые ошибки
Краткий справочник по ошибкам и их причинам. Запоминается с первого раза.
| Ошибка | Что значит | Куда копать |
|---|---|---|
| Connection refused | Хост ответил, порт закрыт | Сервис не запущен или bind на localhost |
| Connection timeout | Пакеты не доходят | Файрвол, маршрут, хост лёг |
| No route to host | Нет маршрута в таблице | ip route, default gateway |
| Host unreachable | Хост в той же сети не отвечает на ARP | Хост лёг, не та подсеть, switch |
| Name or service not known | DNS не резолвит | /etc/resolv.conf, dig @8.8.8.8 |
| SSL handshake failure | Не договорились о шифрах/версии | openssl s_client, nmap ssl-enum-ciphers |
| 502 Bad Gateway | nginx не получил ответ от backend | ss на backend, логи приложения |
| 504 Gateway Timeout | Backend ответил слишком долго | Backend перегружен, БД |
# MSS clamping для VPN
sudo iptables -t mangle -A FORWARD -p tcp --tcp-flags SYN,RST SYN \
-j TCPMSS --clamp-mss-to-pmtu
# Жёстко выставить MSS - 1360 безопасно для PPPoE/мобильных
sudo iptables -t mangle -A FORWARD -p tcp --tcp-flags SYN,RST SYN \
-j TCPMSS --set-mss 1360
Magic number: MSS = MTU — 40 для IPv4. MTU 1400 — значит MSS 1360.
Самая коварная ошибка — асимметричная маршрутизация. Файрвол клиента видит ответ с «не того» IP и дропает соединение:
Лечится policy-based routing — чтобы пакет уходил с того же интерфейса, на который пришёл:
# Создаём отдельную таблицу для управляющего интерфейса
echo "100 mgmt" | sudo tee -a /etc/iproute2/rt_tables
sudo ip route add 192.168.1.0/24 dev eth0 src 192.168.1.100 table mgmt
sudo ip route add default via 192.168.1.1 dev eth0 table mgmt
sudo ip rule add from 192.168.1.100 table mgmt
18. Альтернативы — чем заменить классику
Не все команды одинаково хороши в 2026 году. Вот что использовать вместо.
| Старое | Новое | Почему |
|---|---|---|
| ifconfig | ip addr | ifconfig deprecated, нет VLAN, медленнее |
| route | ip route | Не показывает policy routing, нет multipath |
| arp | ip neigh | Часть iproute2, единый CLI |
| netstat | ss | В разы быстрее на больших объёмах сокетов |
| traceroute | mtr | Снимает статистику, не одноразовый снимок |
| nslookup | dig | Подробнее, гибче, +trace |
| telnet | nc -zv | nc по умолчанию есть, telnet ставить надо |
В Windows старые команды никуда не делись и работают, но PowerShell-командлеты Get-NetTCPConnection, Test-NetConnection, Resolve-DnsName удобнее для скриптов.
19. Профилактика — чтобы не звонили в 3 ночи
Лучшая диагностика — та, которую делать не пришлось. Что настроить заранее:
- Мониторинг линка — Zabbix или Prometheus с алертом на ifOperStatus и errors на интерфейсе. Заметишь деградацию до того как кабель отвалится.
- Внешний пинг до критичных хостов — smokeping или uptime-kuma с графиками потерь и latency. Покажет где проблема — у тебя или у провайдера.
- Логи DNS-сервера — query log с ротацией. При DNS cache poisoning или массовых ошибках резолвинга найдёшь источник.
- Бэкап конфигов сети — оригиналы /etc/netplan, iptables-save в git перед каждым изменением. Откат за 30 секунд.
- NTP на всех хостах — без синхронного времени логи не сопоставишь. Это не сетевая проблема, но без NTP диагностика становится в разы тяжелее.
- Документ «сетевая карта» — схема подсетей, VLAN, маршрутов в wiki. Через год сам себе скажешь спасибо.
- Скрипт netcheck в SSH banner — залогинился на сервер — сразу видно состояние сети. Экономит первые 30 секунд на каждом инциденте.
20. FAQ — что спрашивают чаще всего
Почему ping проходит, а сайт не открывается?
ping проверяет ICMP до хоста, а сайт — это TCP на порт 443 плюс DNS плюс SSL плюс HTTP. Проверь по цепочке: dig для DNS, nc -zv host 443 для порта, curl -v для HTTP/SSL. Чаще всего виноват DNS или SSL handshake.
Как проверить, что troubleshooting сети командой работает правильно?
Прогони команду в две стороны. Если nc -zv server.com 443 говорит open — убедись что это тот сервер. Через —resolve в curl можно жёстко привязаться к IP, минуя DNS. Если результаты с двух разных машин в одной сети расходятся — проблема локальная, не глобальная.
Что делать если порт открыт, но приложение не отвечает?
Это L7-проблема, не сетевая. Логи приложения, нагрузка на CPU/память, БД. Сделай curl -v — увидишь, что отдаёт сервер. Если 502 — backend лёг. Если timeout после соединения — приложение зависло, не отвечает на запросы. Перезапуск сервиса поможет, но причину ищи в логах.
Чем tcpdump отличается от Wireshark?
tcpdump захватывает пакеты в консоли, Wireshark — в GUI. На сервере без GUI ставишь tcpdump, дамп сохраняешь в pcap, открываешь в Wireshark на ноуте. Wireshark лучше анализирует, tcpdump лучше захватывает в продакшне без оверхеда. На Windows есть встроенный pktmon — не нужно ставить ничего.
Как найти, какой процесс жрёт сеть в Windows?
Открой Resource Monitor (resmon.exe), вкладка Network. Там видно процессы и их трафик. Альтернативно — Get-NetTCPConnection в PowerShell с привязкой к процессу через OwningProcess. На Linux эту задачу решает nethogs одной командой.
Почему mtr показывает потери на промежуточном хопе, но конечный работает?
Это нормально. Промежуточные роутеры рейт-лимитят ICMP-ответы, чтобы не нагружать CPU. Если потери только на хопе N, а на N+1 их нет — это ложный сигнал. Реальные потери — те, что есть на конечном хосте и одинаковые на всех хопах после проблемного.
Чем nc отличается от nmap для проверки портов?
nc проверяет один порт за раз и подтверждает, что TCP-соединение установилось. nmap сканирует диапазон, определяет версии сервисов, ОС, может запускать NSE-скрипты на уязвимости. Для быстрой проверки «открыт ли» — nc. Для аудита сети — nmap.
Можно ли все команды troubleshooting сети использовать без root?
Большинство read-only команд работают без прав: ping, traceroute, dig, ss без -p, curl, nslookup. Команды для изменения конфигурации (ip addr add, ip route add), для захвата сырых пакетов (tcpdump) и для просмотра процессов в ss/netstat требуют root или sudo. nmap для SYN-сканов тоже хочет root.
21. Прогноз — что у тебя теперь есть
Шпаргалка собрана. У тебя теперь алгоритм диагностики по уровням OSI, рабочие команды под Linux и Windows, скрипты health check на bash и PowerShell, разбор pktmon для Windows без Wireshark, и таблица типовых ошибок. Этого хватает на 90% сетевых инцидентов в продакшне — от «сайт не открывается» до «VoIP заикается».
Главное — не зубри команды, пойми порядок. Симптом — уровень — команда. Линк проверил, IP проверил, шлюз проверил, DNS проверил, порт проверил, приложение проверил. На каком-то шаге найдёшь. А когда не найдёшь — доставай tcpdump или pktmon и смотри что реально летит по проводу.
Если что-то из шпаргалки не сработало или нашёл косяк — пиши в комментарии, разберёмся.
Оставайтесь на связи
Рецепты от IT-боли. Без воды, без рекламы, без маркетинговой шелухи.
Подписаться на IT-Аптеку →



