Практика Руководство

Защита игрового сервера от DDoS: iptables, nftables и фильтрация UDP

Защита игрового сервера от атак типа UDP flood и SYN flood с помощью nftables: настройка rate limiting, connlimit и отбрасывание некорректных пакетов.

Защита игрового сервера от DDoS: iptables, nftables и фильтрация UDP

Многопользовательские игровые серверы чаще любых других интернет-сервисов подвергаются распределённым сетевым атакам (DDoS). Подавляющее большинство атак на игровые движки строится на базе протокола UDP: злоумышленники генерируют миллионы поддельных пакетов или используют сторонние уязвимые сервисы для многократного усиления трафика (UDP amplification).

Даже небольшой поток мусорного UDP-трафика объёмом в 10–20 Мбит/с способен полностью парализовать однопоточный цикл симуляции игрового движка, если операционная система вынуждена передавать каждый пакет в сокет приложения. Настоящее руководство разбирает правила фильтрации на уровне ядра Linux с помощью nftables и iptables, позволяющие отсекать флуд до того, как он создаст задержки в игре.

Архитектура атаки: почему UDP уязвим к флуду#

Протокол UDP не требует установки предварительного соединения (handshake), что позволяет атакующим подделывать исходный IP-адрес отправителя (IP spoofing). В результате ядро Linux тратит ресурсы процессора в прерываниях ksoftirqd, обрабатывая входящие пакеты и передавая их в сокет игрового сервера.

Когда очередь сетевого сокета переполняется, легитимные пакеты синхронизации игроков начинают отбрасываться. В игре это проявляется как резкие скачки пинга, телепортация персонажей и массовые отключения по таймауту (Connection timed out).

Для проверки текущей нагрузки на сетевые очереди сокетов используйте команду ss:

bash
ss -u -a -n -p

Если колонка Recv-Q содержит постоянные ненулевые значения, значит, процесс сервера не успевает вычитывать входящие данные из сетевого буфера ядра.

Базовая фильтрация повреждённых пакетов через nftables#

Современным стандартом межсетевого экранирования в Linux является подсистема nftables. Она работает быстрее устаревшего iptables за счёт использования байт-кода и меньшего числа переключений контекста.

Создайте базовую таблицу правил для защиты игрового порта (на примере стандартного порта 27015):

bash
cat << 'EOF' | sudo tee /etc/nftables.conf
table inet filter {
    chain input {
        type filter hook input priority filter; policy accept;

        # Allow established connections
        ct state established,related accept

        # Drop invalid connection states
        ct state invalid drop

        # Drop fragmented UDP packets
        ip frag-off & 0x1fff != 0 drop

        # Allow loopback traffic
        iif "lo" accept

        # Rate limit game traffic per IP
        udp dport 27015 meter flood { ip saddr limit rate over 60/second burst 120 packets } drop
    }
}
EOF

Примените конфигурацию правил:

bash
sudo nft -f /etc/nftables.conf
sudo nft list ruleset

Правило ip frag-off отсекает фрагментированные UDP-пакеты, которые часто используются для атак обхода межсетевых экранов, а директива meter flood ограничивает частоту пакетов с одного IP-адреса, пропуская кратковременные всплески до 120 пакетов для легитимных игроков.

Защита от SYN-флуда на портах RCON и Web-панелей#

Если на сервере открыты TCP-порты для удалённого управления (RCON) или веб-мониторинга, злоумышленники могут переполнить очередь незавершённых TCP-соединений атакой SYN flood.

Включите механизм SYN cookies на уровне ядра операционной системы:

bash
sudo sysctl -w net.ipv4.tcp_syncookies=1
sudo sysctl -w net.ipv4.tcp_max_syn_backlog=4096

Для закрепления настроек после перезагрузки добавьте их в конфигурационный файл:

bash
cat << 'EOF' | sudo tee /etc/sysctl.d/99-game-security.conf
net.ipv4.tcp_syncookies = 1
net.ipv4.tcp_max_syn_backlog = 4096
net.core.somaxconn = 4096
EOF
sudo sysctl --system

Увеличение сетевых буферов ядра Linux#

По умолчанию операционная система Linux выделяет относительно скромные буферы под сетевые сокеты UDP. При кратковременных скачках трафика ядро начинает отбрасывать пакеты ещё до того, как они дойдут до игрового цикла.

Увеличьте максимальный и стандартный размер буфера приёма сетевых пакетов:

bash
sudo sysctl -w net.core.rmem_max=16777216
sudo sysctl -w net.core.rmem_default=2097152

Проверьте статистику сброшенных пакетов ядра:

bash
netstat -s -u | grep -E "(buffer errors|packet receive errors)"

Если счетчик ошибок перестал расти, сетевой стек стабильно справляется с текущим профилем нагрузки.

Для серверов с высокой публичной активностью ручной настройки пакетного фильтра на одиночном VPS может быть недостаточно при мощных атаках с насыщением входящего канала. В таких ситуациях профессиональная инфраструктура в рамках панели управления серверами позволяет делегировать фильтрацию распределённым сетям очистки трафика без потери управляемости.

Источники#