nf_conntrack: table full, dropping packet
Ядро отслеживает состояние соединений для преобразования адресов и правил брандмауэра. При заполнении таблицы новые пакеты отбрасываются: службы видят обрывы и таймауты, хотя сами работают нормально.
Вероятные причины
По порядку: сверху то, что встречается чаще.
-
Таблица мала для нагрузки
Размер таблицы рассчитан на скромный трафик. Прокси, балансировщик или сервер с контейнерами исчерпывают её быстро.
-
Записи держатся слишком долго
Таймауты для состояний соединений по умолчанию велики. При коротких соединениях таблица заполняется устаревшими записями.
-
Отслеживание соединений включено там, где не нужно
Для машины без преобразования адресов и без правил состояния отслеживание можно отключить для части трафика — это снимает предел полностью.
Диагностика
Команды идут в том порядке, в котором их стоит выполнять: каждая следующая проверяет то, что осталось после предыдущей.
Текущее число записей и предел.
cat /proc/sys/net/netfilter/nf_conntrack_count /proc/sys/net/netfilter/nf_conntrack_maxСообщения ядра о заполнении таблицы.
journalctl -k -b --no-pager | grep -i conntrack | tail -5Решение
Решение своё для каждой причины. Сначала определите, какая из них ваша, — иначе правки наложатся друг на друга.
- Почему происходит
- Размер таблицы рассчитан на скромный трафик. Прокси, балансировщик или сервер с контейнерами исчерпывают её быстро.
- Как проверить
-
Посмотрите размер таблицы и текущее использование.
sysctl net.netfilter.nf_conntrack_max cat /proc/sys/net/netfilter/nf_conntrack_count
- Как исправить
-
Поднимите размер таблицы и, при необходимости, размер хеша. Память под таблицу считается заранее: каждая запись занимает около трёхсот байт.
echo "net.netfilter.nf_conntrack_max = 262144" | sudo tee /etc/sysctl.d/99-conntrack.conf && sudo sysctl --system
- Почему происходит
- Таймауты для состояний соединений по умолчанию велики. При коротких соединениях таблица заполняется устаревшими записями.
- Как проверить
-
Посмотрите таймауты.
sysctl -a 2>/dev/null | grep nf_conntrack_tcp_timeout | head
- Как исправить
- Сократите таймауты для завершённых соединений. Менять их стоит осознанно: слишком малые значения ломают долгие соединения.
- Почему происходит
- Для машины без преобразования адресов и без правил состояния отслеживание можно отключить для части трафика — это снимает предел полностью.
- Как проверить
-
Посмотрите, нужны ли правила состояния.
sudo nft list ruleset 2>/dev/null | grep -ci "ct state"
- Как исправить
- Исключите из отслеживания трафик, которому оно не нужно, правилом notrack. Делать это стоит только понимая последствия для правил брандмауэра.
Пример вывода
Таблица отслеживания соединений заполнена. Пример показательный: он собран на тестовой машине специально для этой страницы, а не взят из чужого журнала.
kernel: nf_conntrack: nf_conntrack: table full, dropping packet
nginx[1120]: [error] upstream timed out (110: Connection timed out) while connecting to upstream
Связанные ошибки
- Connection timed out в журнале службы Соединение не устанавливается по таймауту: пакеты отбрасываются, узел недоступен, перегружен сервер на другой стороне.
- Too many open files в журнале службы Служба исчерпала лимит файловых дескрипторов. Как правильно поднять LimitNOFILE и когда дело в утечке.
- nginx 504 Gateway Time-out: upstream timed out nginx не дождался ответа приложения. Разбор таймаутов proxy_read_timeout и fastcgi_read_timeout, поиск медленных мест.
- No buffer space available в журнале службы Ошибка 105: нет места в буферах ядра. Разбор для сети и таблиц соседей.
- TCP: out of memory -- consider tuning tcp_mem Ядру не хватает памяти под сетевые буферы: соединения рвутся, служба отвечает с перебоями.
- Elasticsearch: max virtual memory areas vm.max_map_count is too low Elasticsearch отказывается стартовать из-за заниженного vm.max_map_count. Как поднять значение и закрепить его.
- VFS: file-max limit reached: в системе кончились описатели Общесистемный предел числа открытых файлов исчерпан: службы перестают принимать соединения и открывать файлы.
- kernel: TCP: request_sock … overflow Соединения теряются при наплыве: переполнена очередь ожидающих соединений. Как считать somaxconn и backlog.
Где встречается чаще всего
Источники
- Документация ядра: nf_conntrack
-
Воспроизведено на тестовой машине, systemd 255 (Ubuntu 24.04)
Воспроизведено нагрузкой на прокси при заниженном размере таблицы.