Защита сервера Left 4 Dead 2 от DDoS-атак

Опубликовано 22 мин. чтения

Какие порты действительно нужны серверу Left 4 Dead 2, как притормозить A2S-запросы на 27015/UDP, не выбросив собственных игроков, что даёт система лобби как фильтр доступа и с какого объёма атаки помогает только фильтрация в сети перед сервером.

Сервер Left 4 Dead 2 редко падает в удобный момент. Он падает на последнем отрезке кампании, во втором проходе матча Versus или ровно тогда, когда забаненного игрока в третий раз не пустили на сервер. Тому, кого обстреливают прямо сейчас, нужны не рассуждения о принципах сетевой техники, а порядок действий. В этой статье сначала разобрано, как защитить сервер Left 4 Dead 2 от DDoS-атак, пока это ещё получается штатными средствами, затем то, где эти возможности физически заканчиваются, и в конце то, что должно происходить в сети перед сервером.

Все указания относятся к выделенному серверу (srcds), установленному через SteamCMD с App-ID 222860, под Debian 12, Debian 13, Ubuntu 22.04 LTS или Ubuntu 24.04 LTS. Команды написаны для root, если вы работаете под обычным пользователем, добавляйте перед каждой командой sudo. Один момент наперёд, потому что он задаёт порядок действий: во время идущей атаки ничего не меняйте вслепую и не перезапускайте сервер, пока не сохранили измерения. После атаки их уже не будет.

Почему серверы Left 4 Dead 2 — выгодная цель для DDoS-атак

Отличие от шутера на 64 места кроется в размере партии. В кооперативной кампании четыре места для выживших, в матче Versus восемь мест на обе стороны вместе. Поэтому сбой никогда не бьёт по отдельным игрокам, он всегда бьёт по всей партии: тот, кто обрывает кампанию на третьем отрезке из пяти, заканчивает вечер для всех её участников. Именно это и делает атаку привлекательной для заказчика, ведь ему она не стоит ни навыков, ни заметных денег, а на другой стороне уничтожает час игрового времени.

К этому добавляется само устройство игры. Left 4 Dead 2 работает на Source-движке, а Source-сервер можно публично найти по IP-адресу и порту. Это условие работы, а не недосмотр: сервер, который не отвечает на запрос, не попадёт ни в один список и не будет найден ни одним лобби. Значит, вопрос никогда не стоит так, знает ли атакующий ваш адрес. Вопрос только в том, что произойдёт, когда он по нему ударит. Игровой трафик идёт по UDP, а в UDP нет установления соединения, которого можно было бы потребовать, к тому же адрес отправителя легко подделать. Что при этом происходит технически, объясняет статья Что такое DDoS-атака?.

Третья особенность свойственна именно Left 4 Dead 2 и не имеет аналога в Counter-Strike, Garry's Mod или Team Fortress 2: большинство игроков приходит не через браузер серверов, а через систему лобби. Лобби, в котором может быть до четырёх игроков, направляется через матчмейкинг Steam на выделенный сервер, а тот получает за это резервирование. Этот механизм одновременно и ваш самый действенный фильтр доступа, и дополнительная поверхность атаки. Про то и другое подробно ниже.

Порты, о которых на самом деле идёт речь

Сервер Left 4 Dead 2 занимает ровно один UDP-порт для всего, из чего состоит игра. По умолчанию это 27015, номер задаётся через -port или +hostport в строке запуска:

./srcds_run -game left4dead2 -console -nohltv \
  -port 27015 \
  +ip 203.0.113.10 \
  +maxplayers 4 \
  +exec server.cfg \
  +map c1m1_hotel
Порт и протокол Для чего Должен ли быть открыт наружу
27015/UDP Игровой трафик и A2S-запрос на одном и том же порту Да, без этого порта игры нет
27015/TCP RCON, если задан rcon_password Нет, открывать только для собственного адреса
27005/UDP Клиентский порт, открывается со стороны игрока Нет, разрешающее правило на сервере не требуется
27020/UDP SourceTV, только с -hltv или +tv_enable 1 Только если вы действительно ведёте трансляцию
27016, 27017 и далее Дополнительные экземпляры на том же хосте По одному на экземпляр, а не диапазоном
80/TCP и 443/TCP Быстрая загрузка (sv_downloadurl), если на том же хосте Только если веб-сервер работает там
22/TCP SSH-доступ Нет, ограничить собственным адресом

Первая строка этой таблицы — суть проблемы. Игровой трафик и серверный запрос делят 27015/UDP, отдельного query-порта в Left 4 Dead 2 нет. Тот, кто закроет этот порт целиком или грубо ограничит на нём интенсивность, тем же движением выбросит собственных игроков и доведёт атаку до конца за атакующего.

A2S-запрос — это пакет в несколько десятков байт, а ответ на него в разы больше. В UDP адрес отправителя легко подделать, и тогда ваш сервер становится не только жертвой, но и усилителем: атакующий опрашивает чужие игровые серверы с адресом своей цели и направляет их ответы туда. В декабре 2020 года Valve добавила к A2S_INFO предварительный вызов (S2C_CHALLENGE), который спрашивающий должен вернуть, прежде чем получит ответ. Это смягчает отражение, но не прекращает его, потому что старые программы опроса обслуживаются по-прежнему.

Что вы можете сделать сами, прежде чем тратить деньги

Следующий раздел не стоит ничего и полезен независимо от того, где стоит ваш сервер. От объёмной атаки он не избавит, но небольшие и средние атаки после него уходят в пустоту, а заодно он устраняет те сбои, о которых ошибочно сообщают как о DDoS-атаке.

1. Инвентаризация: что на самом деле слушает сеть

Прежде чем писать правило, выясните, какие службы доступны снаружи. На сервере Left 4 Dead 2, который развивался постепенно, их почти всегда больше, чем вы ожидаете, ведь рядом с srcds работают ещё веб-сервер для кампаний, база данных статистики, а иногда и второй сервер для Versus:

ss -lntup

Всё, что привязано к 127.0.0.1 или ::1, разрешающего правила не требует. Всё, что слушает на 0.0.0.0 или [::], доступно из интернета. Взгляд атакующего даёт скан портов снаружи, и по опыту он расходится с собственными ожиданиями:

nmap -Pn -sU -sT -p 27000-27050,80,443,3306 ВАШ.IP.АДРЕС.СЕРВЕРА

Если основа поставлена только что или вы хотите её проверить, путь от SteamCMD до работающего srcds описывает статья Установка игрового сервера через SteamCMD.

2. Оставьте открытыми только те порты, которые действительно нужны srcds

Один UDP-порт наружу, один TCP-порт для собственного адреса, больше ничего. RCON в открытом интернете не место, ведь у кого есть RCON, тот меняет карту, банит всех игроков и останавливает сервер:

ufw allow 27015/udp comment "L4D2 игровой порт и A2S"
ufw allow from 203.0.113.10 to any port 27015 proto tcp comment "RCON"
ufw allow from 203.0.113.10 to any port 22 proto tcp comment "SSH"
ufw default deny incoming
ufw default allow outgoing
ufw --force enable

Замените 203.0.113.10 на свой собственный адрес. Если он регулярно меняется, идите через проброс порта по SSH, а не через постоянно открытое правило. Порядок команд при включении файрвола решает, закроете ли вы доступ самому себе; он вместе с запасным путём описан в статье Настройка файрвола UFW без потери доступа. Если это всё же случилось: у KVM root-серверов и выделенных серверов KernelHost нет ни IPMI, ни iDRAC, и до сервера вы добираетесь через VNC-консоль в личном кабинете, а она не зависит от сетевого стека гостевой системы.

3. Притормозите A2S-запросы, не выпав из поиска лобби

Здесь кроется самая дорогая ошибка во всей этой теме. Игровой трафик и серверный запрос занимают один и тот же порт, поэтому тормоз должен различать два класса пакетов, а не порты.

После изменений декабря 2020 года подсистема игровых серверов Steam приносит для этого собственное ограничение, которое задаётся перед запуском переменной окружения. STEAM_GAMESERVER_RATE_LIMIT_200MS=N отбрасывает пакеты без установленного соединения (A2S_INFO, A2S_RULES, A2S_PLAYERS) от одного адреса отправителя, как только в окне в 200 миллисекунд их приходит больше N. Valve называет рабочим диапазон от 25 до 75, по умолчанию ограничение выключено:

export STEAM_GAMESERVER_RATE_LIMIT_200MS=50
./srcds_run -game left4dead2 -console -port 27015 +exec server.cfg +map c1m1_hotel

В systemd-юните то же значение прописывают как Environment=STEAM_GAMESERVER_RATE_LIMIT_200MS=50 в раздел [Service], иначе после следующей перезагрузки его не будет. Этот тормоз срабатывает только тогда, когда ваша сборка сервера несёт актуальную подсистему Steamworks, и бережёт он процессорное время вашего сервера, а не ваш канал: пакеты уже дошли.

Уровнем ниже тот же трафик отделяется в ядре. Все пакеты Source-движка без установленного соединения, то есть серверные запросы и подключение к серверу, начинаются с четырёх выставленных байт (0xffffffff), а у трафика уже подключённых игроков такого заголовка нет. Именно на этот признак и вешается через nftables ограничение интенсивности по адресу отправителя:

table inet l4d2 {
    chain input {
        type filter hook input priority -10; policy accept;
        udp dport 27015 @th,64,32 0xffffffff \
            meter a2sflood { ip saddr limit rate over 10/second burst 20 packets } drop
    }
}

Файл загружается командой nft -f. Приоритет -10 обеспечивает срабатывание правила перед цепочкой фильтрации UFW, а @th,64,32 читает первые четыре байта за UDP-заголовком. Начинайте с запасом и затягивайте порог только тогда, когда убедились, что легитимные запросы проходят: от этого зависит ваша собственная запись в списке серверов.

4. Используйте систему лобби как фильтр доступа

Это рычаг, который есть только у Left 4 Dead 2 и у его предшественника. Сервер сам решает, принимает ли он вообще подключения в обход матчмейкинга. Определяют это четыре директивы в server.cfg:

sv_allow_lobby_connect_only 1
sv_search_key "ваш-собственный-ключ"
sv_steamgroup "103582791400000000"
sv_steamgroup_exclusive 2
  • sv_allow_lobby_connect_only 1 пропускает исключительно тех, кто заходит из лобби матчмейкинга. Команда connect 203.0.113.10:27015 в консоли разработчика и приглашение через Steam отклоняются. Значение 0 разрешает и то, и другое.
  • sv_search_key — это произвольно выбираемый ключ поиска. Найти сервер через матчмейкинг может только то лобби, в котором задан тот же самый ключ. Без этого ключа в публичном поиске он не появляется.
  • sv_steamgroup привязывает сервер к группе Steam и показывает его среди серверов этой группы.
  • sv_steamgroup_exclusive знает три ступени: 0 пропускает любого, 1 ведёт себя как 0, но требует захода через лобби, а 2 пропускает только членов группы и прямое подключение по IP-адресу.

Для постоянного сообщества сочетание ключа поиска и sv_steamgroup_exclusive 2 — самый действенный бесплатный фильтр доступа, который знает эта игра. Публичному серверу такой вариант не подходит, ведь сервер, которого никто не находит, пуст ровно так же, как выключенный.

А теперь та часть, которую рекламные тексты охотно опускают: эти директивы защищают вашу игровую логику, а не ваш канал. Атакующий, который заливает 27015/UDP, заходить на сервер вообще не собирается. Его пакеты будут отклонены, но прийти они всё равно успели, израсходовали полосу и стоили одного прохода через сетевой стек. Против флуда подключений с одноразовых аккаунтов sv_allow_lobby_connect_only 1 работает прекрасно, против booter не работает вовсе.

5. Резервирование лобби и когда sv_force_unreserved лучше

Резервирование лобби — это ограниченное по времени занятие вашего сервера лобби матчмейкинга. Пока оно действует, для других лобби сервер считается занятым, а истекает оно само лишь через некоторое время. Для сервера на четыре места это дефицитный ресурс: в отличие от шутера на 32 или 64 места, здесь достаточно совсем немногого, чтобы заблокировать партию.

Тот, кто не держит свой сервер в матчмейкинге, убирает эту поверхность целиком:

sv_force_unreserved 1
sv_allow_lobby_connect_only 0

sv_force_unreserved 1 приводит к тому, что сервер перестаёт отвечать на запросы резервирования из системы лобби и отклоняет заходы с признаком резервирования. Эта же настройка понадобится вам всё равно, если вы через L4DToolZ держите больше четырёх кооперативных мест, иначе лобби получит резервирование, как только заняты первые четыре места, а остальные места останутся недостижимыми. Обратная сторона однозначна: ваши игроки будут попадать на сервер только через браузер серверов или через connect.

Выберите один из двух режимов работы осознанно. Смесь из наполовину открытого матчмейкинга и наполовину открытого прямого захода — это тот вариант, который соединяет оба недостатка.

6. Защитите RCON

Открытый RCON-порт со слабым паролем — это не проблема DDoS, а захват сервера. Никогда не оставляйте rcon_password пустым и не придумывайте его на ходу, достаточно значения из openssl rand -base64 32. У игр на Source есть вдобавок собственный тормоз против попыток подбора:

rcon_password "ЗДЕСЬ_СЛУЧАЙНОЕ_ЗНАЧЕНИЕ"
sv_rcon_minfailures 3
sv_rcon_maxfailures 5
sv_rcon_minfailuretime 30
sv_rcon_banpenalty 1440

После трёх неудачных попыток за 30 секунд адрес блокируется на сутки; find sv_rcon в серверной консоли покажет, какие из этих переменных знает ваша сборка. Ограничение на файрволе из шага 2 всё равно остаётся действеннее, потому что оно не пропускает попытку до самого приложения. Если RCON вам не нужен, оставьте пароль пустым: тогда TCP-часть порта 27015 не слушает.

7. Вынесите пользовательские кампании наружу, а не раздавайте их через игровой порт

Пользовательские кампании — это причина, по которой в Left 4 Dead 2 играют и через пятнадцать лет, и одновременно источник нагрузки, которого в таком виде нет у Counter-Strike. Кампания — это VPK-пакет с картами, моделями, текстурами и звуками, то есть во много раз больше того, что весит одна соревновательная карта.

Удобный для игроков путь — это Steam Workshop: пакет тогда приходит из Steam, а не с вашего сервера, и полосы пропускания вам не стоит. Если вы раздаёте отдельные файлы сами, раздача должна идти через веб-сервер, а не через игровой порт:

sv_allowdownload 1
sv_allowupload 0
sv_downloadurl "https://cdn.example.org/l4d2/"
sv_consistency 1

Файлы для sv_downloadurl кладут на веб-сервер в виде архива bzip2, то есть из моя-карта.bsp получается моя-карта.bsp.bz2. Без sv_downloadurl srcds отправляет файлы сам через игровое соединение, и тогда действует правило: каждая попытка подключения нового игрока стоит вам полной загрузки, как и каждый обрыв посреди загрузки. Это на редкость дешёвый способ забить канал, и ни в одной статистике он не выглядит как атака.

Три момента к этому, которые на практике бьют больно. sv_allowupload 0 нужно задать, ведь загрузки от клиента на сервер вам не нужны. Если веб-сервер для sv_downloadurl стоит на том же хосте, что и игра, загрузка и игровой трафик делят один канал и один IP-адрес, и атака на 443/TCP бьёт тогда и по вашей идущей партии. А sv_consistency 1 защищает не от атак, а от расходящихся клиентских файлов; отключать эту переменную стоит только тогда, когда кампания иначе доказуемо не запускается.

8. SourceMod, Metamod и расширения

Заметная часть сбоев, о которых сообщают как о DDoS, никаким DDoS не является. Это падения и всплески нагрузки, которые вызывает один-единственный клиент, потому что в бинарнике сервера или в расширении открыта уязвимость. Полоса пропускания тут не поможет, помогает уход за сервером:

  • Держите Metamod:Source и SourceMod в соответствии с версией движка. Left 4 Dead 2 по-прежнему получает обновления, а неподходящее расширение остаётся самой частой причиной падений сразу после обновления.
  • Left4DHooks вместо собственных вмешательств. Типичные для L4D2 события собраны в этом расширении. Собственные вмешательства в те же функции — самый быстрый путь к бинарнику сервера, который вылетает на определённых последовательностях пакетов.
  • Ставьте L4DToolZ только осознанно. Это расширение поднимает жёстко зашитые пределы числа мест. Каждое дополнительное место — это дополнительный игрок, который создаёт нагрузку на процессор, а в связке с системой лобби расширению нужен sv_force_unreserved 1.
  • Меньше расширений. Каждый плагин — это код в том же процессе. Расширения с собственными веб-службами открывают дополнительные порты и часто публикуют как раз тот адрес, который вы хотите защитить.

Баны нужно записывать на диск, иначе после перезагрузки их не останется. У игр на Source для этого есть banid вместе с writeid, а также addip вместе с writeip, и созданные файлы считываются обратно через exec banned_user.cfg и exec banned_ip.cfg.

9. Разгрузите отслеживание соединений и буфер приёма

Этот пункт часто упускают, а он объясняет сбои, которые выглядят как объёмная атака, но ею не являются. Для UDP-трафика ядро заводит записи в таблице отслеживания соединений (conntrack), и при подделанных адресах отправителя каждый адрес означает новую запись. Когда таблица заполнена, ядро отбрасывает пакеты без разбора: вместе с атакой вылетают и ваши игроки. Текущее значение и верхний предел показывает один взгляд:

sysctl net.netfilter.nf_conntrack_count net.netfilter.nf_conntrack_max

Действеннее всего вообще не отслеживать игровой трафик, ведь свои сессии движок ведёт сам:

table inet raw {
    chain prerouting {
        type filter hook prerouting priority raw; policy accept;
        udp dport 27015 notrack
    }
    chain output {
        type filter hook output priority raw; policy accept;
        udp sport 27015 notrack
    }
}

В iptables этому соответствует iptables -t raw -A PREROUTING -p udp --dport 27015 -j NOTRACK и та же строка для OUTPUT с --sport. После этого порту нужно явное разрешающее правило, потому что без отслеживания перестаёт работать любое правило, которое проверяет уже установленное состояние. Если пакеты приходят быстрее, чем srcds успевает их забирать, дополнительно переполняется буфер приёма, и для игроков это выглядит как потеря пакетов на свободном канале:

net.core.rmem_max = 16777216
net.core.rmem_default = 1048576
net.core.netdev_max_backlog = 16384

Файл кладут в /etc/sysctl.d/ и применяют командой sysctl -p. Нужны ли эти значения вообще, подскажет само ядро: если UdpRcvbufErrors в выводе nstat -az растёт, они пригодятся. Если счётчик стоит на нуле, настройка ничего не изменит. Это запас прочности, а не защита.

10. Ведите измерения, чтобы во время атаки не гадать

Во время атаки главный вопрос звучит так: сколько приходит, на какой порт и что это, трафик запросов или игровой трафик. Хватает четырёх команд:

ip -s link show eth0
nstat -az | grep -i udp
sar -n DEV 1 10
tcpdump -ni eth0 -c 200 "udp port 27015 and udp[8:4] = 0xffffffff"

Первую команду выполните дважды с интервалом в десять секунд, тогда вы получите интенсивность вместо абсолютного значения. Последняя строка показывает исключительно пакеты без установленного соединения, то есть ровно тот класс, которым злоупотребляет поток запросов; если счётчик набирается за секунды, а подключённых почти нет, ответ у вас есть. Держите захват коротким, потому что под нагрузкой он и сам стоит процессорного времени. Как разобрать полученные значения, описано в статье Как определить DDoS-атаку на сервере.

Самый важный шаг, однако, тот, который почти никто не делает заранее: собрать базу для сравнения, пока всё работает нормально. Без нормального значения вы после инцидента не скажете, много ли это, 40 000 пакетов в секунду, или это просто пятничный вечер с полным сервером Versus.

Где эти меры заканчиваются

Теперь честная часть. Всё описанное выше начинает работать только тогда, когда пакеты дошли до вашей сетевой карты. Правило файрвола принимает решение о пакете, который уже прошёл по кабелю. Вы можете его отбросить, но не можете сделать неотправленным.

Давайте посчитаем. Типовой игровой сервер подключён на 1 Гбит/с, это 125 мегабайт в секунду. При минимально возможном размере пакета этот канал несёт около 1,49 миллиона пакетов в секунду, канал на 10 Гбит/с около 14,88 миллиона. Это физический потолок, и он не зависит ни от CPU, ни от ядра, ни от файрвола. Обычное серверное ядро в зависимости от процессора и сетевой карты обрабатывает несколько сотен тысяч пакетов в секунду, а дальше начинает отбрасывать. Значит, атака, которая не заполняет ваш канал даже на треть, всё равно способна положить сервер, потому что процессорное время уходит на само отбрасывание. Владельцы серверов описывают это словами «загрузка ведь была совсем не высокой, а всё равно всё пропало».

Против этого стоят реальные атаки. Два примера из эксплуатации в KernelHost, оба отфильтрованы в реальном времени: UDP-флуд по игровому серверу на 7777/UDP с более чем 112,2 Гбит/с и более чем 8,7 миллиона пакетов в секунду, а также многовекторная атака по голосовому серверу на 9987/UDP с более чем 473,4 Гбит/с и более чем 41,5 миллиона пакетов в секунду. Сопоставьте это со своим каналом: 473,4 Гбит/с — это примерно в 470 раз больше подключения на 1 Гбит/с и всё ещё примерно в 47 раз больше подключения на 10 Гбит/с.

Поэтому оба распространённых стоп-крана не устраивают. Null-routing (blackholing) убирает атакуемый IP-адрес из сети и заканчивает атаку, а вместе с ней и работу вашего сервера: для ваших игроков результат ничем не отличается от успешной атаки. Реактивное перенаправление трафика съедает на переключении ровно те минуты, в которые решается исход кампании. Работает только та фильтрация, которая идёт постоянно в сети перед сервером.

Что KernelHost этому противопоставляет

Постоянная защита, которая включена в каждый сервер

Защита от DDoS в KernelHost построена в два уровня и активна постоянно, вам не нужно ничего включать, заказывать или настраивать:

  • Уровень 1: 17 Тбит/с ёмкости митигации в глобальной scrubbing-сети. Объёмные атаки вычищаются близко к источнику, задолго до того как они дойдут до дата-центра.
  • Уровень 2: фильтрация Arbor в реальном времени на 3,2 Тбит/с во Франкфурте-на-Майне. Непосредственно перед сервером распознаются и отбрасываются схемы, характерные для конкретных протоколов, на уровнях Layer 3-7, пакет за пакетом.

Решают два свойства. Во-первых, фильтрация работает постоянно, поэтому нет времени переключения, в которое ваши игроки вылетают. Во-вторых, null-routing не применяется: атакуемый IP-адрес остаётся в сети, отбрасываются только вредоносные пакеты. Защита входит в каждый серверный тариф без доплаты, без отдельного пакета защиты и без настройки, и работает с момента развёртывания. Серверы стоят в maincubes Premium Datacenter во Франкфурте-на-Майне. Какие игры и протоколы покрыты, перечисляет статья Защита игровых серверов от DDoS в реальном времени.

Advanced DDoS Protection для проектов под постоянным обстрелом

Некоторые проекты атакуют не время от времени, а прицельно и неделями, с меняющимися схемами и всегда точно к условленному вечеру кампании. Для таких случаев есть Advanced DDoS Protection от 50,00 € в месяц, по модели PrePaid и без минимального срока. Разница не в большей ёмкости, а в контроле:

  • Выделенный защищённый IP-адрес. Ваш сервер переводится на этот адрес внутри нашей сети, перестраивать что-либо на своей стороне не нужно.
  • Самостоятельно управляемые правила защиты по портам и протоколам. В личном кабинете вы задаёте, какой порт фильтруется по какому профилю, то есть 27015/UDP иначе, чем веб-сервер, который раздаёт ваши кампании.
  • Изменения вступают в силу в реальном времени, без тикета и без ожидания. Подстраивать их можно прямо во время идущей атаки.
  • Профиль защиты под конкретную игру. Для Left 4 Dead 2 и остальных игр на Source, как и для более чем 40 других игр и протоколов, плюс свободные TCP- и UDP-профили для модифицированных серверов.

Здесь тоже действует модель PrePaid: ни минимального срока, ни срока расторжения, ни договора, ни платы за подключение. Когда волна атак пройдёт, вы просто не продлеваете услугу.

Сравнение двух уровней

Характеристика Включённая постоянная защита Advanced DDoS Protection
Цена входит в каждый серверный тариф без доплаты от 50,00 € в месяц, PrePaid без минимального срока
Активация работает с момента развёртывания, настраивать нечего заказать, получить защищённый IP-адрес, сервер переводится на него
Ёмкость фильтрации 17 Тбит/с глобального scrubbing плюс фильтрация Arbor в реальном времени на 3,2 Тбит/с во Франкфурте-на-Майне та же двухуровневая фильтрация плюс собственные правила
IP-адрес IP-адрес вашего сервера дополнительный выделенный защищённый IP-адрес
Изменение правил ведёт KernelHost, тонкая настройка через тикет самостоятельно в личном кабинете, действует в реальном времени
Игровые профили более 40 игр и протоколов, включая игры на Source профиль выбирается по портам, в том числе для модифицированных серверов
Null-routing во время атаки нет нет
Подходит для любого сервера, с первой же кампании проектов под постоянным прицельным обстрелом

Большинству проектов на Left 4 Dead 2 хватает включённой постоянной защиты вместе с аккуратной настройкой сервера. Advanced DDoS Protection — это ответ на ситуацию, когда кто-то воспринимает происходящее лично.

Частые ошибки и решения

Сервер пропал из поиска лобби, но продолжает работать: обычно 27015/UDP закрыли целиком или ограничили на нём интенсивность слишком жёстко, а поскольку игровой трафик и запрос делят один порт, грубое правило бьёт по обоим сразу. Работайте вместо этого со сравнением по пакетам без установленного соединения. Если порт доступен, а сервер всё равно невидим, проверьте sv_search_key, sv_steamgroup_exclusive, sv_lan 0 и sv_region 255, а также то, не запустился ли сервер по недосмотру с -nomaster.

В серверной консоли постоянно стоит «Invalid split packet length»: это не объёмная атака, а неверно собранный сетевой пакет, который шлют быстрой чередой. Трафик при этом остаётся крошечным, а сервер всё равно лагает. Сначала проверьте, выделяется ли вообще расход полосы, и приведите бинарник сервера и расширения в актуальное состояние. Полоса пропускания тут не поможет.

У всех игроков высокий пинг, а канал при этом не заполнен: это указывает на интенсивность пакетов, а не на объём. Посмотрите отброшенные пакеты в ip -s link show и счётчики UDP в nstat -az. Если в системном логе стоит nf_conntrack: table full, выведите игровой порт из отслеживания через notrack.

Правило файрвола написано верно и всё равно не работает: проверьте командой iptables -L INPUT -n -v, растут ли счётчики совпадений. Если они остаются на нуле, до правила дело не доходит, потому что оно стоит позади цепочек UFW или пропало после последней перезагрузки. Если они растут, а ничего не меняется, значит, канал перед сервером насыщен, и с этого места помогает только фильтрация в сети.

Сервер больше не принимает игроков, хотя места свободны: чаще всего зависло резервирование лобби. Либо вы последовательно держите сервер в матчмейкинге, либо задаёте sv_force_unreserved 1 и пускаете своих игроков через браузер серверов. При более чем четырёх кооперативных местах с L4DToolZ эта настройка обязательна в любом случае.

Новые игроки грузятся бесконечно, и канал при этом забит: значит, srcds раздаёт файлы кампаний сам через игровой порт. Задайте sv_downloadurl на веб-сервер и положите файлы туда в виде архива bzip2 или направьте своих игроков в Steam Workshop.

После смены IP-адреса атака затихает и через один-два дня возвращается: это обычное дело, ведь новый адрес ваш сервер публикует сам, как только снова зарегистрируется, а забытая DNS-запись или Discord-бот с показом статуса довершают остальное. Смена IP-адреса даёт несколько часов, но не решение.

На сервере выполняются чужие административные команды: это не DDoS-атака, а скомпрометированный доступ по RCON. Немедленно смените пароль и ограничьте TCP-часть порта 27015 собственным адресом.

Коротко о главном

  • Серверу Left 4 Dead 2 нужен ровно один открытый наружу порт: 27015/UDP. Игровой трафик и A2S-запрос делят его между собой, отдельного query-порта не существует.
  • 27015/TCP — это RCON, и открывать его следует исключительно для собственного адреса. Тому, кому RCON не нужен, стоит оставить rcon_password пустым.
  • Система лобби — самый действенный бесплатный фильтр доступа, который знает эта игра: sv_allow_lobby_connect_only 1, собственный sv_search_key и sv_steamgroup_exclusive 2 отсекают всё, что идёт мимо матчмейкинга. Она фильтрует заходы, а не пакеты.
  • Пользовательским кампаниям место в Steam Workshop или за sv_downloadurl, но никогда не на игровом порту. Иначе каждая оборванная попытка подключения оплачивается вашей полосой пропускания.
  • Ограничение интенсивности должно различать пакеты без установленного соединения (начинаются с 0xffffffff) и игровой трафик. Грубое правило на 27015/UDP выбрасывает ваших же игроков.
  • При пакетах размером 64 байта канал на 1 Гбит/с несёт около 1,49 миллиона пакетов в секунду. Сверх этого решает исключительно сеть перед сервером, а не настройка на самом сервере.
  • В KernelHost 17 Тбит/с глобального scrubbing и фильтрация Arbor в реальном времени на 3,2 Тбит/с во Франкфурте-на-Майне работают постоянно и без доплаты, без null-routing и без времени переключения.

Если ваш проект уже работает в KernelHost, фильтрация активна, и делать для этого ничего не нужно. Если вы всё же замечаете странности, откройте тикет в поддержку, чтобы наша команда подстроила правила фильтрации под ваш IP-адрес. Во время идущей атаки с нами дополнительно можно связаться через экстренный чат WhatsApp по номеру +43 650 8209883. Укажите сразу четыре вещи: IP-адрес, порт, период в вашем часовом поясе и то, что вы наблюдаете (игроков выбрасывает, сервера нет в поиске лобби, высокий пинг). Это избавит от круга уточняющих вопросов, а он дорого стоит, когда идёт кампания.

Если вы хостите в другом месте и вас регулярно обстреливают, переезд в KernelHost короче любого следующего правила на сервере, канал которого заканчивается раньше. Постоянная защита входит в каждый серверный тариф, а не является дополнением, которое вы закажете только в критический момент.

Частые вопросы

Какие порты нужно оставить открытыми для сервера Left 4 Dead 2?
Ровно один: 27015/UDP. Через этот порт вместе идут игровой трафик и A2S-запрос к серверу, отдельного query-порта в Left 4 Dead 2 нет. 27015/TCP — это RCON, и открывать его следует исключительно для вашего собственного адреса. 27005/UDP — клиентский порт, он открывается со стороны игрока и разрешающего правила на сервере не требует. 27020/UDP — это SourceTV, он нужен только тогда, когда вы действительно ведёте трансляцию через -hltv или tv_enable 1. Дополнительные экземпляры на том же хосте нумеруются дальше: 27016, 27017 и так далее.
Мой L4D2-сервер лагает, а канал при этом свободен. Это DDoS-атака?
Скорее всего нет. Сначала загляните в серверную консоль: если там повторяется строка Invalid split packet length, значит, приходят неверно собранные сетевые пакеты, и их нужно совсем немного. Трафик при этом остаётся крошечным, а сервер всё равно лагает. Параллельно проверьте интенсивность пакетов командой sar -n DEV 1 10 и счётчики отброшенных пакетов командой ip -s link show eth0. Если и там, и там всё спокойно, это была не объёмная атака, а схема падения или нагрузки в движке либо в расширении SourceMod. Полоса пропускания тут не поможет, помогает актуальный бинарник сервера.
Защищает ли sv_allow_lobby_connect_only 1 от DDoS-атак?
Нет, эта директива фильтрует заходы, а не пакеты. С sv_allow_lobby_connect_only 1 на сервер попадают только игроки, направленные через лобби матчмейкинга Steam; команда connect из консоли разработчика и приглашения через Steam отклоняются. Против троллей, одноразовых аккаунтов и флуда подключений это очень действенно. Но атакующий, который заливает 27015/UDP, заходить вообще не собирается: его пакеты будут отклонены, однако прийти они всё равно успели, израсходовали полосу и стоили процессорного времени. Против объёмных атак эта настройка не работает.
Можно ли просто ограничить интенсивность на порту 27015, когда сервер обстреливают?
Огульно нет. Игровой трафик и серверный запрос делят 27015/UDP, поэтому грубое ограничение интенсивности выбрасывает ваших собственных игроков и доводит атаку до конца за атакующего. Тормоз должен различать классы пакетов: все пакеты Source-движка без установленного соединения начинаются с четырёх выставленных байт (0xffffffff), а у трафика уже подключённых игроков такого заголовка нет. Именно на этот признак вешается через nftables или iptables предел по адресу отправителя. Вдобавок переменная окружения STEAM_GAMESERVER_RATE_LIMIT_200MS отбрасывает пакеты без установленного соединения от одного адреса, как только за 200 миллисекунд их приходит больше заданного значения.
Что такое резервирование лобби и почему оно блокирует мой сервер?
Резервирование лобби — это ограниченное по времени занятие вашего сервера лобби матчмейкинга. Пока оно действует, для других лобби сервер считается занятым, а истекает оно само лишь через некоторое время. При четырёх кооперативных местах это дефицитный ресурс. Тот, кто не держит свой сервер в матчмейкинге, задаёт sv_force_unreserved 1: тогда сервер перестаёт отвечать на запросы резервирования и отклоняет заходы с признаком резервирования. При более чем четырёх кооперативных местах с L4DToolZ эта настройка обязательна в любом случае, иначе дополнительные места останутся недостижимыми.
Делают ли пользовательские кампании мой сервер уязвимым?
Они делают его дорогим. Пользовательская кампания — это VPK-пакет с картами, моделями, текстурами и звуками, то есть во много раз больше одной карты. Если srcds раздаёт эти файлы сам через игровой порт, каждая попытка подключения нового игрока стоит вам полной загрузки, как и каждый обрыв посреди загрузки. Это дешёвый способ забить канал, и ни в одной статистике он не выглядит как атака. Направьте своих игроков в Steam Workshop или положите файлы через sv_downloadurl на веб-сервер, там в виде архива bzip2.
С какого объёма атаки правило файрвола уже не помогает?
Как только насыщен канал перед вашим сервером. Типовой игровой сервер подключён на 1 Гбит/с, это 125 мегабайт в секунду, а при пакетах размером 64 байта около 1,49 миллиона пакетов в секунду. Обычное серверное ядро обрабатывает несколько сотен тысяч из них, а дальше начинает отбрасывать. Ваше правило всегда принимает решение о пакете, который уже прошёл по кабелю; отбросить его оно может, а сделать неотправленным нет. С этой границы работает только та фильтрация, которая идёт постоянно в сети перед сервером.
Уйдёт ли мой сервер в KernelHost в офлайн во время атаки?
Нет. Null-routing не применяется. Ваш IP-адрес остаётся в сети, отбрасываются исключительно вредоносные пакеты. Защита построена в два уровня: 17 Тбит/с ёмкости митигации в глобальной scrubbing-сети перехватывают объёмные атаки близко к их источнику, а фильтрация Arbor в реальном времени на 3,2 Тбит/с во Франкфурте-на-Майне отбрасывает схемы, характерные для конкретных протоколов, непосредственно перед сервером. Оба уровня работают постоянно и не должны сначала отреагировать на атаку, то есть нет времени переключения, в которое ваши игроки вылетают.
Стоит ли защита от DDoS в KernelHost отдельных денег?
Нет. Двухуровневая постоянная защита входит в каждый серверный тариф без доплаты и активна с момента развёртывания. Её не нужно ни заказывать, ни включать, ни настраивать, и отдельного пакета защиты не существует. Серверы стоят в maincubes Premium Datacenter во Франкфурте-на-Майне. Тот, кто держит свой сервер Left 4 Dead 2 пока что в другом месте и регулярно попадает под обстрел, решает это не очередным правилом на сервере, канал которого заканчивается раньше, а переездом.
Когда дополнительно нужна Advanced DDoS Protection?
Когда ваш проект атакуют не время от времени, а прицельно и неделями, и вы хотите управлять фильтрацией сами. Вы получаете выделенный защищённый IP-адрес и сами задаёте правила защиты по портам и протоколам в личном кабинете, то есть 27015/UDP иначе, чем веб-сервер, который раздаёт ваши кампании. Изменения вступают в силу в реальном времени, поэтому подстраивать их можно прямо во время идущей атаки. Цена начинается от 50,00 € в месяц, по модели PrePaid, без минимального срока и без платы за подключение.

Left 4 Dead 2 L4D2-DDoS-защита Source-движок srcds Система лобби Порт 27015 Защита игровых серверов Advanced DDoS Protection