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

Индекс LLMS: [llms.txt](/llms.txt)

---

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

## Установка

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

```bash
# Debian/Ubuntu
apt install ngrep

# RHEL/CentOS/Alma
yum install ngrep

# macOS
brew install ngrep
```

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

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

```bash
ngrep [options] [pattern] [BPF filters]
```

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

```bash
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-последовательности |
| `-q` | Quiet: показывать только совпадения, без метаинформации |
| `-t` | Добавить timestamp к каждому пакету |
| `-d eth0` | Слушать на конкретном интерфейсе |
| `-n 1` | Остановиться после первого совпадения |
| `-c N` | Ограничить вывод N символами на строку |
| `-x` | Показать hexdump вместо ASCII |

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

```bash
ngrep -i -t 'POST' port 8080
```

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

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

```bash
# Конкретный порт
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
```

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

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

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

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

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

```bash
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-сеть хоста:

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

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

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

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

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

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

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

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

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

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

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