Отбрасывание пакетов файрволом или conntrack Stateful firewall / conntrack drops
ID причины rt-stateful-fw · Основной ответственный Команда инфраструктуры · Сетевая инфраструктура · Совместно Команда инфраструктуры · Серверная инфраструктура, Команда разработки · Разработка сервера, Команда разработки · Разработка клиента
Файрвол или conntrack в Linux (функция, которая записывает проходящие соединения в таблицу) выбрасывает пакеты, если таблица заполнена или состояние соединения кажется ему неверным.
Почему Таблица отслеживания соединений заполнена (table full), или пакеты туда и обратно идут разными путями, и через файрвол проходит только одно направление (асимметричный маршрут) → Следствие Файрвол считает, что пакет относится к «неизвестному соединению» или несёт «номер последовательности вне окна», и отбрасывает его → На экране Когда таблица заполнена, новые подключения не проходят, а при расхождении маршрутов у игроков на этом маршруте после серии повторных передач дисконнект
При наплыве игроков, Сразу после входа или техработ, Изредка, случайно
Ответственные
Основной ответственный Команда инфраструктуры · Сетевая инфраструктура · Совместно Команда инфраструктуры · Серверная инфраструктура, Команда разработки · Разработка сервера, Команда разработки · Разработка клиента
Команда разработки: задачи
Сервер: на случай заполнения таблицы сдерживать наплыв подключений очередью на вход, переиспользовать соединения вместо повторяющихся коротких (включая вызовы между серверами), первым закрывать соединения без хартбитов. Клиент: если подключение не удалось или оборвалось, увеличивать интервал между попытками и добавлять случайный разброс (чтобы при заполненной таблице игроки не ломились обратно все разом).
Команда инфраструктуры: задачи
Сеть: увеличить таблицу отслеживания соединений на файрволе, исключить игровые порты из отслеживания соединений, настроить маршрутизацию так, чтобы трафик в обе стороны шёл через один и тот же файрвол, проверить настройки проверки окна TCP на файрволе. Серверы и ОС: увеличить таблицу в Linux (nf_conntrack_max), исключить игровые порты из отслеживания соединений (NOTRACK), проверить настройку проверки окна TCP (nf_conntrack_tcp_be_liberal), в AWS проверить ещё и conntrack_allowance_exceeded.
Цифры для ориентира
Лимит conntrack в Linux по умолчанию (nf_conntrack_max) в зависимости от объёма памяти составляет от десятков до сотен тысяч записей. Когда текущее число (nf_conntrack_count) доходит до лимита, в логе появляется «nf_conntrack: table full, dropping packet».
На графике
Упор в лимит (плато) · число записей conntrack (nf_conntrack_count), число неудачных новых подключений
Где смотреть
На серверах Linux посмотреть nf_conntrack_count и nf_conntrack_max, «nf_conntrack: table full, dropping packet» в dmesg, drop и invalid в /proc/net/stat/nf_conntrack (по строке на ядро, шестнадцатеричные значения). На файрволе посмотреть заполнение таблицы сессий и логи дропов, в AWS conntrack_allowance_exceeded в ethtool -S
Подтверждает
Число записей выходит на плато у лимита, и одновременно растут логи table full и drop или conntrack_allowance_exceeded. При асимметричном маршруте до лимита далеко, но invalid и логи дропов файрвола растут на соединениях определённого маршрута
Опровергает
Если до лимита далеко, а invalid и логи дропов не меняются, причина другая. Если в таблице есть место, но CPU или пакеты в секунду на файрволе упираются в потолок, это «Перегрузка промежуточного оборудования (файрвол, IPS, защита от DDoS)»
Чем проверить
Инструменты инфраструктуры (игровой код не нужен)
Источники
Netfilter Conntrack Sysfs variablesLinux kernel nf_conntrack_max по умолчанию равен числу хеш-корзин (память÷16384, от 1 024 до 262 144), текущее число в nf_conntrack_count, nf_conntrack_tcp_be_liberal помечает как INVALID только RST вне окна
net/netfilter/nf_conntrack_core.cLinux kernel Когда таблица заполнена, пишется лог «nf_conntrack: table full, dropping packet» и пакет отбрасывается (растёт статистика drop), а пакеты, не соответствующие состоянию соединения, увеличивают статистику invalid
Amazon EC2 security group connection trackingAWS При превышении лимита отслеживаемых соединений на инстанс пакеты отбрасываются, это видно по conntrack_allowance_exceeded, рекомендация избегать асимметричных маршрутов
net/netfilter/nf_conntrack_standalone.cLinux kernel /proc/net/stat/nf_conntrack: по строке на ядро, шестнадцатеричные значения, столбцы entries, invalid, insert_failed, drop, early_drop и др.