Привет, коллеги по цеху! Сегодня разберем 15 команд, которые должен знать каждый сетевой инженер и системный администратор. За 15+ лет работы я насмотрелся на всякие сетевые приколы: от петель на коммутаторах до MTU-проблем, которые ломали VPN. И знаете что? В 90% случаев проблему можно найти с помощью базовых утилит, которые есть в любой ОС из коробки.
Эта статья — не для тех, кто хочет поверхностно пробежаться по командам. Здесь будет мясо: реальные примеры, практические кейсы, хитрые флаги и комбинации команд, которые реально работают в продакшене. Поехали!
1. ping — дедушка всех сетевых утилит
Начнем с классики. ping — это как «Hello World» в программировании. Просто, банально, но работает. Команда отправляет ICMP Echo Request пакеты и ждет ответа. Если ответ есть — хост живой, если нет — либо хост мертв, либо ICMP заблокирован файрволом.
# Базовое использование
ping google.com
# Отправить 10 пакетов и остановиться
ping -n 10 google.com
# Установить размер пакета (для проверки MTU)
ping -l 1472 google.com
# Не фрагментировать пакеты (Don't Fragment флаг)
ping -f -l 1472 google.com
# Continuous ping с меткой времени (для логирования)
ping -t google.com | ForEach-Object {"{0} - {1}" -f (Get-Date),$_}
Linux:
# Базовое использование ping google.com # Отправить 10 пакетов ping -c 10 google.com # Установить размер пакета ping -s 1472 google.com # Don't Fragment флаг ping -M do -s 1472 google.com # Flood ping (для нагрузочного тестирования, нужен root) sudo ping -f google.com # Интервал между пакетами 0.2 секунды (быстрее дефолтной 1 секунды) ping -i 0.2 google.com # Показать только статистику без вывода каждого пакета ping -c 100 -q google.com
Практический пример: У клиента жалобы на «тормоза» при работе с удаленным офисом через VPN. Первое, что я сделал — проверил MTU:
# Ищем максимальный MTU без фрагментации # Стандартный Ethernet MTU = 1500, минус 28 байт на IP+ICMP заголовки = 1472 ping -f -l 1472 remote-office-gateway.local # Если не проходит, уменьшаем ping -f -l 1400 remote-office-gateway.local ping -f -l 1300 remote-office-gateway.local
Оказалось, что VPN-туннель имел MTU 1400, а у нас стояло 1500. Пакеты фрагментировались, добавлялся оверхед, скорость проседала. Поправили MTU на интерфейсах — профит, скорость выросла на 30%.
2. traceroute / tracert — картография сетевых маршрутов
Когда ping показывает потери или высокий пинг, traceroute покажет, где именно проблема. Утилита отправляет пакеты с инкрементным TTL (Time To Live), и каждый роутер по пути отвечает «я тут, до меня N хопов.
Windows:
# Базовое использование tracert google.com # Не резолвить имена (быстрее) tracert -d 8.8.8.8 # Установить максимальное количество хопов tracert -h 15 google.com # Установить timeout для каждого хопа (в миллисекундах) tracert -w 500 google.com
Linux:
# Базовое использование (ICMP) traceroute google.com # Использовать UDP вместо ICMP (иногда проходит через файрволы) traceroute -U google.com # Использовать TCP (самый хитрый метод) traceroute -T -p 80 google.com # Не резолвить имена traceroute -n 8.8.8.8 # Показать AS (Autonomous System) номера traceroute -A google.com # MTR — улучшенный traceroute с постоянным мониторингом mtr -r -c 100 google.com
Практический пример: Клиент из Владивостока жаловался на потери пакетов при доступе к серверу в Москве. Запустил mtr и увидел это:
sudo mtr -r -c 100 -n server-moscow.local # Вывод показал: # HOST: client-vlad 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 # 6. server-moscow.local 2.0% 100 79.1 79.5 78.3 93.4 3.4
Видно, что на 4-м хопе (backbone провайдера) 15% потерь. Позвонил в поддержку провайдера, прислал логи mtr, через день починили перегруженный линк. Вот почему я люблю mtr больше обычного traceroute — он показывает статистику за период, а не одноразовый снапшот.
3. netstat — окно в сетевые соединения
netstat показывает активные сетевые соединения, статистику по протоколам, таблицу маршрутизации. Незаменимая вещь для поиска «кто жрет порты» и «куда слился трафик».
Windows:
# Показать все соединения и слушающие порты netstat -an # Показать с именами программ (нужны права админа) netstat -anb # Показать только TCP соединения netstat -ant # Показать таблицу маршрутизации netstat -r # Показать статистику по протоколам netstat -s # Мониторинг в реальном времени (обновление каждые 5 секунд) netstat -an 5 # Найти, какой процесс слушает порт 80 netstat -ano | findstr :80 # Затем по PID найти имя процесса tasklist | findstr "PID_NUMBER" # Или одной командой в PowerShell Get-Process -Id (Get-NetTCPConnection -LocalPort 80).OwningProcess
Linux:
# Показать все соединения netstat -tuln # С именами процессов (нужен root) sudo netstat -tulnp # Только слушающие порты netstat -tuln | grep LISTEN # Показать статистику интерфейсов netstat -i # Постоянный <a class="wpil_keyword_link" href="https://it-apteka.com/category/monitoring/" title="Мониторинг" data-wpil-keyword-link="linked" data-wpil-monitor-id="43">мониторинг</a> соединений watch -n 1 'netstat -tuln | grep ESTABLISHED | wc -l' # Современная альтернатива — ss (socket statistics) ss -tuln # Показать все TCP соединения с процессами ss -tulnp # Показать соединения к определенному порту ss -tulnp | grep :443 # Показать summary по сокетам ss -s
Практический пример: Веб-сервер начал отваливаться под нагрузкой. Проверил соединения:
# Смотрим статистику TCP
netstat -s | grep -i "connection\|reset\|failed"
# Считаем соединения в разных состояниях
ss -tan | awk '{print $1}' | sort | uniq -c | sort -rn
# Вывод:
# 512 ESTAB
# 1024 TIME-WAIT
# 256 SYN-SENT
# 64 CLOSE-WAIT
Охренеть, 1024 соединения в TIME-WAIT! Это значит, что сокеты не успевают закрываться. Оказалось, что приложение не закрывало HTTP keep-alive соединения правильно. Подкрутил параметры ядра:
# Уменьшаем время жизни TIME-WAIT соединений sudo sysctl -w net.ipv4.tcp_fin_timeout=30 # Разрешаем повторное использование TIME-WAIT сокетов 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
После этого сервер начал держать в 3 раза больше соединений без просадок.
4. nslookup / dig / host — DNS детективы
Половина всех сетевых проблем — это проблемы с DNS. Сайт не открывается? Проверь DNS. Почта не работает? Проверь MX-записи. Что-то тормозит? Возможно, DNS resolver умер.
Windows (nslookup):
# Простой запрос nslookup google.com # Указать конкретный DNS сервер nslookup google.com 8.8.8.8 # Запросить конкретный тип записи nslookup -type=MX gmail.com nslookup -type=TXT google.com nslookup -type=NS microsoft.com # Обратный DNS lookup (PTR запись) nslookup 8.8.8.8 # Интерактивный режим nslookup > set type=A > google.com > set type=MX > gmail.com > exit
Linux (dig и host):
# dig — самый мощный инструмент dig google.com # Только ответ, без лишней информации dig google.com +short # Запросить у конкретного DNS dig @8.8.8.8 google.com # Конкретный тип записи dig MX gmail.com dig TXT google.com +short dig NS cloudflare.com # Обратный lookup dig -x 8.8.8.8 # Trace — показать весь путь резолвинга от root серверов dig +trace google.com # ANY — все доступные записи (не все DNS отвечают на ANY) dig ANY google.com # host — более простая альтернатива host google.com host -t MX gmail.com host 8.8.8.8
Практический пример: После смены DNS провайдера начались жалобы «сайт не открывается». Проверяю DNS:
# Смотрю, что отдает наш корпоративный DNS dig @192.168.1.10 company-intranet.local # Получаю старый IP! DNS cache не обновился # Смотрю TTL записи dig company-intranet.local +noall +answer # company-intranet.local. 86400 IN A 10.0.0.50 <-- TTL 24 часа! # Чищу кеш на DNS сервере (Windows DNS Server) # На сервере DNS: ipconfig /flushdns Clear-DnsServerCache # На Linux DNS (bind/named) sudo rndc flush
Урок на будущее: перед сменой DNS записей уменьшай TTL до 300 секунд (5 минут) за день до изменений. Потом меняй записи, ждешь час, возвращаешь TTL обратно. Profit.
5. ipconfig / ifconfig / ip — конфигурация сетевых интерфейсов
Базовая информация о сетевых интерфейсах: IP-адреса, маски, шлюзы, MAC-адреса. Без этого никуда.
Windows:
# Показать конфигурацию всех адаптеров ipconfig /all # Только IPv4 адреса ipconfig | findstr "IPv4" # Обновить IP адрес по DHCP ipconfig /release ipconfig /renew # Очистить DNS cache ipconfig /flushdns # Показать DNS cache ipconfig /displaydns # PowerShell альтернатива (более мощная) Get-NetIPAddress Get-NetIPConfiguration Get-NetAdapter
Linux:
# Старый добрый ifconfig (deprecated, но все еще работает) ifconfig # Показать только активные интерфейсы ifconfig | grep -A 1 &amp;amp;amp;quot;flags=.*UP&amp;amp;amp;quot; # Современная замена — ip (iproute2) ip addr show ip a # короткая версия # Показать только IPv4 ip -4 addr # Конкретный интерфейс ip addr show eth0 # Статистика по интерфейсам ip -s link # Информация о маршрутах ip route show # Соседи по сети (<a class="wpil_keyword_link" href="https://it-apteka.com/tag/arp/" title="arp" data-wpil-keyword-link="linked" data-wpil-monitor-id="218">ARP</a> таблица) ip neigh show
Практический пример: На Linux сервере после настройки VLAN интернет пропал. Смотрю конфигурацию:
ip addr show # Вижу: # 1: lo: &amp;amp;amp;lt;LOOPBACK,UP,LOWER_UP&amp;amp;amp;gt; # 2: eth0: &amp;amp;amp;lt;BROADCAST,MULTICAST,UP,LOWER_UP&amp;amp;amp;gt; # inet 192.168.1.100/24 brd 192.168.1.255 scope global eth0 # 3: eth0.10@eth0: &amp;amp;amp;lt;BROADCAST,MULTICAST,UP,LOWER_UP&amp;amp;amp;gt; # inet 10.0.10.50/24 brd 10.0.10.255 scope global eth0.10 # Проверяю маршруты ip route show # Вывод: # default via 192.168.1.1 dev eth0 # 10.0.10.0/24 dev eth0.10 proto kernel scope link src 10.0.10.50 # 192.168.1.0/24 dev eth0 proto kernel scope link src 192.168.1.100
Все выглядит правильно. Но пинг до шлюза не проходит! Смотрю дальше:
# Проверяю, может интерфейс eth0.10 не поднят? ip link show eth0.10 # eth0.10@eth0: &amp;amp;amp;lt;BROADCAST,MULTICAST&amp;amp;amp;gt; mtu 1500 qdisc noop state DOWN # ^^^^^^^^^ ВОТ ОНО! # Поднимаю интерфейс sudo ip link set eth0.10 up # Проверяю ip link show eth0.10 # eth0.10@eth0: &amp;amp;amp;lt;BROADCAST,MULTICAST,UP,LOWER_UP&amp;amp;amp;gt; mtu 1500
Забыл поднять интерфейс после создания VLAN. Классика. Всегда после создания VLAN/интерфейса делай `ip link set up`!
6. arp — таблица соответствия IP и MAC
ARP (Address Resolution Protocol) связывает IP-адреса с MAC-адресами в локальной сети. Когда хост отваливается или IP-адрес конфликтует — ARP таблица это покажет.
Windows:
# Показать ARP таблицу arp -a # Добавить статическую ARP запись (нужны права админа) arp -s 192.168.1.50 00-11-22-33-44-55 # Удалить ARP запись arp -d 192.168.1.50 # Очистить всю ARP таблицу netsh interface ip delete arpcache
Linux:
# Показать ARP таблицу (старый способ) arp -n # Современный способ ip neigh show # Только для конкретного интерфейса ip neigh show dev eth0 # Удалить запись sudo ip neigh del 192.168.1.50 dev eth0 # Очистить ARP cache sudo ip neigh flush all # Добавить статическую запись sudo ip neigh add 192.168.1.50 lladdr 00:11:22:33:44:55 dev eth0 nud permanent
Практический пример: Пользователь жалуется: «Не могу подключиться к серверу 192.168.1.100, а другие могут». Классический случай отравления ARP кеша (ARP poisoning) или дублирующегося IP.
# На машине пользователя (Windows) arp -a | findstr &amp;amp;amp;quot;192.168.1.100&amp;amp;amp;quot; # Вывод: # 192.168.1.100 aa-bb-cc-dd-ee-ff dynamic # На другой рабочей машине arp -a | findstr &amp;amp;amp;quot;192.168.1.100&amp;amp;amp;quot; # Вывод: # 192.168.1.100 00-11-22-33-44-55 dynamic &amp;amp;amp;lt;-- ДРУГОЙ MAC! # Два разных MAC для одного IP! Конфликт адресов или ARP spoofing
Пошел на сервер, проверил:
ip link show | grep &amp;amp;amp;quot;link/ether&amp;amp;amp;quot; # link/ether 00:11:22:33:44:55 &amp;amp;amp;lt;-- Правильный MAC # Нашел в сети устройство с MAC aa-bb-cc-dd-ee-ff # Оказалось, что кто-то поднял виртуалку с тем же IP адресом
Решение: отключил виртуалку, на всех проблемных машинах очистил ARP cache:
# Windows arp -d 192.168.1.100 # Linux sudo ip neigh flush dev eth0
7. route — управление таблицей маршрутизации
Когда пакеты идут не туда, куда нужно — проблема в маршрутизации. route показывает, куда система отправляет пакеты для разных сетей.
Windows:
# Показать таблицу маршрутизации route print # Добавить маршрут route ADD 10.0.0.0 MASK 255.255.255.0 192.168.1.1 METRIC 10 # Удалить маршрут route DELETE 10.0.0.0 # Добавить постоянный маршрут (сохранится после перезагрузки) route -p ADD 10.0.0.0 MASK 255.255.255.0 192.168.1.1 # Изменить метрику маршрута route CHANGE 10.0.0.0 MASK 255.255.255.0 192.168.1.1 METRIC 5 # PowerShell альтернатива Get-NetRoute New-NetRoute -DestinationPrefix &amp;amp;amp;quot;10.0.0.0/24&amp;amp;amp;quot; -NextHop &amp;amp;amp;quot;192.168.1.1&amp;amp;amp;quot; -InterfaceAlias &amp;amp;amp;quot;Ethernet&amp;amp;amp;quot; Remove-NetRoute -DestinationPrefix &amp;amp;amp;quot;10.0.0.0/24&amp;amp;amp;quot;
Linux:
# Показать таблицу маршрутизации (старый способ) route -n # Современный способ ip route show # Добавить маршрут sudo ip route add 10.0.0.0/24 via 192.168.1.1 dev eth0 # Удалить маршрут sudo ip route del 10.0.0.0/24 # Изменить default gateway sudo ip route change default via 192.168.1.254 # Добавить маршрут с метрикой sudo ip route add 10.0.0.0/24 via 192.168.1.1 metric 100 # Постоянные маршруты в Ubuntu/Debian добавляются в /etc/netplan/ или /etc/network/interfaces # В RHEL/CentOS — в /etc/sysconfig/network-scripts/route-&amp;amp;amp;lt;interface&amp;amp;amp;gt;
Практический пример: У компании два интернет-канала: основной (быстрый) и резервный (медленный). После настройки failover весь трафик пошел через медленный канал.
# Смотрю маршруты ip route show # Вижу: # default via 192.168.2.1 dev eth1 metric 100 &amp;amp;amp;lt;-- Резервный канал # default via 192.168.1.1 dev eth0 metric 200 &amp;amp;amp;lt;-- Основной канал # Метрика у резервного канала МЕНЬШЕ, поэтому он выбран по умолчанию! # Чем меньше метрика, тем выше приоритет маршрута # Исправляю sudo ip route del default via 192.168.2.1 sudo ip route add default via 192.168.2.1 metric 200 sudo ip route del default via 192.168.1.1 sudo ip route add default via 192.168.1.1 metric 100 # Теперь основной канал (metric 100) используется по умолчанию # Резервный (metric 200) подхватится, если основной упадет
Делаем изменения постоянными в /etc/netplan/01-netcfg.yaml:
&amp;lt;a class=&amp;quot;wpil_keyword_link&amp;quot; href=&amp;quot;https://it-apteka.com/category/networks/&amp;quot; title=&amp;quot;Сети&amp;quot; data-wpil-keyword-link=&amp;quot;linked&amp;quot; data-wpil-monitor-id=&amp;quot;57&amp;quot;&amp;gt;network&amp;lt;/a&amp;gt;:
version: 2
ethernets:
eth0:
addresses: [192.168.1.100/24]
routes:
- to: 0.0.0.0/0
via: 192.168.1.1
metric: 100
eth1:
addresses: [192.168.2.100/24]
routes:
- to: 0.0.0.0/0
via: 192.168.2.1
metric: 200
# Применяем
sudo netplan apply
8. tcpdump / Wireshark — тяжелая артиллерия для глубокого анализа
Когда все предыдущие команды не помогли найти проблему — время доставать tcpdump или Wireshark. Эти инструменты перехватывают реальные пакеты и показывают, что происходит на wire level.
Linux (tcpdump):
# Захват всех пакетов на интерфейсе sudo tcpdump -i eth0 # Захват и вывод в читаемом виде sudo tcpdump -i eth0 -n -v # Захват только TCP трафика на порт 80 sudo tcpdump -i eth0 &amp;amp;amp;#039;tcp port 80&amp;amp;amp;#039; # Захват HTTP трафика с содержимым (ASCII) sudo tcpdump -i eth0 -A &amp;amp;amp;#039;tcp port 80&amp;amp;amp;#039; # Захват ICMP (ping) sudo tcpdump -i eth0 icmp # Захват между двумя хостами sudo tcpdump -i eth0 &amp;amp;amp;#039;host 192.168.1.100 and host 192.168.1.200&amp;amp;amp;#039; # Захват с сохранением в файл (для анализа в Wireshark) sudo tcpdump -i eth0 -w capture.pcap # Чтение из файла tcpdump -r capture.pcap # Захват с ротацией файлов (по 100MB, макс 10 файлов) sudo tcpdump -i eth0 -w capture.pcap -C 100 -W 10 # Показать только HTTP GET запросы sudo tcpdump -i eth0 -s 0 -A &amp;amp;amp;#039;tcp dst port 80 and tcp[((tcp[12:1] &amp;amp;amp;amp; 0xf0) &amp;amp;amp;gt;&amp;amp;amp;gt; 2):4] = 0x47455420&amp;amp;amp;#039; # Захват DNS запросов sudo tcpdump -i eth0 -n &amp;amp;amp;#039;udp port 53&amp;amp;amp;#039; # Захват с показом MAC адресов sudo tcpdump -i eth0 -e # Без резолва имен (быстрее) sudo tcpdump -i eth0 -n -nn
Windows (Wireshark или tshark):
# Wireshark — GUI инструмент, просто открываете и выбираете интерфейс # tshark — консольная версия Wireshark tshark -i &amp;amp;amp;quot;Ethernet&amp;amp;amp;quot; -w capture.pcap # Фильтр по IP tshark -i &amp;amp;amp;quot;Ethernet&amp;amp;amp;quot; -f &amp;amp;amp;quot;host 192.168.1.100&amp;amp;amp;quot; # Фильтр по порту tshark -i &amp;amp;amp;quot;Ethernet&amp;amp;amp;quot; -f &amp;amp;amp;quot;tcp port 443&amp;amp;amp;quot; # Display filter (после захвата) tshark -r capture.pcap -Y &amp;amp;amp;quot;http.request.method == GET&amp;amp;amp;quot; # Показать только HTTP запросы tshark -r capture.pcap -Y &amp;amp;amp;quot;http.request&amp;amp;amp;quot; -T fields -e frame.time -e ip.src -e http.request.method -e http.host -e http.request.uri
Практический пример: VoIP телефония начала «заикаться». Потери пакетов не видны, пинг нормальный, но голос режется.
# Захватываю RTP трафик (VoIP использует UDP порты 10000-20000) sudo tcpdump -i eth0 -w voip.pcap &amp;amp;amp;#039;udp portrange 10000-20000&amp;amp;amp;#039; # Ловлю трафик 2 минуты, потом Ctrl+C # Открываю в Wireshark wireshark voip.pcap # В Wireshark: Telephony -&amp;amp;amp;gt; RTP -&amp;amp;amp;gt; RTP Streams # Смотрю статистику: jitter, packet loss, latency
Вижу, что jitter (вариация задержки) скачет от 5ms до 150ms. Это недопустимо для VoIP (норма до 30ms). Проблема не в потере пакетов, а в нестабильной задержке.
# Смотрю, что еще сейчас жрет сеть iftop -i eth0 # Вижу огромный download с торрент-трекера на другой машине в сети # Настраиваю QoS на роутере, даю приоритет VoIP трафику (DSCP EF) # После настройки QoS jitter упал до 10-15ms, заикания пропали
Урок: не все проблемы связаны с потерей пакетов. Иногда дело в jitter и latency variance. tcpdump + Wireshark — единственный способ это увидеть.
9. nmap — швейцарский нож для сканирования сетей
nmap — это не просто порт-сканер, это целая платформа для исследования сетей. Можно найти живые хосты, определить открытые порты, версии сервисов, операционную систему и даже уязвимости.
Установка:
# Windows: скачать с https://nmap.org/download.html # Linux: sudo apt install nmap # Debian/Ubuntu sudo yum install nmap # RHEL/CentOS
Базовое использование:
# Сканирование одного хоста nmap 192.168.1.100 # Сканирование подсети nmap 192.168.1.0/24 # Быстрое сканирование (только 100 самых популярных портов) nmap -F 192.168.1.100 # Полное сканирование всех 65535 портов nmap -p- 192.168.1.100 # Сканирование конкретных портов nmap -p 22,80,443,3306 192.168.1.100 # Определение версий сервисов nmap -sV 192.168.1.100 # Определение ОС sudo nmap -O 192.168.1.100 # Агрессивное сканирование (версии, ОС, скрипты, traceroute) sudo nmap -A 192.168.1.100 # Ping scan (найти живые хосты без сканирования портов) nmap -sn 192.168.1.0/24 # Обойти файрвол с помощью TCP SYN scan (stealth scan) sudo nmap -sS 192.168.1.100 # UDP сканирование (медленное, но важное) sudo nmap -sU 192.168.1.100 # Сканирование с NSE скриптами (уязвимости) nmap --script vuln 192.168.1.100 # Вывод в разных форматах nmap -oN output.txt 192.168.1.100 # Обычный текст nmap -oX output.xml 192.168.1.100 # XML nmap -oG output.grep 192.168.1.100 # Grep-friendly nmap -oA output 192.168.1.100 # Все форматы
Практический пример: После внедрения новой подсети нужно убедиться, что все сервера подняты и сервисы доступны.
# Сначала найдем все живые хосты
nmap -sn 10.0.10.0/24 -oG hosts.txt
# Парсим результат
grep &amp;amp;amp;quot;Up&amp;amp;amp;quot; hosts.txt | awk &amp;amp;amp;#039;{print $2}&amp;amp;amp;#039; &amp;amp;amp;gt; live_hosts.txt
# Теперь сканируем только живые хосты на критичные порты
nmap -p 22,80,443,3306,5432 -iL live_hosts.txt -oN detailed_scan.txt
# Результат:
# Nmap scan report for 10.0.10.10
# PORT STATE SERVICE
# 22/tcp open ssh
# 80/tcp open http
# 443/tcp closed https &amp;amp;amp;lt;-- ВОТ ПРОБЛЕМА!
# 3306/tcp open <a class="wpil_keyword_link" href="https://it-apteka.com/tag/mysql/" title="MySQL" data-wpil-keyword-link="linked" data-wpil-monitor-id="236">mysql</a>
# На 10.0.10.10 порт 443 закрыт, хотя должен быть открыт
# Проверяю на самом сервере
Иду на сервер 10.0.10.10:
# Проверяю, слушает ли nginx на 443 sudo netstat -tuln | grep :443 # Ничего нет! nginx не запущен или не слушает 443 sudo systemctl status nginx # nginx запущен, но конфиг неправильный sudo nginx -t # nginx: [emerg] cannot load certificate &amp;amp;amp;quot;/etc/nginx/ssl/cert.pem&amp;amp;amp;quot; # Забыли скопировать SSL сертификат! # Копируем, перезапускаем sudo systemctl restart nginx # Проверяем снова nmap -p 443 10.0.10.10 # 443/tcp open https
10. curl / wget — тестирование HTTP/HTTPS сервисов
Когда веб-сервис не работает, curl и wget помогут понять, проблема в сети или в самом приложении. Эти утилиты делают HTTP запросы и показывают детальную информацию.
curl:
# Простой GET запрос
curl https://google.com
# Показать только HTTP заголовки
curl -I https://google.com
# Показать заголовки запроса и ответа
curl -v https://google.com
# POST запрос с данными
curl -X POST -d &amp;amp;amp;quot;user=admin&amp;amp;amp;amp;pass=secret&amp;amp;amp;quot; https://example.com/login
# POST с JSON
curl -X POST -H &amp;amp;amp;quot;Content-Type: application/json&amp;amp;amp;quot; -d &amp;amp;amp;#039;{&amp;amp;amp;quot;key&amp;amp;amp;quot;:&amp;amp;amp;quot;value&amp;amp;amp;quot;}&amp;amp;amp;#039; https://api.example.com/data
# Следовать редиректам
curl -L https://example.com
# Сохранить ответ в файл
curl -o output.html https://example.com
# Показать время выполнения запроса
curl -w &amp;amp;amp;quot;@curl-format.txt&amp;amp;amp;quot; -o /dev/null -s https://example.com
# Где curl-format.txt содержит:
# time_namelookup: %{time_namelookup}s\n
# time_connect: %{time_connect}s\n
# time_appconnect: %{time_appconnect}s\n
# time_pretransfer: %{time_pretransfer}s\n
# time_redirect: %{time_redirect}s\n
# time_starttransfer: %{time_starttransfer}s\n
# ----------\n
# time_total: %{time_total}s\n
# Игнорировать SSL ошибки (ТОЛЬКО ДЛЯ ТЕСТИРОВАНИЯ!)
curl -k https://self-signed-cert.com
# Указать конкретный IP (обход DNS)
curl --resolve example.com:443:1.2.3.4 https://example.com
# Использовать прокси
curl -x http://proxy.local:3128 https://example.com
# HTTP Basic Auth
curl -u username:password https://example.com
# Проверить сертификат
curl -v https://example.com 2&amp;amp;amp;gt;&amp;amp;amp;amp;1 | grep -A 5 &amp;amp;amp;quot;SSL certificate&amp;amp;amp;quot;
wget:
# Скачать файл wget https://example.com/file.zip # Продолжить прерванную загрузку wget -c https://example.com/large-file.iso # Рекурсивно скачать сайт wget -r -np -k https://example.com # Ограничить скорость wget --limit-rate=200k https://example.com/file.zip # Логин и пароль wget --user=username --password=password https://example.com/file # Spider mode (проверить ссылки без скачивания) wget --spider https://example.com # Показать только заголовки wget --spider --server-response https://example.com
Практический пример: Пользователи жалуются на медленную загрузку сайта. Нужно определить, где задержка.
# Создаю curl-format.txt
cat &amp;amp;amp;gt; curl-format.txt &amp;amp;amp;lt;&amp;amp;amp;lt; &amp;amp;amp;#039;EOF&amp;amp;amp;#039;
time_namelookup: %{time_namelookup}s\n
time_connect: %{time_connect}s\n
time_appconnect: %{time_appconnect}s\n
time_pretransfer: %{time_pretransfer}s\n
time_redirect: %{time_redirect}s\n
time_starttransfer: %{time_starttransfer}s\n
----------\n
time_total: %{time_total}s\n
EOF
# Тестирую загрузку страницы
curl -w &amp;amp;amp;quot;@curl-format.txt&amp;amp;amp;quot; -o /dev/null -s https://company-site.com
# Результат:
# time_namelookup: 0.035s &amp;amp;amp;lt;-- DNS lookup
# time_connect: 0.124s &amp;amp;amp;lt;-- TCP handshake
# time_appconnect: 0.456s &amp;amp;amp;lt;-- SSL handshake (ДОЛГО!)
# time_pretransfer: 0.457s
# time_redirect: 0.000s
# time_starttransfer: 1.234s &amp;amp;amp;lt;-- Время до первого байта
# time_total: 2.543s
Вижу, что SSL handshake занимает 0.456s — это очень долго (норма до 0.1s). Проблема в SSL/TLS конфигурации.
# Проверяю SSL конфигурацию openssl s_client -connect company-site.com:443 -tls1_2 # Вижу в выводе: # Verify return code: 0 (ok) # --- # New, TLSv1.2, Cipher is ECDHE-RSA-AES256-GCM-SHA384 # Проверяю, какие cipher suites поддерживает сервер nmap --script ssl-enum-ciphers -p 443 company-site.com
Оказалось, что на сервере включены слабые cipher suites, которые требуют больше вычислений. Отключил их в nginx конфигурации, оставил только современные:
# /etc/nginx/sites-available/company-site.com ssl_protocols TLSv1.2 TLSv1.3; ssl_ciphers &amp;amp;amp;#039;ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES128-GCM-SHA256:ECDHE-ECDSA-AES256-GCM-SHA384:ECDHE-RSA-AES256-GCM-SHA384&amp;amp;amp;#039;; ssl_prefer_server_ciphers off; # Перезагружаю nginx sudo nginx -t &amp;amp;amp;amp;&amp;amp;amp;amp; sudo systemctl reload nginx # Проверяю снова curl -w &amp;amp;amp;quot;@curl-format.txt&amp;amp;amp;quot; -o /dev/null -s https://company-site.com # time_appconnect: 0.089s &amp;amp;amp;lt;-- С 0.456s до 0.089s! В 5 раз быстрее!
11. telnet / nc (netcat) — ручная проверка TCP соединений
Когда нужно проверить, открыт ли порт и можно ли установить TCP соединение, telnet и netcat — ваши друзья. Они просто коннектятся к порту и позволяют отправлять/получать данные.
telnet:
# Проверить доступность порта telnet google.com 80 # Если соединение установлено, можно отправить HTTP запрос вручную: GET / HTTP/1.1 Host: google.com [нажать Enter дважды] # Проверить SMTP сервер telnet &amp;lt;a class=&amp;quot;wpil_keyword_link&amp;quot; href=&amp;quot;https://it-apteka.com/tag/mail/&amp;quot; title=&amp;quot;mail&amp;quot; data-wpil-keyword-link=&amp;quot;linked&amp;quot; data-wpil-monitor-id=&amp;quot;109&amp;quot;&amp;gt;mail&amp;lt;/a&amp;gt;.example.com 25 # EHLO test.com # <a class="wpil_keyword_link" href="https://it-apteka.com/tag/mail/" title="mail" data-wpil-keyword-link="linked" data-wpil-monitor-id="185">MAIL</a> FROM: &amp;amp;amp;lt;test@test.com&amp;amp;amp;gt; # RCPT TO: &amp;amp;amp;lt;recipient@example.com&amp;amp;amp;gt; # QUIT # Проверить POP3 telnet mail.example.com 110 # USER username # PASS password # LIST # Windows: telnet отключен по умолчанию, включить: dism /online /Enable-Feature /FeatureName:TelnetClient
netcat (nc):
# Проверить доступность порта nc -zv google.com 80 # Сканировать диапазон портов nc -zv 192.168.1.100 20-25 # Слушать на порту (создать простой TCP сервер) nc -l -p 1234 # Подключиться к серверу nc localhost 1234 # Передать файл через сеть # На принимающей стороне: nc -l -p 1234 &amp;amp;amp;gt; received_file.txt # На отправляющей: nc receiver.local 1234 &amp;amp;amp;lt; file_to_send.txt # UDP вместо TCP nc -u server.local 53 # Создать простой чат # Сервер: nc -l -p 1234 # Клиент: nc server.local 1234 # Проверить banner сервиса echo &amp;amp;amp;quot;&amp;amp;amp;quot; | nc -v server.local 22 # SSH-2.0-OpenSSH_8.2p1 Ubuntu-4ubuntu0.5 # Проверить HTTP echo -e &amp;amp;amp;quot;GET / HTTP/1.1\r\nHost: example.com\r\n\r\n&amp;amp;amp;quot; | nc example.com 80
Практический пример: Приложение не может подключиться к базе данных MySQL на 192.168.1.50:3306. Нужно понять, проблема в сети или в MySQL.
# Проверяю доступность порта nc -zv 192.168.1.50 3306 # Если успех: # Connection to 192.168.1.50 3306 port [tcp/mysql] succeeded! # Если неудача: # nc: connect to 192.168.1.50 port 3306 (tcp) failed: Connection refused # Connection refused значит, что порт закрыт или MySQL не слушает # Иду на сервер БД и проверяю
На MySQL сервере:
# Проверяю, слушает ли MySQL sudo netstat -tuln | grep 3306 # Вывод: # tcp 0 0 127.0.0.1:3306 0.0.0.0:* LISTEN # АГА! MySQL слушает только на 127.0.0.1 (localhost), а не на всех интерфейсах! # Правлю /etc/mysql/mysql.conf.d/mysqld.cnf sudo vi /etc/mysql/mysql.conf.d/mysqld.cnf # Меняю: # bind-address = 127.0.0.1 # На: # bind-address = 0.0.0.0 # Или указываю конкретный IP сервера: # bind-address = 192.168.1.50 # Перезапускаю MySQL sudo systemctl restart mysql # Проверяю снова sudo netstat -tuln | grep 3306 # tcp 0 0 0.0.0.0:3306 0.0.0.0:* LISTEN &amp;amp;amp;lt;-- ТЕПЕРЬ ОК! # С клиента проверяю снова nc -zv 192.168.1.50 3306 # Connection to 192.168.1.50 3306 port [tcp/mysql] succeeded!
Не забываем про файрвол! Если порт открыт, но всё равно не коннектится — проверяй iptables/firewalld.
12. ss — современная замена netstat
ss (socket statistics) быстрее и информативнее, чем netstat. Показывает детальную информацию о сокетах, включая состояния TCP, очереди, таймеры.
# Показать все TCP соединения ss -t # Показать слушающие порты ss -tl # Показать UDP сокеты ss -u # Показать с номерами портов (без резолва имен) ss -tn # Показать с процессами (нужен root) sudo ss -tp # Показать расширенную информацию (состояния TCP, таймеры) ss -ti # Показать summary ss -s # Фильтр по состоянию TCP ss -t state established ss -t state time-wait ss -t state syn-sent # Фильтр по порту ss -tn sport = :80 ss -tn dport = :443 # Показать соединения к конкретному IP ss -tn dst 8.8.8.8 # Показать память, используемую сокетами ss -tm # Мониторинг в реальном времени watch -n 1 &amp;amp;amp;#039;ss -s&amp;amp;amp;#039;
Практический пример: Веб-сервер nginx начал отдавать 502 Bad Gateway. Нужно понять, почему nginx не может подключиться к backend’у.
# Смотрю соединения nginx к backend (порт 8080) sudo ss -tnp | grep :8080 # Вижу кучу соединений в состоянии SYN-SENT # tcp SYN-SENT 0 1 192.168.1.10:45678 192.168.1.20:8080 users:((&amp;amp;amp;quot;nginx&amp;amp;amp;quot;,pid=1234,fd=15)) # SYN-SENT означает, что nginx отправляет SYN пакеты, но не получает SYN-ACK # Либо backend не отвечает, либо файрвол блокирует # Проверяю backend ssh 192.168.1.20 # На backend&amp;amp;amp;#039;е смотрю, слушает ли приложение sudo ss -tln | grep :8080 # tcp LISTEN 0 128 127.0.0.1:8080 0.0.0.0:* # СНОВА ЭТА ПРОБЛЕМА! Приложение слушает только на localhost! # Нужно настроить его на 0.0.0.0 или конкретный IP
Еще один полезный трюк со ss — мониторинг количества соединений по состояниям:
# Скрипт для мониторинга TCP состояний
watch -n 1 &amp;amp;amp;#039;
echo &amp;amp;amp;quot;TCP Connection States:&amp;amp;amp;quot;;
ss -tan | awk &amp;amp;amp;quot;{print \$1}&amp;amp;amp;quot; | sort | uniq -c | sort -rn;
echo &amp;amp;amp;quot;&amp;amp;amp;quot;;
echo &amp;amp;amp;quot;Top connections by destination IP:&amp;amp;amp;quot;;
ss -tn | grep -v &amp;amp;amp;quot;State&amp;amp;amp;quot; | awk &amp;amp;amp;quot;{print \$5}&amp;amp;amp;quot; | cut -d: -f1 | sort | uniq -c | sort -rn | head -10
&amp;amp;amp;#039;
13. iftop / iptraf / nethogs — мониторинг трафика в реальном времени
Когда нужно понять «кто жрет мой канал», эти утилиты показывают потребление bandwidth в реальном времени по соединениям или процессам.
iftop (мониторинг по соединениям):
# Установка sudo apt install iftop # Debian/Ubuntu sudo yum install iftop # RHEL/CentOS # Запуск sudo iftop -i eth0 # Без резолва имен (быстрее) sudo iftop -i eth0 -n # Показать порты sudo iftop -i eth0 -P # Фильтр по сети sudo iftop -i eth0 -F 192.168.1.0/24 # Горячие клавиши в iftop: # n - переключить резолв имен # s/d - показать/скрыть source/destination # p - показать порты # t - переключить режим отображения (2/3 строки на соединение) # h - помощь # q - выход
nethogs (мониторинг по процессам):
# Установка sudo apt install nethogs # Debian/Ubuntu sudo yum install nethogs # RHEL/CentOS # Запуск sudo nethogs eth0 # Показывает, какой процесс сколько трафика жрет # ОЧЕНЬ полезно для поиска &amp;amp;amp;quot;кто сожрал весь канал&amp;amp;amp;quot;
iptraf-ng (интерактивный мониторинг):
# Установка sudo apt install iptraf-ng # Debian/Ubuntu sudo yum install iptraf-ng # RHEL/CentOS # Запуск sudo iptraf-ng # Выбираете &amp;amp;amp;quot;IP traffic monitor&amp;amp;amp;quot; -&amp;amp;amp;gt; выбираете интерфейс # Показывает все соединения с количеством пакетов и байт
Практический пример: Офисный интернет тормозит. Сотрудники жалуются, что видеоконференции лагают. Нужно найти виновника.
# На шлюзе запускаю nethogs sudo nethogs eth0 # Вижу: # PID USER PROGRAM DEV SENT RECEIVED # 1234 user /usr/bin/transmission eth0 15.2MB 450.3KB &amp;amp;amp;lt;-- ВОТ ОН! # 5678 user firefox eth0 120KB 1.5MB # 9012 user zoom eth0 850KB 2.1MB # Пользователь качает торренты и забивает весь upload канал! # Transmission жрет 15 MB/s upload, а у нас всего 20 MB/s # Находим пользователя ps aux | grep 1234 # user 1234 transmission-gtk # Идем к пользователю или ставим QoS, чтобы ограничить torrent-трафик
Настраиваю QoS на Linux шлюзе с помощью tc (traffic control):
# Ограничиваем torrent-трафик до 5 Mbit/s # Определяем torrent-трафик по портам (обычно 6881-6999, но не всегда точно) # Добавляем qdisc sudo tc qdisc add dev eth0 root handle 1: htb default 10 # Создаем класс для обычного трафика (15 Mbit/s) sudo tc class add dev eth0 parent 1: classid 1:10 htb rate 15mbit ceil 20mbit # Создаем класс для torrent (5 Mbit/s) sudo tc class add dev eth0 parent 1: classid 1:20 htb rate 2mbit ceil 5mbit # Фильтр для torrent портов sudo tc filter add dev eth0 protocol ip parent 1:0 prio 1 u32 match ip dport 6881 0xffff flowid 1:20 # Проверяем sudo tc -s qdisc show dev eth0
14. ethtool — диагностика физического уровня
ethtool показывает настройки и статистику сетевых интерфейсов на физическом уровне: скорость, duplex, ошибки на железе, поддержка offload’ов.
# Показать информацию об интерфейсе sudo ethtool eth0 # Вывод: # Speed: 1000Mb/s # Duplex: Full # Auto-negotiation: on # Link detected: yes # Показать статистику (ошибки, коллизии) sudo ethtool -S eth0 # Показать настройки драйвера sudo ethtool -i eth0 # Изменить скорость и duplex (отключить auto-negotiation) sudo ethtool -s eth0 speed 1000 duplex full autoneg off # Проверить поддержку offload&amp;amp;amp;#039;ов (checksum, TSO, GSO, etc) sudo ethtool -k eth0 # Включить/выключить offload sudo ethtool -K eth0 tso off sudo ethtool -K eth0 gso off # Тест линка (проблема с кабелем/портом) sudo ethtool --test eth0 # Wake-on-LAN настройки sudo ethtool eth0 | grep Wake-on sudo ethtool -s eth0 wol g # Включить WoL
Практический пример: Сервер в дата-центре начал терять пакеты. ping показывает 5-10% потерь, скорость упала.
# Проверяю физический интерфейс sudo ethtool eth0 # Speed: 100Mb/s &amp;amp;amp;lt;-- Должно быть 1000Mb/s! # Duplex: Half &amp;amp;amp;lt;-- Должно быть Full! # Auto-negotiation: on # Link detected: yes # Half duplex на 100Mb/s — это ПЛОХО для сервера! # Смотрю статистику ошибок sudo ethtool -S eth0 | grep -i error # rx_crc_errors: 15234 # rx_frame_errors: 8976 # tx_carrier_errors: 2341 # collisions: 45678 &amp;amp;amp;lt;-- Куча коллизий из-за Half duplex! # Проблема либо в кабеле, либо на свитче порт настроен неправильно
Иду к свитчу, проверяю порт:
# Cisco switch switch# show interface Gi1/0/24 # Вижу: # Half-duplex, 100Mb/s # 45678 collisions # На свитче тоже half duplex и 100 Mbit! # Меняю настройки порта switch# configure terminal switch(config)# interface GigabitEthernet1/0/24 switch(config-if)# speed 1000 switch(config-if)# duplex full switch(config-if)# end switch# write memory
После этого на сервере:
sudo ethtool eth0 # Speed: 1000Mb/s &amp;amp;amp;lt;-- ОТЛИЧНО! # Duplex: Full &amp;amp;amp;lt;-- ОТЛИЧНО! # Потери пакетов исчезли, скорость восстановилась
Урок: всегда проверяй скорость и duplex на обоих концах линка. Auto-negotiation иногда договаривается неправильно, особенно со старым железом.
15. mtr — комбо traceroute + ping для долгосрочного мониторинга
mtr (My Traceroute) — это улучшенный traceroute, который постоянно отправляет пакеты и собирает статистику. Идеален для диагностики нестабильных соединений.
# Установка sudo apt install mtr # Debian/Ubuntu sudo yum install mtr # RHEL/CentOS # Базовое использование (интерактивный режим) mtr google.com # Режим отчета (запустить N пакетов и показать статистику) mtr -r -c 100 google.com # Без резолва имен mtr -n google.com # Показать AS номера mtr --aslookup google.com # TCP вместо ICMP (обходит некоторые файрволы) mtr --tcp -P 80 google.com # Режим CSV для парсинга mtr --csv -c 100 google.com # Сохранить результат в файл mtr -r -c 1000 google.com &amp;amp;amp;gt; mtr_report.txt # С указанием интерфейса mtr -i eth0 google.com
Практический пример: Клиент жалуется на периодические «подвисания» при работе с SaaS приложением. Проблема не постоянная, возникает непредсказуемо.
# Запускаю длительный мониторинг с mtr mtr -r -c 10000 saas-app.com &amp;amp;amp;gt; mtr_long_test.txt # Это займет около 2-3 часов при дефолтном интервале # После завершения анализирую результат cat mtr_long_test.txt # HOST: client-pc Loss% Snt Last Avg Best Wrst StDev # 1. gateway.local 0.0% 10000 1.2 1.3 0.9 3.4 0.3 # 2. isp-router.local 0.0% 10000 8.5 8.7 7.2 15.3 1.2 # 3. isp-backbone.local 0.0% 10000 15.2 15.8 14.1 22.7 1.8 # 4. peering-point.net 2.3% 10000 28.4 29.1 25.6 156.7 12.4 &amp;amp;amp;lt;-- ВОТ! # 5. saas-provider-gw.com 2.1% 10000 32.1 32.8 30.2 159.3 11.8 # 6. saas-app.com 2.1% 10000 33.5 34.2 31.8 161.2 12.1 # На хопе #4 (peering point) потери 2.3% и огромный разброс (StDev 12.4ms) # Wrst (worst) = 156.7ms при средней 29.1ms — скачки задержки в 5+ раз!
Это проблема на уровне peering между провайдерами. Отправляю отчет mtr провайдеру SaaS, они переключают маршрутизацию через другой peering point. Проблема решена.
mtr показывает не только где проблема, но и характер проблемы: постоянные потери, периодические скачки latency, jitter. Это золото для troubleshooting’а.
Бонус: комбо-команды для быстрой диагностики
Когда поступает жалоба «сеть не работает», я всегда прогоняю этот набор команд за 2-3 минуты. Называю его «сетевой health check».
Linux one-liner для быстрой диагностики:
#!/bin/bash
echo &amp;amp;amp;quot;=== <a class="wpil_keyword_link" href="https://it-apteka.com/category/networks/" title="Сети" data-wpil-keyword-link="linked" data-wpil-monitor-id="184">Network</a> Health Check ===&amp;amp;amp;quot;
echo &amp;amp;amp;quot;&amp;amp;amp;quot;
echo &amp;amp;amp;quot;1. Interfaces and IPs:&amp;amp;amp;quot;
ip -br addr show | grep -v &amp;amp;amp;quot;^lo&amp;amp;amp;quot;
echo &amp;amp;amp;quot;&amp;amp;amp;quot;
echo &amp;amp;amp;quot;2. Default Gateway:&amp;amp;amp;quot;
ip route | grep default
echo &amp;amp;amp;quot;&amp;amp;amp;quot;
echo &amp;amp;amp;quot;3. DNS Servers:&amp;amp;amp;quot;
cat /etc/resolv.conf | grep nameserver
echo &amp;amp;amp;quot;&amp;amp;amp;quot;
echo &amp;amp;amp;quot;4. Internet Connectivity (ping Google DNS):&amp;amp;amp;quot;
ping -c 3 8.8.8.8
echo &amp;amp;amp;quot;&amp;amp;amp;quot;
echo &amp;amp;amp;quot;5. DNS Resolution:&amp;amp;amp;quot;
dig google.com +short
echo &amp;amp;amp;quot;&amp;amp;amp;quot;
echo &amp;amp;amp;quot;6. Active Connections Count:&amp;amp;amp;quot;
ss -s
echo &amp;amp;amp;quot;&amp;amp;amp;quot;
echo &amp;amp;amp;quot;7. Listening Ports:&amp;amp;amp;quot;
ss -tuln | grep LISTEN
echo &amp;amp;amp;quot;&amp;amp;amp;quot;
echo &amp;amp;amp;quot;8. Top Bandwidth Consumers:&amp;amp;amp;quot;
sudo ss -tip | awk &amp;amp;amp;#039;{print $5}&amp;amp;amp;#039; | cut -d: -f1 | sort | uniq -c | sort -rn | head -5
echo &amp;amp;amp;quot;&amp;amp;amp;quot;
echo &amp;amp;amp;quot;9. Network Errors:&amp;amp;amp;quot;
ip -s link | grep -A 3 &amp;amp;amp;quot;RX:\|TX:&amp;amp;amp;quot; | grep errors
echo &amp;amp;amp;quot;&amp;amp;amp;quot;
echo &amp;amp;amp;quot;=== Health Check Complete ===&amp;amp;amp;quot;
Сохраняю это в /usr/local/bin/netcheck.sh, делаю chmod +x, и использую постоянно.
Windows PowerShell версия:
Write-Host &amp;amp;amp;quot;=== Network Health Check ===&amp;amp;amp;quot; -ForegroundColor Green
Write-Host &amp;amp;amp;quot;&amp;amp;amp;quot;
Write-Host &amp;amp;amp;quot;1. Network Adapters:&amp;amp;amp;quot; -ForegroundColor Yellow
Get-NetAdapter | Where-Object Status -eq &amp;amp;amp;quot;Up&amp;amp;amp;quot; | Format-Table Name, InterfaceDescription, Status, LinkSpeed
Write-Host &amp;amp;amp;quot;&amp;amp;amp;quot;
Write-Host &amp;amp;amp;quot;2. IP Configuration:&amp;amp;amp;quot; -ForegroundColor Yellow
Get-NetIPAddress | Where-Object {$_.AddressFamily -eq &amp;amp;amp;quot;IPv4&amp;amp;amp;quot; -and $_.InterfaceAlias -notlike &amp;amp;amp;quot;*Loopback*&amp;amp;amp;quot;} | Format-Table InterfaceAlias, IPAddress, PrefixLength
Write-Host &amp;amp;amp;quot;&amp;amp;amp;quot;
Write-Host &amp;amp;amp;quot;3. Default Gateway:&amp;amp;amp;quot; -ForegroundColor Yellow
Get-NetRoute -DestinationPrefix &amp;amp;amp;quot;0.0.0.0/0&amp;amp;amp;quot; | Format-Table DestinationPrefix, NextHop, InterfaceAlias
Write-Host &amp;amp;amp;quot;&amp;amp;amp;quot;
Write-Host &amp;amp;amp;quot;4. DNS Servers:&amp;amp;amp;quot; -ForegroundColor Yellow
Get-DnsClientServerAddress | Where-Object {$_.ServerAddresses -ne $null} | Format-Table InterfaceAlias, ServerAddresses
Write-Host &amp;amp;amp;quot;&amp;amp;amp;quot;
Write-Host &amp;amp;amp;quot;5. Internet Connectivity (ping 8.8.8.8):&amp;amp;amp;quot; -ForegroundColor Yellow
Test-Connection -ComputerName 8.8.8.8 -Count 3
Write-Host &amp;amp;amp;quot;&amp;amp;amp;quot;
Write-Host &amp;amp;amp;quot;6. DNS Resolution:&amp;amp;amp;quot; -ForegroundColor Yellow
Resolve-DnsName google.com
Write-Host &amp;amp;amp;quot;&amp;amp;amp;quot;
Write-Host &amp;amp;amp;quot;7. Active Connections:&amp;amp;amp;quot; -ForegroundColor Yellow
(Get-NetTCPConnection).Count
Get-NetTCPConnection | Group-Object State | Select-Object Name, Count | Sort-Object Count -Descending
Write-Host &amp;amp;amp;quot;&amp;amp;amp;quot;
Write-Host &amp;amp;amp;quot;8. Listening Ports:&amp;amp;amp;quot; -ForegroundColor Yellow
Get-NetTCPConnection -State Listen | Select-Object LocalAddress, LocalPort, OwningProcess | Format-Table
Write-Host &amp;amp;amp;quot;&amp;amp;amp;quot;
Write-Host &amp;amp;amp;quot;=== Health Check Complete ===&amp;amp;amp;quot; -ForegroundColor Green
Практические кейсы из жизни: как я находил самые хитрые проблемы
Кейс 1: Асимметричная маршрутизация убивала TCP соединения
Симптомы: на новом сервере работает HTTP, но SSH зависает после ввода пароля. Пользователи жалуются на «странные проблемы с подключением».
# Захватываю трафик на сервере sudo tcpdump -i eth0 host client-ip -w ssh_problem.pcap # В Wireshark вижу: # - Client отправляет SYN # - Server отвечает SYN-ACK # - Client отправляет ACK # - Соединение установлено # - Client отправляет SSH_MSG_USERAUTH_REQUEST # - Server отправляет ответ, но... с НЕПРАВИЛЬНОГО IP адреса! # У сервера два интерфейса: # eth0: 192.168.1.100 (management) # eth1: 10.0.0.100 (production) # Клиент коннектится к 192.168.1.100 # Но сервер ОТВЕЧАЕТ с 10.0.0.100! # Это называется asymmetric routing # Пакеты приходят на один интерфейс, уходят с другого # Проверяю таблицу маршрутизации ip route show # default via 10.0.0.1 dev eth1 &amp;amp;amp;lt;-- Дефолтный маршрут через eth1! # 192.168.1.0/24 dev eth0 proto kernel scope link src 192.168.1.100 # 10.0.0.0/24 dev eth1 proto kernel scope link src 10.0.0.100 # Когда клиент коннектится к 192.168.1.100, пакет приходит на eth0 # Но ответ идет через default route, т.е. через eth1 с IP 10.0.0.100 # Файрвол на клиенте или промежуточном роутере дропает такие пакеты # Решение: настроить policy-based routing # Пакеты, пришедшие на eth0, должны уходить через eth0 # Создаю отдельную таблицу маршрутизации для eth0 echo &amp;amp;amp;quot;100 mgmt&amp;amp;amp;quot; | 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 # Делаю изменения постоянными в /etc/network/interfaces или netplan
После этого SSH работает идеально. Урок: если половина соединений работает, а половина нет — проверь асимметричную маршрутизацию.
Кейс 2: MSS clamping спас VPN через мобильный интернет
Симптомы: VPN подключается, ping работает, но ни один сайт не открывается. SSH работает, но SCP зависает на больших файлах.
# Классический случай Path MTU Discovery (PMTUD) проблемы # Проверяю MTU на VPN интерфейсе ip link show tun0 # mtu 1500 # Но мобильный оператор имеет <a href="https://it-apteka.com/mtu-i-mru-chto-jeto-kak-vybrat-i-nastroit-optimalnye-znachenija/" data-wpil-monitor-id="441">MTU 1400 где-то в сети</a> # ICMP пакеты с DF (Don&amp;amp;amp;#039;t Fragment) флагом блокируются файрволом оператора # Результат: TCP соединения не могут согласовать правильный MSS # Решение: MSS clamping на VPN сервере (iptables) sudo iptables -t mangle -A FORWARD -p tcp --tcp-flags SYN,RST SYN -j TCPMSS --clamp-mss-to-pmtu # Или устанавливаем конкретное значение MSS (1360 = <a href="https://it-apteka.com/jecp-2026-shpargalka-po-jelektronnoj-podpisi-dlja-goszakupok-i-otchjotnosti/" data-wpil-monitor-id="446">безопасное для большинства мобильных сетей</a>) sudo iptables -t mangle -A FORWARD -p tcp --tcp-flags SYN,RST SYN -j TCPMSS --set-mss 1360 # Сохраняем правило sudo iptables-save | sudo tee /etc/iptables/rules.v4 # После этого все работает!
Этот кейс встречается постоянно с VPN, PPPoE, туннелями. Запомните magic number: MSS = MTU — 40 (для IPv4). Если MTU 1400, то MSS должен быть 1360.
Кейс 3: DNS cache poisoning на корпоративном DNS сервере
Симптомы: случайные пользователи перенаправляются на фишинговые сайты вместо легитимных.
# Проверяю DNS записи для bank.com с корпоративного DNS
dig @192.168.1.10 bank.com
# ;; ANSWER SECTION:
# bank.com. 300 IN A 185.xxx.xxx.xxx &amp;amp;amp;lt;-- НЕПРАВИЛЬНЫЙ IP!
# Проверяю с публичного DNS
dig @8.8.8.8 bank.com
# ;; ANSWER SECTION:
# bank.com. 300 IN A 52.xxx.xxx.xxx &amp;amp;amp;lt;-- ПРАВИЛЬНЫЙ IP
# DNS cache poisoning! Кто-то отравил кеш нашего DNS сервера
# Смотрю логи DNS сервера (BIND)
sudo tail -f /var/log/named/query.log
# Вижу странные запросы от локального IP
# 192.168.1.200 пытается делать рекурсивные запросы к external доменам
# Иду на эту машину
ssh admin@192.168.1.200
# Нахожу вредоносный &amp;lt;a class=&amp;quot;wpil_keyword_link&amp;quot; href=&amp;quot;https://it-apteka.com/category/scripts/&amp;quot; title=&amp;quot;Скрипты&amp;quot; data-wpil-keyword-link=&amp;quot;linked&amp;quot; data-wpil-monitor-id=&amp;quot;78&amp;quot;&amp;gt;скрипт&amp;lt;/a&amp;gt;, который делает DNS cache poisoning атаку
# Удаляю вредонос, чищу <a href="https://it-apteka.com/nslookup-shpargalka-it-inzhenera-s-primerami-dlja-windows-i-linux-2-2/" title="DIG: продвинутая диагностика DNS для Linux и Windows" data-wpil-monitor-id="293">DNS cache на сервере</a>
sudo rndc flush
# Усиливаю &amp;lt;a class=&amp;quot;wpil_keyword_link&amp;quot; href=&amp;quot;https://it-apteka.com/category/security/&amp;quot; title=&amp;quot;Безопасность&amp;quot; data-wpil-keyword-link=&amp;quot;linked&amp;quot; data-wpil-monitor-id=&amp;quot;32&amp;quot;&amp;gt;безопасность&amp;lt;/a&amp;gt; DNS сервера в /etc/named.conf
recursion yes;
allow-recursion { 192.168.0.0/16; }; # Только для внутренней сети
allow-query { 192.168.0.0/16; };
dnssec-enable yes;
dnssec-validation yes;
# Перезапускаю DNS
sudo systemctl restart named
Шпаргалка по troubleshooting: алгоритм диагностики сетевых проблем
Когда пользователь говорит «интернет не работает» или «сервер недоступен», я следую этому алгоритму:
Уровень 1: Физический и канальный уровень
# 1. Проверить link status ip link show eth0 # Linux Get-NetAdapter # Windows # 2. Проверить скорость и duplex sudo ethtool eth0 # 3. Проверить ошибки на интерфейсе ip -s link show eth0 sudo ethtool -S eth0 # Если link down или куча ошибок -&amp;amp;amp;gt; проблема с кабелем/портом/драйвером
Уровень 2: IP адресация
# 4. Проверить IP адрес ip addr show # Linux ipconfig # Windows # 5. Проверить default gateway ip route | grep default route print # Windows # 6. Ping default gateway ping -c 4 192.168.1.1 # Если нет IP или APIPA (169.254.x.x) -&amp;amp;amp;gt; проблема с DHCP # Если gateway не пингуется -&amp;amp;amp;gt; проблема с L2 или gateway down
Уровень 3: Маршрутизация
# 7. Ping внешний IP (8.8.8.8) ping -c 4 8.8.8.8 # 8. Traceroute до внешнего IP traceroute 8.8.8.8 mtr -r -c 50 8.8.8.8 # Если gateway пингуется, но 8.8.8.8 нет -&amp;amp;amp;gt; проблема с маршрутизацией/файрволом # Если traceroute показывает потери -&amp;amp;amp;gt; проблема на конкретном хопе
Уровень 4: DNS
# 9. Проверить DNS резолвинг nslookup google.com dig google.com # 10. Проверить DNS сервера cat /etc/resolv.conf # Linux ipconfig /all # Windows # Если IP работает, но домены нет -&amp;amp;amp;gt; проблема с DNS
Уровень 5: Приложение
# 11. Проверить доступность порта nc -zv server.com 80 telnet server.com 80 Test-NetConnection server.com -Port 80 # PowerShell # 12. Проверить с curl/wget curl -I https://server.com curl -v https://server.com # 13. Захватить трафик sudo tcpdump -i eth0 host server.com -w debug.pcap # Если порт закрыт -&amp;amp;amp;gt; проблема с сервисом или файрволом # Если порт открыт, но приложение не работает -&amp;amp;amp;gt; проблема на L7
Этот алгоритм работает в 95% случаев. Идем по уровням OSI снизу вверх, и на каком-то этапе находим проблему.
Чит-коды для экстренных ситуаций
Быстро найти, какой процесс слушает порт:
# Linux sudo lsof -i :80 sudo ss -tlnp | grep :80 sudo netstat -tlnp | grep :80 # Windows Get-Process -Id (Get-NetTCPConnection -LocalPort 80).OwningProcess netstat -ano | findstr :80
Быстро проверить, открыт ли порт на удаленном хосте:
# Много способов: nc -zv server.com 22 nmap -p 22 server.com telnet server.com 22 timeout 2 <a class="wpil_keyword_link" href="https://it-apteka.com/tag/bash/" title="Bash" data-wpil-keyword-link="linked" data-wpil-monitor-id="220">bash</a> -c &amp;amp;amp;#039;&amp;amp;amp;lt;/dev/tcp/server.com/22&amp;amp;amp;#039; &amp;amp;amp;amp;&amp;amp;amp;amp; echo &amp;amp;amp;quot;Open&amp;amp;amp;quot; || echo &amp;amp;amp;quot;Closed&amp;amp;amp;quot; Test-NetConnection server.com -Port 22 # PowerShell
Быстро найти свой публичный IP:
curl ifconfig.me curl ipinfo.io/ip curl icanhazip.com dig +short myip.opendns.com @resolver1.opendns.com
Быстро проверить, работает ли DNS сервер:
dig @8.8.8.8 google.com +short nslookup google.com 8.8.8.8
Быстро очистить DNS cache:
# Linux (systemd-resolved) sudo systemd-resolve --flush-caches # Linux (nscd) sudo systemctl restart nscd # macOS sudo dscacheutil -flushcache # Windows ipconfig /flushdns
Быстро поменять DNS на Google DNS:
# Linux (temporary) echo &amp;amp;amp;quot;nameserver 8.8.8.8&amp;amp;amp;quot; | sudo tee /etc/resolv.conf echo &amp;amp;amp;quot;nameserver 8.8.4.4&amp;amp;amp;quot; | sudo tee -a /etc/resolv.conf # Windows (PowerShell, нужны права админа) Set-DnsClientServerAddress -InterfaceAlias &amp;amp;amp;quot;Ethernet&amp;amp;amp;quot; -ServerAddresses (&amp;amp;amp;quot;8.8.8.8&amp;amp;amp;quot;,&amp;amp;amp;quot;8.8.4.4&amp;amp;amp;quot;)
Быстро добавить статический маршрут:
# Linux sudo ip route add 10.0.0.0/24 via 192.168.1.1 # Windows route ADD 10.0.0.0 MASK 255.255.255.0 192.168.1.1 -p
Типичные ошибки новичков в network troubleshooting
Ошибка #1: Забывают проверить физический уровень
Сколько раз я видел, как админы час копались в настройках, а проблема была в том, что кабель не до конца вставлен в порт. ВСЕГДА начинай с `ip link show` или `ethtool`. Горящий link light не гарантирует, что все ок — проверяй скорость и duplex.
Ошибка #2: Не понимают разницу между «cannot resolve» и «connection refused»
- Cannot resolve = DNS проблема, домен не резолвится в IP
- Connection refused = хост доступен, но порт закрыт (сервис не запущен или файрвол)
- Connection timeout = пакеты не доходят (маршрутизация, файрвол, хост down)
- No route to host = нет маршрута в таблице маршрутизации
Ошибка #3: Пингуют только с одной стороны
Сеть — это двусторонняя дорога. Если с хоста A не пингуется хост B, обязательно проверь обратное направление. Может быть асимметричная маршрутизация или файрвол на обратном пути.
Ошибка #4: Забывают про MTU
Если ping работает, а HTTP зависает — проверь MTU. Если SCP передает маленькие файлы, но виснет на больших — проверь MTU. PMTUD проблемы встречаются чаще, чем кажется, особенно с VPN, туннелями, PPPoE.
Ошибка #5: Не используют tcpdump/Wireshark
Когда все остальное не помогает — захват пакетов покажет правду. Я не могу сосчитать, сколько раз tcpdump спасал меня. Не бойся его использовать, это не так сложно, как кажется.
Финальные советы от бывалого админа
- Документируй свои находки. Когда найдешь хитрую проблему, запиши ее в wiki/confluence. Через год забудешь, а проблема повторится.
- Автоматизируй повторяющуюся диагностику. Сделай скрипты для типовых проверок. Сэкономишь кучу времени.
- Учи основы TCP/IP. Без понимания OSI модели, TCP handshake, DNS резолвинга — будешь слепым котенком. Почитай «TCP/IP Illustrated» от Stevens.
- Всегда имей план B. Если основной DNS лежит, должен быть резервный. Если основной канал упал, должен быть backup. Single point of failure — это зло.
- Не паникуй. Даже когда весь продакшн горит. Спокойствие, методичная диагностика по алгоритму, и проблема решится.
- Логируй всё. Включи логирование на файрволах, роутерах, DNS серверах. Когда что-то сломается, логи покажут, что произошло.
- Тестируй в dev перед prod. Никогда не меняй маршрутизацию/файрволы в продакшене в пятницу вечером без тестов.
- Общайся с провайдерами. Если проблема на их стороне — давай им конкретные данные: mtr отчеты, traceroute, время проблем. Чем конкретнее, тем быстрее починят.
Заключение: что в сухом остатке
Эти 15 команд — это фундамент сетевой диагностики. Освой их, и сможешь решить 90% сетевых проблем. Остальные 10% — экзотика, требующая глубокого погружения в специфику (BGP, MPLS, SDN и т.д.).
Помни золотое правило troubleshooting’а: диагностика по уровням OSI, от простого к сложному. Сначала проверь физический уровень (link, кабель), потом IP адресацию, потом маршрутизацию, DNS, и только в конце копайся в приложениях.
И еще один совет: не бойся гуглить. Даже админы с 20-летним стажем гуглят синтаксис команд и ошибки. Никто не помнит все флаги tcpdump или все опции iptables. Важно понимать концепцию, а детали всегда можно посмотреть в man или Stack Overflow.
Сетевая инженерия и системное администрирование — это бесконечное обучение. Технологии меняются, появляются новые протоколы, новые проблемы. Но базовые принципы остаются. Освой эти 15 команд, понимай, как работает TCP/IP stack, и ты всегда будешь востребованным специалистом.
А самое главное — не отчаивайся, когда что-то не получается. Я помню, как в начале карьеры мог три дня биться над простой проблемой, которая сейчас решается за 5 минут. Опыт приходит с практикой. Каждая решенная проблема делает тебя сильнее.
Удачи в траблшутинге, коллеги! Пусть ваши пинги будут быстрыми, пакеты не теряются, а jitter остается низким! 🚀



