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

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

Всем

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

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

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

  • проверять работоспособность собственных 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" \
--Данные "{\"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/Данные

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

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

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

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

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

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

# Скачивание файла из 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/Данные

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

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

Формат для вывода времени (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 | grep '"stargazers_count"' | cut -d':' -f2 | tr -d ',')
forks=$(echo $response | grep '"forks_count"' | cut -d':' -f2 | tr -d ',')

echo "Star count: $stars"
echo "Fork count: $forks"

if [ $(date +%s) -gt $timestamp ]; then
echo "Статус обновления устарел"
fi

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

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

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


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

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

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

Protokol 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-адресов одновременно.


Менеджеры пакетов для установки утилит

Apt (Advanced Package Tool) — для Debian/Ubuntu систем

Apt является де-факто стандартом для управления программным обеспечением в дистрибутивах Linux на базе Debian.

Базовые команды установки

# Обновление списка пакетов
sudo apt update

# Поиск пакета
apt search curl

# Просмотр информации о пакете
apt show curl

# Установка пакета
sudo apt install curl

# Удаление пакета
sudo apt remove curl

# Полное удаление вместе с конфигами
sudo apt purge curl

# Обновление установленных пакетов
sudo apt upgrade

# Установка нескольких пакетов
sudo apt install git vim curl

Управление зависимостями

# Показать зависимость пакета
apt-cache depends curl

# Найти что использует пакет
apt-cache rdepends vim

# Установить только зависимость
sudo apt install libcurl4-openssl-dev

Работа с репозиториями

# Добавить PPA (Personal Package Archive)
sudo add-apt-repository ppa:deadsnakes/ppa

# Обновление после добавления
sudo apt update

# Просмотр активных репозиториев
cat /etc/apt/sources.list
ls /etc/apt/sources.list.d/

Автоматизация установки

#!/bin/bash

# Установка необходимых инструментов
sudo apt update
sudo apt install -y git curl vim htop screen tmux net-tools

# Удаление ненужных
sudo apt autoremove
sudo apt autoclean

Chocolatey — менеджер пакетов для Windows

Chocolatey предоставляет аналогичный функционал для Windows. Позволяет устанавливать программы через консоль без ручного скачивания установщиков.

Установка самого Chocolatey

# Запуск PowerShell от имени администратора
Set-ExecutionPolicy Bypass -Scope Process -Force; [System.Net.ServicePointManager]::SecurityProtocol = [System.Net.ServicePointManager]::SecurityProtocol -bor 3072; iex ((New-Object System.Net.WebClient).DownloadString('https://community.chocolatey.org/install.ps1'))

Основные команды

# Обновление источника пакетов
choco feature enable -n allowGlobalConfirmation

# Установка пакета
choco install git.install

# Установка пакета с параметрами
choco install python.install -params '/AddToPath:1'

# Обновление всех пакетов
choco upgrade all

# Поиск пакета
choco search curl

# Информация о пакете
choco info curl

# Удаление пакета
choco uninstall curl

Работа с профилями пользователя

# Установка для текущего пользователя
choco install googlechrome.install --user

# Установка системных прав
choco install vlc.install --params '/SILENT'

Сравнение менеджеров пакетов

КритерийaptChocolateyScoopWinget
ОСLinux (Debian)WindowsWindowsWindows
Системный уровеньДаДаПользовательДа
АвтопарсингДаДаДаДа
Реестр WindowsНетЕстьНетЕсть
Скорость установкиСредняяБыстраяБыстраяБыстрая

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

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 прыжков

Interpretация результата:

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 ports
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

См. также

Другие статьи этого же раздела в боковом меню (как на странице «О разделе»).