Перейти к основному содержимому

Сетевые и системные диагностические утилиты

Опытному пользователю
Сеть для power user

Домашний сервер, WireGuard и "почему не открывается сайт" требуют тех же утилит, что и у разработчика.

Теория протоколов — в разделе "Сеть"; практика VPN — в self-hosting.


Минимальный набор "диагностика дома"

При сбоях подключения, "сайт не открывается" или нестабильном канале сначала смотрят доступность (ping), маршрут (tracert / mtr), адреса и DNS (ipconfig / ip, dig / nslookup), затем порты и HTTP (netstat / ss, curl -I). Полная кроссплатформенная таблица с примерами — в Сетевых подключениях и диагностике.

ЗадачаLinux / macOSWindowsПример
Доступность узла, RTTpingpingping 1.1.1.1
Маршрутtraceroute, mtrtracert, pathpingmtr example.com
IP, шлюз, DNS-серверыip addripconfig /allipconfig /all
DNSdignslookupdig A example.com +short
Слушающие портыss -tulpnnetstat -anoss -tulpn
HTTP-заголовкиcurl -Icurl -Icurl -I https://example.com
Захват пакетовWireshark, tcpdumpWireshark, pktmonсм. раздел ниже
Home Lab, SSHsshPuTTY, Windows Terminalssh user@192.168.1.10
Нестабильный каналWinMTR / mtrWinMTR, pathpingпотери по hop

Диагностика в PowerShell (Windows)

На домашнем ПК чаще хватает встроенных команд — без установки отдельных утилит:

# Доступность хоста и порта
Test-NetConnection google.com -Port 443

# DNS
Resolve-DnsName example.com

# Кто слушает порты локально
Get-NetTCPConnection -State Listen |
Select-Object LocalAddress, LocalPort, OwningProcess |
Sort-Object LocalPort

# HTTP API (аналог curl для JSON)
Invoke-RestMethod -Uri 'https://api.github.com/repos/microsoft/vscode'

Когда что использовать: ping / Test-NetConnection — "жив ли хост"; tracert — где рвётся маршрут; nslookup / Resolve-DnsName — проблема DNS; Wireshark — только если нужно увидеть пакеты (TLS внутри шифрован, но SYN/RST и DNS видны). Теория протоколов — в разделе "Сеть".

Установка CLI-утилит на Windows: winget (см. 1.035 / 501), на Linux — apt / dnf.


Значение сетевых утилит в работе разработчика

Программист не работает изолированно от инфраструктуры приложения. Современное программное обеспечение представляет собой распределённую систему компонентов, взаимодействующих через сеть. Понимание того, как происходит передача данных между клиентом и сервером, как конфигурируются соединения, какие протоколы используются — критически важно для разработки качественного программного продукта.

Для программиста владение сетевыми утилитами означает возможность:

  • проверять работоспособность собственных API без необходимости запуска полноценного тестового окружения;
  • отлаживать проблемы соединения на уровне сетевого протокола;
  • анализировать трафик между компонентами системы для поиска узких мест;
  • автоматизировать развёртывание приложений на удалённых хостах;
  • контролировать состояние сетевой безопасности при разработке защищённых приложений.

Утилиты делятся на две группы: базовые команды командной строки для повседневных задач и специализированные инструменты для глубокого анализа сети. Оба уровня компетенции необходимы на протяжении всей карьеры разработчика.


Команды сетевого взаимодействия на уровне ОС

cURL — универсальный инструмент работы с HTTP/HTTPS

cURL представляет собой консольную утилиту для пересылки данных по различным сетевым протоколам. Название расшифровывается как Client URL. Основная сфера применения — работа с REST API, веб-скрапинг, проверка работоспособности эндпоинтов.


Базовая функциональность

Команда curl отправляет HTTP-запрос к указанному URL и выводит ответ в стандартный поток вывода. По умолчанию использует метод GET, но поддерживает все основные методы — POST, PUT, DELETE, HEAD, PATCH.

curl https://api.example.com/users
curl --request POST https://api.example.com/users \
--header "Content-Type: application/json" \
--data "{\"name\":\"John\",\"email\":\"john@example.com\"}"
curl --request GET https://api.example.com/users/123 \
--header "Authorization: Bearer token123"
curl --request DELETE https://api.example.com/users/123 \
--header "Authorization: Bearer token123"

Пример ответа из консоли показывает статус, заголовки и тело ответа:

HTTP/2 200
content-type: application/json; charset=utf-8
cache-control: max-age=300
x-ratelimit-limit: 100
x-ratelimit-remaining: 99
{"id":123,"name":"John","email":"john@example.com"}

Работа с авторизацией

Реальная работа с API требует передачи токенов аутентификации. cURL предоставляет несколько способов:

Bearer токен:

curl -H "Authorization: Bearer eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9..." \
https://api.example.com/profile

Basic authentication:

curl -u username:password https://api.example.com/data

API ключ в заголовке:

curl -H "X-API-Key: sk_live_abc123xyz" https://api.example.com/query

Сохранение результатов запроса

Загрузка контента или сохранение ответов в файлы:

# Сохранение тела ответа в файл
curl -o response.json https://api.example.com/data

# Сохранение всех данных запроса (заголовки + тело)
curl -D headers.txt -o body.json https://api.example.com/data

# Скачивание файла из URL
curl -O https://example.com/archive.tar.gz

# Запись нескольких файлов в разные названия
curl -O http://example.com/file1.zip http://example.com/file2.zip

Отладка и версионность

Параметры verbose и trace предоставляют детальную информацию о процессе запроса:

# Показать весь процесс запроса
curl -v https://api.example.com/data

# Показывать только заголовки
curl -I https://api.example.com/data

# Отобразить время выполнения каждой операции
curl -w "@curl-format.txt" -o /dev/null -s https://api.example.com/data

Формат для вывода времени (curl-format.txt):

time_namelookup: %{time_namelookup}\n
time_connect: %{time_connect}\n
time_appconnect: %{time_appconnect}\n
time_pretransfer: %{time_pretransfer}\n
time_starttransfer: %{time_starttransfer}\n
time_total: %{time_total}\n

Пример использования в скрипте

#!/bin/bash
API_URL="https://api.github.com/repos/spirzen/it-knowledge-base"

response=$(curl -s "$API_URL")
stars=$(echo "$response" | jq -r '.stargazers_count')
forks=$(echo "$response" | jq -r '.forks_count')

echo "Stars: $stars, Forks: $forks"

Различия с другими инструментами

КритерийcURLPostmanwget
УстановкаВстроена в Linux/macOSТребуется отдельная установкаВстроена в большинство систем
АвтоматизацияВысокая (командная строка)Средняя (GUI)Средняя
АвторизацияМного способов (заголовки, -u, сертификаты)GUI + EnvironmentТолько Basic Auth
ПеременныеДа (через оболочки)Да (Environments)Нет
Интеграция CI/CDПрямаяТребует NewmanПрямая

cURL становится основным инструментом для написания скриптов автоматизации, интеграции в CI/CD пайплайны и быстрой проверки API в production среде.


Telnet — классический инструмент проверки портов

Telnet исторически был предназначен для удалённого управления терминалами, но в современной разработке его значение сместилось в сторону диагностирования доступности TCP-портов.


Принцип работы

Протокол Telnet использует порт 23 по умолчанию для создания незашифрованного соединения между клиентом и сервером. При подключении программа устанавливает TCP-соединение, ожидает handshake и передаёт символы напрямую на сервер.

Тестирование подключения к порту:

telnet api.example.com 443
telnet localhost 80
telnet smtp.mail-server.com 25

Интерпретация результатов:

  • Connected — порт открыт и принимает соединения. Сервер может отвечать символами прописи (banner) или пустой строкой.
  • Connection refused — порт закрыт или приложение не слушает этот порт.
  • Connection timed out — пакет теряется, вероятно, блокируется файрволом.
  • Could not open connection — локальная проблема сетевой конфигурации.

Использование в тестах доступности

#!/bin/bash

# Функция проверки порта
check_port() {
local host=$1
local port=$2
local timeout=${3:-5}

if timeout $timeout bash -c "</dev/tcp/$host/$port" 2>/dev/null; then
echo "[OK] $host:$port доступен"
return 0
else
echo "[FAIL] $host:$port недоступен"
return 1
fi
}

# Проверка ключевых сервисов
check_port "localhost" 3306 # MySQL
check_port "localhost" 5432 # PostgreSQL
check_port "localhost" 80 # HTTP
check_port "localhost" 443 # HTTPS
check_port "localhost" 6379 # Redis

Проблемы современного использования

  1. Небезопасен. Данные передаются в открытом виде — пароли, команды видны любому перехватчику трафика.
  2. Отсутствует шифрование. Не подходит для работы с реальными системами аутентификации.
  3. Мало функций. Современные аналоги (nc, ncat) предлагают больше возможностей.

Тем не менее, telnet остаётся полезным для базовой проверки доступности портов в ситуациях, когда другие инструменты отсутствуют.


Netcat — мультифункциональный сетевой нож

Netcat (часто обозначается как nc) представляет собой более продвинутую версию telnet с поддержкой UDP, TCP, Unix sockets, сканирования портов и пересылки трафика.


Основные сценарии использования

Проверка порта с timeout:

nc -zv example.com 80
nc -zv example.com 443

Создание простого сервера:

# Слушаем на порту 12345
nc -l -p 12345

# Пересылка содержимого в файл
nc -l -p 12345 > incoming.dat

# Чтение из файла и отправка
nc -l -p 12345 < outgoing.dat

Тестирование HTTP endpoint:

$ nc example.com 80
GET / HTTP/1.0

HTTP/1.1 200 OK
Date: Fri, 15 May 2026 10:30:00 GMT
Server: nginx/1.18.0
...

UDP тест:

# Отправить данные на UDP порт
echo "test" | nc -u example.com 53

# Послушать UDP порт
nc -lu 12345

Перехват трафика:

# Прослушивание входящих соединений с логируйнг
nc -lv 12345 > captured_traffic.log

Различие между версиями netcat

ВерсияОсобенностиПоддержка
GNU NetcatСтандартный вариант в LinuxВсе основные возможности
OpenBSD NetcatБолее безопасен, меньше функцийБезопасная передача
Ncat (Nmap)Частью набора NmapSSL, proxy, многопоточность

Нcat интегрируется с Nmap для автоматизированного сканирования, поддерживает SSL-соединения и позволяет работать со списком IP-адресов одновременно.


Установка сетевых утилит

Для главы про диагностику достаточно знать, откуда ставить CLI. Подробнее про winget и воспроизводимый стек — в обзоре раздела.

ПлатформаИнструментПример
Windowswingetwinget install WiresharkFoundation.Wireshark
WindowsChocolatey / ScoopАльтернатива winget в корпоративных средах
Linuxapt / dnfsudo apt install curl bind9-dnsutils
winget search wireshark
winget install --id WiresharkFoundation.Wireshark -e
sudo apt update && sudo apt install -y curl dnsutils traceroute

Инструменты проверки сетевой инфраструктуры

Traceroute — отображение маршрута до цели

Traceroute показывает все промежуточные узлы (хопы) на пути от источника до получателя.


Синтаксис различных реализаций

Linux/macOS:

traceroute google.com
traceroute -T google.com 443 # TCP mode
traceroute -U google.com 443 # UDP mode

Windows:

tracert google.com
tracert -d google.com # Не раскрывать IP
tracert -h 10 google.com # Максимум 10 прыжков

Интерпретация результата:

1 10.0.0.1 0.3 ms 0.2 ms 0.2 ms
2 192.168.1.1 5.4 ms 5.3 ms 5.5 ms
3 * * * # Узел не отвечает
4 203.0.113.1 12.1 ms 12.0 ms 12.2 ms
...
10 8.8.8.8 18.5 ms 18.3 ms 18.4 ms

Каждая строка показывает один роутер по пути с временем отклика в миллисекундах. Звёздочки означают, что узел не ответил на ICMP-запросы.


MTR — комбинация ping и traceroute

MTR (My Traceroute) объединяет функции ping и traceroute в одном инструменте. Предоставляет статистическую информацию о качестве соединения на каждом hop.


Запуск

mtr google.com
mtr -r google.com # Report mode
mtr -c 100 google.com # 100 ping cycles

Интерфейс

Показывает таблицу с данными:

  • Host — имя узла и IP
  • Loss% — процент потери пакетов
  • Snd — номера отправленных пакетов
  • Avg, Best, Worst — статистика времени

MTR особенно полезен для диагностики нестабильных соединений, где отдельные пакеты теряются на определённых hop.


Специализированные утилиты для разработки

jq — обработка JSON в CLI

jq представляет собой консольный парсер JSON, позволяющий фильтровать и трансформировать JSON-структуры.


Базовые операции

# Извлечь значение поля
echo '{"name":"John","age":30}' | jq '.name'

# Преобразовать массив
echo '[1,2,3]' | jq 'map(. * 2)'

# Фильтрация по условию
echo '[1,2,3,4,5]' | jq '.[] | select(. > 3)'

# Группировка элементов
echo '[{region:"north",value:1},{region:"south",value:2}]' | jq 'group_by(.region)'

Работа с API через curl + jq

curl -s https://api.github.com/repos/spirzen/it-knowledge-base | jq '.stargazers_count, .forks_count'

Итерация по массивам

users='[{"id":1,"name":"Alice"},{"id":2,"name":"Bob"}]'

echo $users | jq -r '.[] | "\(.id) \(.name)"'
# Результат —
# 1 Alice
# 2 Bob

tcpdump — захват пакетов в консоль

tcpdump позволяет захватывать сетевой трафик из командной строки с фильтрацией и экспортом результатов.


Базовый захват

# Захват всех пакетов на eth0
sudo tcpdump -i eth0

# Фильтр по IP
sudo tcpdump host 192.168.1.10

# Фильтр по порту
sudo tcpdump port 80

# Сохранение в файл
sudo tcpdump -i eth0 -w capture.pcap

# Анализ из файла
tcpdump -r capture.pcap

Фильтрация по протоколу

# Только HTTP
tcpdump -i any -n 'tcp port 80 or tcp port 443'

# DNS запросы
tcpdump -i any -n udp port 53

# SYN-пакеты (начало соединения)
tcpdump -i any 'tcp[tcpflags] & tcp-syn != 0'

Пример анализа HTTP

tcpdump -i any -A 'tcp port 80' | strings | grep -E '(GET|POST|HTTP|Host)'

Дополнительные утилиты контроля качества

dig — диагностика DNS

dig (Domain Information Groper) проверяет DNS-записи и параметры разрешения имён.

# A запись для домена
dig example.com

# MX записи (почтовые серверы)
dig mx example.com

# TXT записи (SPF, DKIM)
dig txt example.com

# Проверка конкретного DNS сервера
dig @8.8.8.8 example.com

# Обратный поиск по IP
dig -x 8.8.8.8

Режим короткого вывода

dig +short example.com
# Результат — 142.250.185.78

ss — замена netstat в современных Linux

ss (Socket Statistics) предоставляет информацию об активном сетевом соединении быстрее netstat.

# Все соединения
ss -tuna

# Только TCP
ss -tn

# только listening-порты
ss -tln

# Фильтр по процессу
ss -p 'sport = :443'

# Статистика в кратком формате
ss -s

iproute2 — современная замена ifconfig

# Показать интерфейс
ip addr show eth0

# Назначить IP
sudo ip addr add 192.168.1.100/24 dev eth0

# Включить интерфейс
sudo ip link set eth0 up

# Показать таблицы маршрутизации
ip route show

# Добавить маршрут
sudo ip route add 10.0.0.0/8 via 192.168.1.1

Сравнительная таблица утилит

УтилитаУровень OSIОсновная задачаТипичный сценарий
curl7 (Application)HTTP запросыТестирование API
telnet5 (Session)Проверка портовДиагностика доступа
netcat3-7 (Сеть-App)Универсальный обменСоздание тестовых серверов
traceroute3 (Сеть)МаршрутизацияПоиск проблем связности
mtr3 (Сеть)Мониторинг качестваДиагностика стабильности
tcpdump1-7 (All)Запись трафикаОтладка сложных проблем
dig5 (Session)DNS диагностикаПроверка разрешений
jq7 (Application)Обработка JSONПарсинг ответов API
ssh-client7 (Application)Удалённое управлениеАдминистрирование серверов
sftp7 (Application)Безопасная передача файловЗагрузка артефактов

Примеры интеграции

Шаблон проверки здоровья системы

#!/bin/bash

health_check() {
local host=$1
local ports=$2

for port in $ports; do
if nc -zv -w 2 $host $port > /dev/null 2>&1; then
echo "[OK] Port $port on $host is accessible"
else
echo "[FAIL] Port $port on $host is not accessible"
exit 1
fi
done
}

health_check "localhost" "3306 5432 6379 80 443"

Мониторинг API в цикле

#!/bin/bash

api_url="https://api.example.com/status"
max_attempts=10
interval=5

for attempt in $(seq 1 $max_attempts); do
status=$(curl -s -o /dev/null -w "%{http_code}" $api_url)

if [ "$status" == "200" ]; then
echo "API healthy at attempt $attempt"
break
else
echo "API returned $status on attempt $attempt"
sleep $interval
fi
done

Парсинг логических состояний из логов

#!/bin/bash

log_file="/var/log/application.log"

# Найти ошибки в логе
grep -i "error" $log_file | wc -l

# Получить последнюю ошибку
last_error=$(grep -i "error" $log_file | tail -1)
echo "Last error timestamp: $(date -d "$(echo $last_error | cut -d']' -f1)")"

# Экспорт в CSV
grep "ERROR\|WARN\|INFO" $log_file | awk '{print $1,$2,$3,$NF}' > summary.csv

Под капотом — один запрос — весь путь пакета

Пример: curl https://example.com с ноутбука.

ШагИнструментЧто видите
DNSdig example.comIP сервера
Маршрутmtr / tracertГде растёт задержка
TCPTest-NetConnection -Port 443Доступен ли порт
TLSбраузер / openssl s_clientСертификат, версия
HTTPcurl -vЗаголовки, код 200/301/500
ЗахватWireshark, tcpdumpСырые пакеты (нужны права)

Wireshark показывает кадры; фильтр http или tcp.port == 443 сужает поток. На Wi-Fi без monitor mode часто виден только свой трафик.

jq парсит JSON из API — удобно в связке с curl для health-check скриптов (как в примерах выше).


Опыт, мнение и истории

"Сайт не открывается". ping проходил, curl -v — таймаут на 443. Оказался корпоративный прокси — в браузере настроен, в консоли нет. Урок: сравнивать браузер и curl, смотреть переменные HTTP_PROXY.

mtr до игрового сервера. Потери на hop 4 — провайдер, не "вирус". Скрин mtr в тикет поддержки ускорил разговор.

Wireshark на домашнем роутере. Перехват паролей соседа незаконен; на своём ПК — нормально для обучения. Фильтр по IP — меньше шума.

Мнение. ping, tracert, curl — минимум для любого power user. Wireshark — когда уже знаете, что ищете (порт, протокол), иначе утонете в пакетах.


Содержание