Траблшутинг трафика Docker с помощью nsenter и tcpdump: сетевой анализ
- Сетевые сбои, обрывы соединений или задержки внутри минималистичных контейнеров (scratch/alpine), где нет
tcpdump,curlилиnetstat. - Подозрение на потерю пакетов (Packet Drop), сбросы RST или сбои TLS Handshake между микросервисами.
- Необходимость захвата трафика в .pcap файл для анализа в Wireshark.
1. Определение целевого PID процесса контейнера на хосте
CONTAINER_NAME="my_api_service"
PID=$(docker inspect --format '{{.State.Pid}}' $CONTAINER_NAME)
echo "Container PID: $PID"2. Вход в сетевой неймспейс (Network Namespace) через nsenter
# Просмотр сетевых интерфейсов и сокетов внутри неймспейса контейнера
nsenter -t $PID -n ip addr
nsenter -t $PID -n ss -tulnp
nsenter -t $PID -n ip route3. Захват сетевого трафика утилитой tcpdump с хоста
# Прослушивание интерфейса eth0 внутри контейнера
nsenter -t $PID -n tcpdump -nnvv -i eth0 port 80 or port 443
# Запись трафика в файл pcap для Wireshark
nsenter -t $PID -n tcpdump -i any -w /tmp/container_traffic.pcap4. Альтернатива: Запуск диагностического контейнера с подключением к сети целевого
docker run -it --rm --net=container:$CONTAINER_NAME nicolaka/netshoot tcpdump -nn -i any Частые вопросы (FAQ)
Что такое утилита nsenter?
nsenter (Namespace Enter) — стандартная системная утилита Linux, позволяющая выполнять команды внутри выбранных пространств имен (IPC, UTS, Network, PID, Mount) любого запущенного процесса хоста.
Можно ли перехватывать трафик, если контейнер запущен в сети host?
В режиме --net=host контейнер разделяет сетевой стек с хостом, поэтому tcpdump запускается прямо на интерфейсах хоста (eth0, bond0) без необходимости использования nsenter.