nf_conntrack: table full, dropping packet — Решение переполнения таблицы соединений
Архитектура ошибки и симптомы сбоя
Сообщение «nf_conntrack: table full, dropping packet» генерируется подсистемой отслеживания сетевых соединений ядра Linux (Netfilter Connection Tracking). При прохождении каждого пакета через NAT или фаервол (iptables/nftables) ядро выделяет запись в хеш-таблице conntrack. Когда суммарное число активных сессий достигает лимита, установленного параметром nf_conntrack_max, ядро сбрасывает (дропает) все новые входящие и исходящие пакеты, приводя к полной потере доступности сервера по сети.
Диагностическая таблица параметров сбоя
| Параметр | Значение | Инженерный смысл сбоя |
|---|---|---|
| nf_conntrack_max | Integer (Лимит таблицы) | Максимальное число одновременно отслеживаемых сессий в ОЗУ. |
| nf_conntrack_count | Integer (Текущее число) | Фактическое количество сессий в памяти на данный момент. |
| Drop Impact | Network Blackhole | 100% потеря новых TCP SYN пакетов и DNS/UDP запросов. |
Пошаговое дерево решений и сценарии траблшутинга
Сценарий 1: Проверка текущей заполненности таблицы conntrack
# Просмотр текущего и максимального лимита сессий:
cat /proc/sys/net/netfilter/nf_conntrack_count
cat /proc/sys/net/netfilter/nf_conntrack_max
# Анализ ТОП источников сессий (поиск DDoS или сканирования):
sudo conntrack -L 2>/dev/null | awk '{print $4}' | cut -d '=' -f2 | sort | uniq -c | sort -nr | head -n 10Сценарий 2: Экстренное увеличение размера таблицы conntrack и хэш-бакетов
Увеличьте лимит conntrack пропорционально объему оперативной памяти (1 миллион сессий занимает около 300MB RAM):
# Увеличение лимита conntrack до 1 048 576 соединений:
sudo sysctl -w net.netfilter.nf_conntrack_max=1048576
# Увеличение хеш-таблицы (buckets = max / 4):
echo 262144 | sudo tee /sys/module/nf_conntrack/parameters/hashsizeСценарий 3: Агрессивное сокращение таймаутов зависших соединений
# Оптимизация таймаутов в /etc/sysctl.d/99-conntrack.conf:
cat <<EOF | sudo tee /etc/sysctl.d/99-conntrack.conf
net.netfilter.nf_conntrack_max = 1048576
net.netfilter.nf_conntrack_tcp_timeout_established = 600
net.netfilter.nf_conntrack_tcp_timeout_time_wait = 10
net.netfilter.nf_conntrack_tcp_timeout_close_wait = 10
net.netfilter.nf_conntrack_tcp_timeout_syn_recv = 10
net.netfilter.nf_conntrack_udp_timeout = 10
EOF
sudo sysctl -p /etc/sysctl.d/99-conntrack.confITSTM проводит аудит сетевого стека Linux, тюнинг Netfilter/eBPF (XDP) и защиту высоконагруженных инфраструктур от атак любого типа.
Частые вопросы (FAQ)
Как отключить conntrack для определенных высоконагруженных сервисов?
Используйте правило raw таблицы iptables: iptables -t raw -A PREROUTING -p tcp --dport 80 -j NOTRACK (или target NOTRACK в nftables). Пакеты для этого порта перестанут отслеживаться и не будут забивать таблицу.
Сколько оперативной памяти потребляет таблица conntrack?
Каждая запись conntrack занимает около 320 байт в невыгружаемой памяти ядра (Slab Cache). Таблица на 1 000 000 соединений потребует около 320 МБ ОЗУ.
Почему значение hashsize нужно менять отдельно от nf_conntrack_max?
nf_conntrack_max задает максимальное число записей, а hashsize — количество корзин хеш-таблицы. Если не увеличить hashsize, длина цепочек коллизий возрастет, что приведет к росту задержек CPU при поиске пакетов.
Как установить утилиту conntrack для просмотра соединений?
Установите пакет conntrack-tools: sudo apt-get install conntrack (Debian/Ubuntu) или sudo dnf install conntrack-tools (RHEL/CentOS).