Сетевые и системные диагностические утилиты
Домашний сервер, WireGuard и "почему не открывается сайт" требуют тех же утилит, что и у разработчика.
Теория протоколов — в разделе "Сеть"; практика VPN — в self-hosting.
Минимальный набор "диагностика дома"
При сбоях подключения, "сайт не открывается" или нестабильном канале сначала смотрят доступность (ping), маршрут (tracert / mtr), адреса и DNS (ipconfig / ip, dig / nslookup), затем порты и HTTP (netstat / ss, curl -I). Полная кроссплатформенная таблица с примерами — в Сетевых подключениях и диагностике.
| Задача | Linux / macOS | Windows | Пример |
|---|---|---|---|
| Доступность узла, RTT | ping | ping | ping 1.1.1.1 |
| Маршрут | traceroute, mtr | tracert, pathping | mtr example.com |
| IP, шлюз, DNS-серверы | ip addr | ipconfig /all | ipconfig /all |
| DNS | dig | nslookup | dig A example.com +short |
| Слушающие порты | ss -tulpn | netstat -ano | ss -tulpn |
| HTTP-заголовки | curl -I | curl -I | curl -I https://example.com |
| Захват пакетов | Wireshark, tcpdump | Wireshark, pktmon | см. раздел ниже |
| Home Lab, SSH | ssh | PuTTY, Windows Terminal | ssh user@192.168.1.10 |
| Нестабильный канал | WinMTR / mtr | WinMTR, 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"
Различия с другими инструментами
| Критерий | cURL | Postman | wget |
|---|---|---|---|
| Установка | Встроена в 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
Проблемы современного использования
- Небезопасен. Данные передаются в открытом виде — пароли, команды видны любому перехватчику трафика.
- Отсутствует шифрование. Не подходит для работы с реальными системами аутентификации.
- Мало функций. Современные аналоги (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) | Частью набора Nmap | SSL, proxy, многопоточность |
Нcat интегрируется с Nmap для автоматизированного сканирования, поддерживает SSL-соединения и позволяет работать со списком IP-адресов одновременно.
Установка сетевых утилит
Для главы про диагностику достаточно знать, откуда ставить CLI. Подробнее про winget и воспроизводимый стек — в обзоре раздела.
| Платформа | Инструмент | Пример |
|---|---|---|
| Windows | winget | winget install WiresharkFoundation.Wireshark |
| Windows | Chocolatey / Scoop | Альтернатива winget в корпоративных средах |
| Linux | apt / dnf | sudo 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 | Основная задача | Типичный сценарий |
|---|---|---|---|
| curl | 7 (Application) | HTTP запросы | Тестирование API |
| telnet | 5 (Session) | Проверка портов | Диагностика доступа |
| netcat | 3-7 (Сеть-App) | Универсальный обмен | Создание тестовых серверов |
| traceroute | 3 (Сеть) | Маршрутизация | Поиск проблем связности |
| mtr | 3 (Сеть) | Мониторинг качества | Диагностика стабильности |
| tcpdump | 1-7 (All) | Запись трафика | Отладка сложных проблем |
| dig | 5 (Session) | DNS диагностика | Проверка разрешений |
| jq | 7 (Application) | Обработка JSON | Парсинг ответов API |
| ssh-client | 7 (Application) | Удалённое управление | Администрирование серверов |
| sftp | 7 (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 с ноутбука.
| Шаг | Инструмент | Что видите |
|---|---|---|
| DNS | dig example.com | IP сервера |
| Маршрут | mtr / tracert | Где растёт задержка |
| TCP | Test-NetConnection -Port 443 | Доступен ли порт |
| TLS | браузер / openssl s_client | Сертификат, версия |
| HTTP | curl -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 — когда уже знаете, что ищете (порт, протокол), иначе утонете в пакетах.