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

ngrep: grep по сетевым пакетам в реальном времени

Ngrep — утилита, которая ищет паттерны в сетевых пакетах так же, как grep ищет строки в файлах. Когда нужно понять, что конкретно передаётся по сети между двумя сервисами, а tcpdump выдаёт слишком много шума, ngrep позволяет отфильтровать только нужное содержимое.

Установка

Ngrep есть в стандартных репозиториях большинства дистрибутивов.

# Debian/Ubuntu
apt install ngrep

# RHEL/CentOS/Alma
yum install ngrep

# macOS
brew install ngrep

Для работы требует root-привилегий илиcapabilities CAP_NET_RAW и CAP_NET_ADMIN.

Базовый синтаксис

ngrep [options] [pattern] [BPF filters]

Минимальный запуск — поймать все пакеты на порту:

ngrep -i 'password' port 80

Разберём по частям:

  • -i — case-insensitive поиск
  • 'password' — регулярное выражение для поиска в payload
  • port 80 — BPF-фильтр: только трафик на 80-й порт

Вывод похож на tcpdump с расшифровкой payload:

T 10.0.1.15:54321 -> 10.0.2.10:80 [AP]
GET /api/v1/users HTTP/1.1..
Host: api.example.com....

Основные флаги

ФлагОписание
-iИгнорировать регистр при поиске
-W bylineПереносить строки, убирать escape-последовательности
-qQuiet: показывать только совпадения, без метаинформации
-tДобавить timestamp к каждому пакету
-d eth0Слушать на конкретном интерфейсе
-n 1Остановиться после первого совпадения
-c NОграничить вывод N символами на строку
-xПоказать hexdump вместо ASCII

Практический пример с timestamp:

ngrep -i -t 'POST' port 8080

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

Ngrep принимает стандартные BPF-фильтры tcpdump. Основные варианты:

# Конкретный порт
ngrep 'GET' port 80

# Диапазон портов
ngrep 'error' portrange 8000-9000

# По хосту
ngrep 'token' host 10.0.1.50

# Комбинированный фильтр
ngrep -i 'auth' host 10.0.1.50 and port 443

# Исходящий трафик
ngrep 'response' dst port 8080
Примечание

BPF-фильтры ngrep парсит так же, как tcpdump. Синтаксис port, host, and, or работает идентично.

HTTP-запросы в Docker-контейнерах

Частая задача — отследить HTTP-трафик между контейнерами. Есть два подхода.

Первый: запустить ngrep внутри контейнера

Подходит, если контейнер на базе Alpine или Debian и есть доступ:

docker exec -it <container_id> sh -c "apt-get update && apt-get install -y ngrep"
docker exec -it <container_id> ngrep -i 'Content-Type' port 80

Второй: слушать на docker0

Если контейнеры общаются через bridge-сеть хоста:

# Найти интерфейс docker-сети
ip addr show docker0

# Слушать на нём
ngrep -W byline 'HTTP' host 172.17.0.2 and port 80 -d docker0

Проверить IP контейнера:

docker inspect -f '{{.NetworkSettings.IPAddress}}' <container_name>

Ограничения и альтернативы

Ngrep работает только с plaintext-трафиком. Он не умеет расшифровывать TLS/HTTPS — увидите только бинарный мусор вместо содержимого.

Другие ограничения:

  • Не понимает HTTP/2 и HTTP/3 — эти протоколы бинарные
  • Нет встроенного парсинга JSON или XML, только текстовый поиск
  • Производительность ниже, чем у tcpdump, при высокой нагрузке

Альтернативы для разных случаев:

ЗадачаИнструмент
Быстрый дамп pcaptcpdump -i eth0 -A port 80
Детальный анализ с парсингомtshark -Y http -i eth0
Мониторинг HTTPS (нужен ключ)Wireshark с расшифровкой
Трассировка gRPCgrpcurl или wireshark с Protobuf

Для большинства отладочных задач связка ngrep плюс tcpdump закрывает потребности. Если нужно разобрать конкретный протокол — tshark с фильтрами даст больше контроля, но потребует изучения синтаксиса Wireshark.