Защита Lineage-2-сервера от DDoS-атак
Какие порты нужны приватному Lineage-2-серверу на самом деле, почему настоящая цель атаки — логин-сервер на порту 2106, почему атаки сезонно приходятся на открытие серверов и с какого объёма атаки помогает только фильтрация в сети перед сервером.
Приватный Lineage-2-сервер, на котором по вечерам никто больше не проходит дальше экрана входа, пока игроки в мире спокойно продолжают играть, не имеет проблем с железом. Это отпечаток DDoS-атаки на логин-сервер, и именно там должна начинаться защита Lineage-2-сервера от DDoS. В этой статье сначала разобрано, что вы можете закрыть сами и без дополнительных расходов, затем то, где эти меры технически заканчиваются, и в конце то, что должно происходить в сети перед сервером.
Все указания относятся к L2J и его ответвлениям (L2J-Mobius, aCis) под Debian 12, Debian 13, Ubuntu 22.04 LTS или Ubuntu 24.04 LTS, а также к сборкам L2OFF с AuthD, CacheD и L2Server. Команды написаны для root, если вы работаете под обычным пользователем, добавляйте перед каждой командой sudo.
Если атака идёт прямо сейчас: ничего не меняйте в конфигурации и не перезапускайте ни логин-сервер, ни игровой сервер. Сначала сохраните измерения (см. раздел «Протоколирование»), после атаки их уже не будет.
Защита Lineage-2-сервера от DDoS: почему атакуют приватные L2-серверы
У приватного Lineage-2-сервера сходится сразу несколько свойств, которые делают его удобной мишенью, и защита Lineage-2-сервера от DDoS должна опираться именно на эти свойства. Во-первых, ваш адрес публичен, причём с самого начала: игроки скачивают пропатченную папку System, и в её файле l2.ini стоит строка ServerAddr= с IP-адресом вашего логин-сервера. Этот адрес знает каждый, кто хоть раз установил ваш проект, независимо от того, создавал ли он когда-нибудь персонажа.
Во-вторых, аудитория привязана к фиксированному времени. Осады, эпик-боссы и ивенты стоят в календаре, и сбой ровно в этот час заметен максимально. В-третьих, проекты напрямую конкурируют друг с другом: тот, кто открывает сервер, борется за те же несколько тысяч игроков, что и три других проекта в те же выходные. Вывести конкурента из строя в этой среде считается обычной стратегией. Саму атаку заказывают как услугу (в этой среде её называют booter или stresser), и заказчику она не стоит ни навыков, ни заметных денег. Что такое DDoS-атака в подробностях, объясняет статья Что такое DDoS-атака.
Почему настоящая цель атаки — логин-сервер на порту 2106
Lineage 2 разделён на два отдельных процесса: логин-сервер и один или несколько игровых серверов. Клиент сначала подключается по 2106 TCP к логин-серверу, проходит авторизацию, получает оттуда список серверов с внешним адресом и портом игрового сервера и после этого открывает второе соединение по 7777 TCP к игровому серверу. У обоих процессов свои конфигурационные файлы, свои порты и свои пределы нагрузки.
Отсюда и схема атаки, которую владельцы L2-серверов описывают снова и снова: флуд на 2106 блокирует исключительно новые входы. Тот, кто уже стоит в мире, продолжает играть, пока сам не потеряет соединение. Счётчик онлайна поэтому падает медленно, а не обваливается разом, и на форуме появляется «сервер работает, но я не могу зайти». Именно эта картина отличает атаку на логин-сервер от атаки на игровой сервер, при которой всех выбрасывает одновременно.
Кроме того, логин-сервер — более дешёвая цель, потому что затраты распределены неравномерно. При запуске логин-сервер L2J создаёт запас из десяти пар RSA-ключей по 1024 бита и двадцати ключей Blowfish. Каждая попытка входа стоит клиенту одного отправленного пакета, а серверу одной расшифровки закрытым RSA-ключом. Недоведённая до конца сессия при этом занимает место, пока встроенный таймер её не отбросит: LOGIN_TIMEOUT в исходном коде равен 60 секундам. Значение по умолчанию MaxConnectionPerIP = 50 разрешает каждому адресу источника пятьдесят одновременных соединений. Одной тысячи адресов источника хватает тем самым на 50 000 одновременно открытых сессий, и каждая из них держится до минуты.
К этому добавляется особенность игры, которая отличает её от большинства игровых серверов: Lineage 2 работает исключительно по TCP. Производитель указывает для игры TCP-порты 80, 2009, 2106 и 7777, а из UDP исключительно порт 53 для разрешения имён. Игрового трафика по UDP, который пришлось бы фильтровать, попросту нет, зато классический SYN-флуд с поддельными адресами отправителя действует напрямую, а отслеживание соединений в ядре становится первым узким местом.
Почему атаки на Lineage-2-серверы приходятся на открытие серверов
Атаки на приватные Lineage-2-серверы учащаются вокруг открытия серверов, потому что дата и час старта известны публично за недели вперёд. Календари открытий для Lineage-2-проектов перечисляют предстоящие старты по хроникам (Interlude, High Five, Classic, Essence), а рядом указывают рейты и точное время старта, и обновляются они ежедневно. Атакующему нечего разведывать: самый удобный для него момент стоит в анонсе самого владельца.
Вторая причина экономическая. Приватный Lineage-2-сервер зарабатывает в начале: вся база игроков набирается в первые дни, донаты приходят в первые недели, дальше население стабильно сокращается. Игрок, который не смог зайти в первый час, уходит в проект, стартующий в те же выходные, а такой проект есть всегда. Поэтому час простоя в день открытия стоит не часа выручки, а части всего срока жизни сервера.
Третья причина техническая. На Grand Opening тысячи игроков пытаются зайти одновременно. Логин-сервер ровно в эту минуту и без того работает на пределе, а дополнительный флуд почти неотличим от пиковой нагрузки. Атака, которая в спокойный вторник осталась бы без последствий, в час открытия достигает цели. То же самое относится к заранее объявленным событиям в обычной работе: осады замков и эпик-боссы стоят в календаре и по той же причине остаются излюбленным окном для атаки. После наплыва на открытии стимул снова падает, поэтому владельцы воспринимают атаки как волны, а не как постоянное состояние.
Порты, о которых на самом деле идёт речь
Следующая таблица перечисляет порты приватного Lineage-2-сервера, соответствующий конфигурационный файл и директиву, которая задаёт значение. Значения по умолчанию взяты из поставляемых конфигурационных файлов L2J и из инструкций по настройке сборок L2OFF.
| Порт и протокол | Служба | Файл и директива | В открытую сеть? |
|---|---|---|---|
| 2106 TCP | Логин-сервер, вход игрового клиента (L2J) | login/config/LoginServer.properties: LoginserverPort = 2106, LoginserverHostname = * |
да |
| 7777 TCP | Игровой сервер, игровой мир (L2J) | game/config/Server.properties: GameserverPort = 7777, GameserverHostname = * |
да |
| 9014 TCP | Логин-сервер принимает регистрацию игровых серверов | LoginServer.properties: LoginPort = 9014, LoginHostname = 127.0.0.1; ответная часть в Server.properties: LoginHost = 127.0.0.1, LoginPort = 9014 |
нет |
| 3306 TCP | MariaDB или MySQL, база данных любого L2J-сервера | Server.properties: URL = jdbc:mysql://localhost/lineage2, Login = root |
нет |
| 2106 TCP (L2OFF) | AuthD, служба авторизации официальных серверных файлов | конфигурация AuthD: serverExPort = 2106 |
да |
| 7777 TCP (L2OFF) | L2Server, игровой мир официальных серверных файлов | l2server.ini: worldport = 7777 |
да |
| 2104 и 2108 TCP (L2OFF) | внутренние порты AuthD (serverPort и serverIntPort) |
конфигурация AuthD | нет |
| 2006 и 2008 TCP (L2OFF) | CacheD, мост между L2Server и базой данных | конфигурация CacheD | нет |
| 2002 TCP (L2OFF) | L2NPC, загружает NPC в игровой мир | l2npc.ini |
нет |
| 1433 TCP (L2OFF) | Microsoft SQL Server, база данных официальных серверных файлов | конфигурация базы данных | нет |
| 80 и 443 TCP | сайт проекта с регистрацией, донат-магазином и страницами голосования | веб-сервер | да, но не на том же IP-адресе |
| 22 TCP | SSH-доступ | /etc/ssh/sshd_config |
только с ограничением на собственный адрес |
Попутно эта таблица отвечает на два вопроса: у Lineage 2 нет ни query-порта, ни RCON-порта. Нет отдельной службы, которая отдаёт число игроков для списка серверов, и нет порта удалённого управления, как у игр на базе Source. Список серверов формирует сам логин-сервер и отправляет его по тому же соединению на 2106 уже авторизованному клиенту. Удалённое управление в L2J идёт через команды в игре и через базу данных. Тем самым отпадают два вектора атаки, которые есть у других игр, и тем больше остаётся на порту 2106.
Порядки величин, которые стоит знать
| Величина | Значение |
|---|---|
| Транспортный протокол игры | исключительно TCP, UDP только для разрешения имён на порту 53 |
| Канал 1 Гбит/с | 125 мегабайт в секунду |
| Пакеты по 64 байта в 1 Гбит/с | около 1,49 миллиона пакетов в секунду |
| Что обрабатывает обычное серверное ядро | несколько сотен тысяч пакетов в секунду, дальше оно начинает отбрасывать |
| Одновременных соединений с одного адреса источника, значение L2J по умолчанию | MaxConnectionPerIP = 50 |
| Время жизни недоведённой до конца сессии входа в L2J | LOGIN_TIMEOUT, 60 секунд |
| Неудачных попыток до блокировки, значение L2J по умолчанию | LoginTryBeforeBan = 5, затем LoginBlockAfterBan = 900 секунд |
| Отфильтрованная в KernelHost атака на игровой сервер | более 112,2 Гбит/с при более чем 8,7 миллиона пакетов в секунду |
| Отфильтрованная в KernelHost атака на голосовой сервер | более 473,4 Гбит/с при более чем 41,5 миллиона пакетов в секунду |
Что вы можете сделать сами, прежде чем тратить деньги
Этот раздел самый длинный, и так задумано. Аккуратно настроенный Lineage-2-сервер выдерживает небольшие и средние атаки собственными силами, независимо от того, у какого провайдера он стоит.
1. Инвентаризация: что вообще слушает сеть?
Прежде чем написать хотя бы одно правило, посмотрите, что ваш сервер предлагает наружу. Не гадайте, а смотрите:
ss -lntp
Интерес представляет колонка с локальным адресом. 0.0.0.0:2106 и 0.0.0.0:7777 там уместны. 0.0.0.0:9014 и 0.0.0.0:3306 — это ошибки: через эти два порта атакующий может встроиться в ваш список серверов или прощупать вашу базу данных. 127.0.0.1:3306 означает «только локально» и правила файрвола не требует. Взгляд атакующего даёт скан портов снаружи:
nmap -Pn -p- --min-rate 1000 ВАШ.IP.АДРЕС.СЕРВЕРА
2. Держите порт 9014 и базу данных вне открытой сети
Через порт 9014 игровой сервер регистрируется на логин-сервере, и в открытой сети ему не место ни при каких обстоятельствах. L2J уже поставляется с правильным значением по умолчанию: LoginHostname = 127.0.0.1 привязывает порт к интерфейсу обратной петли, то есть снаружи он вообще недоступен. Если логин-сервер и игровой сервер работают на двух разных машинах, впишите вместо * конкретный внутренний адрес и откройте порт исключительно для этой второй машины.
То же правило действует для базы данных. Проверьте в /etc/mysql/mariadb.conf.d/50-server.cnf, что там стоит:
bind-address = 127.0.0.1
И смените пользователя базы данных. В поставляемой Server.properties стоит Login = root, и сам файл сопровождает это примечанием, что именно так делать не рекомендуется. Как завести отдельного пользователя с минимальными правами, описано в статье Защита MariaDB и MySQL. После этого проверьте результат:
ss -lntp | grep -E ':9014|:3306'
Файрвол над всем этим остаётся коротким. Для Lineage-2-сервера наружу достаточно двух разрешений, причём именно в таком порядке, чтобы не закрыть доступ самому себе:
ufw allow 22/tcp comment 'SSH'
ufw allow 2106/tcp comment 'L2 логин'
ufw allow 7777/tcp comment 'L2 игра'
ufw default deny incoming
ufw default allow outgoing
ufw --force enable
ufw status verbose
Полная инструкция вместе с запасным путём есть в статье Настройка файрвола UFW без потери доступа.
3. Отключите AcceptNewGameServer, как только ваш сервер зарегистрирован
В LoginServer.properties с завода стоит AcceptNewGameServer = True, и комментарий над этой строкой точно описывает, что это значит: любой игровой сервер может зарегистрироваться на свободном месте вашего логин-сервера. Пока 9014 висит только на интерфейсе обратной петли, это без последствий. Как только порт по какой-то другой причине станет доступен, это открытая дверь. Поэтому поставьте значение False, как только ваш собственный игровой сервер один раз зарегистрировался и получил свой идентификатор:
AcceptNewGameServer = False
В ответной части на стороне игрового сервера стоит AcceptAlternateID = True. При настройке это удобно, потому что логин-сервер тогда выдаёт другой идентификатор, если нужный занят. На рабочей системе вам нужно обратное: фиксированный идентификатор и ошибка, если он занят.
4. Правильно настройте защиту от флуда в логин-сервере
У логин-сервера L2J есть собственный ограничитель соединений. Он стоит в LoginServer.properties, и все значения времени указаны в миллисекундах:
EnableFloodProtection = True
FastConnectionLimit = 15
NormalConnectionTime = 700
FastConnectionTime = 350
MaxConnectionPerIP = 50
Значения связаны между собой. Соединение, которое приходит с того же адреса источника менее чем через FastConnectionTime после предыдущего, считается быстрым. После FastConnectionLimit таких соединений адрес отклоняется. NormalConnectionTime задаёт интервал, начиная с которого счётчик снова уменьшается. MaxConnectionPerIP задаёт верхний предел одновременно открытых соединений с одного адреса.
Пятьдесят одновременных соединений для одного игрока очень щедро, и более низкие значения помогают заметно. Тем не менее здесь нужна осторожность: несколько игроков в одной квартире, интернет-кафе и прежде всего подключения за операторским NAT (в L2-среде это касается многих игроков из Турции, Бразилии и части Восточной Европы) делят один публичный адрес. Тот, кто поставит здесь 3, закроет доступ настоящим игрокам. Сначала померьте неделю в обычном режиме, затем снижайте шагами.
И ограничение, которое нужно понимать: этот ограничитель работает в Java-процессе логин-сервера. Каждый пакет, о котором он принимает решение, уже прошёл по вашему каналу и уже стоил процессорного времени. Против горстки источников он работает, против ботнета нет.
5. Ограничьте число неудачных попыток и используйте banned_ip.cfg
Ещё две директивы в LoginServer.properties определяют, как долго кто-то может подбирать пароль:
LoginTryBeforeBan = 5
LoginBlockAfterBan = 900
LoginTryBeforeBan задаёт число неверных сочетаний учётной записи и пароля, после которого адрес блокируется, LoginBlockAfterBan задаёт длительность блокировки в секундах (900 соответствует 15 минутам). После этого отсчёт начинается заново.
Постоянные блокировки вносят в файл banned_ip.cfg в каталоге конфигурации логин-сервера. Допустимы отдельные адреса, целые сети и необязательный момент истечения в виде метки времени Unix в миллисекундах, всё после # считается комментарием:
198.51.100.7
203.0.113.0
198.51.100.44 1789689600000
Поставьте кроме того AutoCreateAccounts = False. Значение по умолчанию True при каждом входе с неизвестным именем учётной записи автоматически создаёт такую запись. При настройке это удобно, а в работе это подарок: атакующий создаёт таким образом сколько угодно учётных записей, и каждая из них имеет право запросить список серверов с адресом вашего игрового сервера. Пусть учётные записи вместо этого появляются через регистрацию на вашем сайте, тогда вы контролируете, кто получает доступ.
6. Ограничьте интенсивность соединений на 2106 и 7777 в ядре
То, о чём Java-ограничитель решает слишком поздно, ядро решает раньше и дешевле. Против небольших атак и неаккуратных ботов помогает верхний предел на каждый адрес источника:
iptables -I INPUT -p tcp --dport 2106 --syn -m connlimit --connlimit-above 8 --connlimit-mask 32 -j DROP
iptables -I INPUT -p tcp --dport 2106 --syn -m hashlimit --hashlimit-name l2login --hashlimit-mode srcip --hashlimit-above 6/sec --hashlimit-burst 20 -j DROP
iptables -I INPUT -p tcp --dport 7777 --syn -m connlimit --connlimit-above 6 --connlimit-mask 32 -j DROP
Первое правило отбрасывает новые соединения к логин-серверу, как только с одного адреса их одновременно открыто больше восьми. Обычному клиенту нужно ровно одно. Второе ограничивает интенсивность новых соединений шестью в секунду на адрес с запасом в двадцать, что ещё пропускает шторм переподключений после перезапуска сервера. Третье разрешает на игровом сервере шесть одновременных соединений с одного адреса, потому что многооконный вход (дуалбокс и триплбокс) в Lineage 2 — привычное дело, а слишком узкий предел бьёт по вашим же платящим игрокам.
Все три цифры — стартовые значения, а не истина в последней инстанции. Сервер с 2000 одновременных игроков ведёт себя иначе, чем сервер с 200. Сначала померьте, потом настраивайте. Просто добавленные правила iptables после перезагрузки исчезают, в Debian и Ubuntu их сохраняют так:
apt-get install -y iptables-persistent
netfilter-persistent save
При работе с UFW такие правила помещают в /etc/ufw/before.rules, иначе они пропадут при следующем ufw reload.
7. Как перехватить SYN-флуд: syncookies, backlog и отслеживание соединений
Поскольку Lineage 2 работает исключительно по TCP, SYN-флуд оказывается очевидным вектором. SYN-флуд — это атака, которая шлёт запросы на соединение с поддельными адресами отправителя и никогда не отвечает на подтверждение, из-за чего сервер резервирует под каждый запрос память, которая никогда не используется. Четыре настройки смягчают это:
sysctl -w net.ipv4.tcp_syncookies=1
sysctl -w net.ipv4.tcp_max_syn_backlog=8192
sysctl -w net.core.somaxconn=4096
sysctl -w net.ipv4.tcp_synack_retries=2
SYN-cookies здесь самая важная строка: ядро отвечает на запрос, ничего не запоминая, и создаёт состояние только тогда, когда вторая сторона действительно доводит соединение до конца. Поддельные отправители при этом уходят в пустоту. Постоянно значения записывают в файл в каталоге /etc/sysctl.d/ и загружают командой sysctl --system.
Часто упускаемое узкое место — отслеживание соединений в ядре. Когда оно заполняется, сервер отбрасывает и легитимные пакеты, а в логе появляется «nf_conntrack: table full, dropping packet». Текущее значение и верхний предел показывает:
sysctl net.netfilter.nf_conntrack_count net.netfilter.nf_conntrack_max
8. Сайт, логин-сервер и игровой сервер на разных IP-адресах
Сайт проекта с регистрацией, донат-магазином и страницами голосования всегда находится через ваш домен. Если он лежит на том же IP-адресе, что и логин-сервер, атака на сайт одновременно кладёт и вход в игру, и наоборот. Разнесите эти три роли на разные адреса. Тогда при атаке на сайт игра остаётся доступной, а при атаке на 2106 уже подключённые игроки продолжают играть.
Держите при этом DNS-записи в порядке. Самая частая ошибка — забытая A-запись на прежний адрес: она обесценивает любую смену адреса, потому что атакующий находит новый адрес по тому же имени, что и ваши игроки.
И здесь нужна честность вместо выдачи желаемого за действительное: адрес вашего логин-сервера сохранить в тайне не получится. Он стоит в l2.ini в папке System, которую скачивает каждый игрок. Адрес игрового сервера, в свою очередь, раздаёт сам логин-сервер: в L2J он записан как внешний адрес в ipconfig.xml (в более старых ответвлениях как ExternalHostname в Server.properties), и его сообщают каждому клиенту, который успешно авторизовался. Прятаться — не стратегия, фильтровать — стратегия.
9. Протоколирование: чтобы в нужный момент были данные
Самый важный шаг — тот, который почти никто не делает заранее: собрать базу для сравнения, пока всё работает нормально. Без нормального значения вы после инцидента не скажете, много ли это, 40 000 пакетов в секунду, или это просто вечер субботы. С apt-get install -y vnstat sysstat измерение идёт постоянно в фоне. Во время инцидента хватает четырёх команд:
sar -n DEV 1 10
ss -tn state syn-recv | wc -l
ip -s link show eth0
tcpdump -ni eth0 'tcp port 2106' -c 200 -q
Вторая строка в случае Lineage 2 самая показательная: она считает полуоткрытые соединения. Пятизначное значение при паре сотен игроков — это SYN-флуд и ничто иное. Для tcpdump правило одно: всегда ограничивайте объём через -c, ведь захват трафика под полной нагрузкой дополнительно нагружает и без того перегруженный сервер. Как разобрать полученные значения, описано в статье Как определить DDoS-атаку.
Где эти меры заканчиваются
Теперь та часть, которую не решит ни один конфигурационный файл. Все описанные выше меры работают на вашем сервере, то есть в конце канала. Правило файрвола принимает решение о пакете, который уже прошёл по кабелю. Вы можете его отбросить, но не можете сделать неотправленным.
Давайте посчитаем. Типовой игровой сервер подключён на 1 Гбит/с, это 125 мегабайт в секунду, и канал заполнен, как только кто-то отправит больше. Против Lineage-2-сервера для этого не нужна даже крупная атака, потому что вторая величина бьёт раньше: интенсивность пакетов. При маленьких пакетах по 64 байта в канал на 1 Гбит/с помещается около 1,49 миллиона пакетов в секунду. Обычное серверное ядро в зависимости от CPU и сетевой карты обрабатывает несколько сотен тысяч из них, а дальше начинает отбрасывать.
У игры на чистом TCP добавляется третья граница. Каждое полуоткрытое соединение занимает запись в отслеживании соединений и в очереди backlog, а логин-сервер L2J держит свои сессии до 60 секунд. Значит, атака в несколько сотен тысяч пакетов в секунду, которая не заполняет ваш канал даже на треть, способна полностью заблокировать вход. Владельцы описывают это словами «загрузка ведь была совсем не высокой, а зайти всё равно никто не мог».
Чтобы понимать, какие порядки величин встречаются на практике: на серверах KernelHost были отфильтрованы, среди прочего, атака мощностью более 112,2 Гбит/с при более чем 8,7 миллиона пакетов в секунду на игровой сервер и многовекторная атака мощностью более 473,4 Гбит/с при более чем 41,5 миллиона пакетов в секунду на голосовой сервер. Локальной настройки против такого не существует. Объёмные атаки должны заканчиваться в сети перед сервером. Что делать в острой ситуации, описано в статье Мощная DDoS-атака: что делать.
Что KernelHost этому противопоставляет
Постоянная защита, которая включена в каждый сервер
Защита от DDoS в KernelHost построена в два уровня и активна постоянно, вам не нужно ничего включать, заказывать или настраивать:
- Уровень 1: 17 Тбит/с ёмкости mitigation в глобальной scrubbing-сети. Объёмные атаки вычищаются близко к источнику, ещё до того как они дойдут до дата-центра.
- Уровень 2: фильтрация Arbor в реальном времени на 3,2 Тбит/с во Франкфурте-на-Майне. Непосредственно перед сервером распознаются и отбрасываются схемы, характерные для конкретных протоколов, пакет за пакетом.
Решают два свойства. Защита работает постоянно и не должна сначала отреагировать на атаку, поэтому нет тех первых минут, когда сервер недоступен. Именно на Grand Opening это и есть разница между удавшимся и потерянным стартом. И null-routing не применяется: ваш IP-адрес остаётся в сети, отбрасываются только вредоносные пакеты. Тот, кто убирает IP-адрес из сети, добивается для вас того же результата, что и атакующий. Какие игры и протоколы покрыты, перечисляет статья Защита игровых серверов от DDoS в реальном времени.
Advanced DDoS Protection для проектов под постоянным обстрелом
Некоторые проекты атакуют не время от времени, а прицельно и неделями, и в Lineage-2-среде это обычное дело для любого сервера, который поднимается в верхние строчки списков. Для них есть Advanced DDoS Protection от 50,00 € в месяц, по модели PrePaid и без минимального срока. Разница не в большей ёмкости, а в контроле:
- Выделенный защищённый IP-адрес из франкфуртского ядра сети, на который ваш сервер переводится внутри нашей сети. С вашей стороны ничего перестраивать не нужно.
- Самостоятельно управляемые правила защиты по портам и протоколам в личном кабинете: вы отдельно задаёте, что разрешено на 2106 TCP и что на 7777 TCP. В Lineage 2 это решающий момент, потому что у этих двух портов совершенно разные схемы трафика: много коротких соединений с одной стороны и немного очень длинных с другой.
- Изменения вступают в силу в реальном времени, поэтому подстраивать их можно прямо во время идущей атаки, а перед часом открытия правила можно ужесточить и потом снова ослабить.
- Профиль защиты под конкретное приложение, в том числе для модифицированных и собственных серверных файлов на любых портах TCP или UDP. Работаете вы на L2J, L2J-Mobius, aCis или на сборке L2OFF, для набора правил роли не играет, потому что он опирается на порт и протокол.
Сравнение двух уровней
| Характеристика | Включённая постоянная защита от DDoS | Advanced DDoS Protection |
|---|---|---|
| Цена | входит в каждый серверный тариф без доплаты | от 50,00 € в месяц, PrePaid |
| Ёмкость фильтрации | 17 Тбит/с глобального scrubbing плюс фильтрация Arbor в реальном времени на 3,2 Тбит/с во Франкфурте-на-Майне | та же двухуровневая фильтрация |
| IP-адрес | IP-адрес вашего сервера | дополнительный выделенный защищённый IP |
| Набор правил | автоматические профили, настраивать ничего не нужно | собственные правила по портам и протоколам в личном кабинете, 2106 и 7777 по отдельности |
| Изменения | применяются автоматически | вступают в силу в реальном времени, в том числе во время атаки |
| Серверные файлы | оптимизированные профили для распространённых игр | профиль по порту и протоколу, то есть и для L2J, L2J-Mobius, aCis и L2OFF |
| Null-routing | нет | нет |
| Срок | привязан к серверному тарифу | PrePaid, без минимального срока, без срока расторжения, без платы за подключение |
Большинству Lineage-2-проектов хватает включённой постоянной защиты вместе с аккуратной настройкой сервера. Advanced DDoS Protection — это ответ на ситуацию, когда кто-то воспринимает происходящее лично, а по опыту это случается в неделю перед Grand Opening.
Частые ошибки и что с ними делать
«Вход не работает, а игровой сервер работает нормально»: это не случайность, а обычная форма атаки на Lineage-2-сервер. Логин-сервер и игровой сервер — это два процесса на двух портах. Померьте ss -tn state syn-recv | wc -l и sar -n DEV 1 10. Если полуоткрытые соединения растут, а полоса остаётся спокойной, это флуд соединений на 2106.
«Я сменил IP-адрес и на следующий день снова был офлайн»: новый адрес атакующий получает тем же путём, что и ваши игроки, а именно через новую папку System с изменённым l2.ini, через ваш анонс или через забытую DNS-запись. Смена адреса даёт время, но не решает проблему.
«Я поставил MaxConnectionPerIP на 3, и теперь игроки жалуются»: дуалбокс в Lineage 2 — обычное дело, а игроки за операторским NAT делят один публичный адрес с сотнями других. Вернитесь к значению, которое покрывает ваши измерения в обычном режиме, и вместо этого ограничьте интенсивность новых соединений в ядре.
«Мои правила iptables не срабатывают»: частых причин три. Правила стоят позади цепочек UFW, и дело до них не доходит. Либо они пропали после последней перезагрузки (тогда помогут netfilter-persistent save или запись в /etc/ufw/before.rules). Либо атака объёмная, и правило работает корректно, только канал уже забит. Проверьте командой iptables -L INPUT -n -v, растут ли счётчики совпадений. Если они остаются на нуле, трафик до правила не доходит.
«У всех игроков лаг-спайки, а канал при этом спокоен»: тогда это не DDoS-атака. У Java-сервера обычные подозреваемые — это паузы сборки мусора, база данных без подходящих индексов и скрипт или собственный ивент в цикле. Сначала посмотрите sar -n DEV 1 10: если интенсивность пакетов остаётся обычной, причина в самом сервере, а не в сети.
«Мой прежний провайдер заблокировал мой IP-адрес»: это и есть null-routing. Так провайдер защищает собственную сеть, а для вас результат ничем не отличается от успешной атаки, обычно ещё на несколько часов после неё. Если сомневаетесь, спросите напрямую: трафик фильтруют или адрес уводят в null-routing. Ответ определяет вашу доступность сильнее, чем любые характеристики железа.
«В tcpdump я не вижу ничего подозрительного»: если трафик отфильтрован ещё в сети перед сервером, то до самого сервера, как и ожидается, ничего не доходит. При работающей фильтрации это нормальная картина. Верно и обратное: при насыщенном канале до вас может не дойти даже та SSH-сессия, из которой вы собирались снимать измерения. Тогда используйте VNC-консоль в личном кабинете, она работает независимо от сети гостевой системы.
«Моё Grand Opening через две недели»: тогда переезжайте сейчас, а не в неделю старта. Переезд стоит игрокам новой папки System, а вам смены DNS и тестового прогона. Всё это вы хотите пройти до того, как объявите дату, ведь с момента анонса каждый конкурент знает ваш самый неудобный момент.
Коротко о главном
- Приватному Lineage-2-серверу нужно ровно два порта в открытой сети: 2106 TCP для логин-сервера и 7777 TCP для игрового сервера. Порт 9014, база данных (3306 при L2J, 1433 при L2OFF) и внутренние порты L2OFF 2002, 2006, 2008, 2104 и 2108 к ним не относятся.
- Lineage 2 работает исключительно по TCP и не имеет ни query-порта, ни RCON-порта. Поэтому типичная атака — это SYN-флуд или флуд соединений на порт 2106, а не UDP-флуд.
- Атака на логин-сервер блокирует только новые входы. Если никто не может зайти, а игроки в мире продолжают играть, причину надо искать на порту 2106, а не на 7777.
- Осознанно выставьте
EnableFloodProtection,MaxConnectionPerIP,LoginTryBeforeBanиAutoCreateAccounts, переведитеAcceptNewGameServerпосле регистрации наFalseи ограничьте интенсивность соединений дополнительно в ядре, потому что Java-ограничитель срабатывает уже за каналом. - Атаки на Lineage-2-серверы учащаются к открытию серверов, потому что дата и час известны за недели вперёд, а экономический ущерб в день открытия максимален. Защита должна стоять до анонса, а не после него.
- Выше пропускной способности канала и выше нескольких сотен тысяч пакетов в секунду решает исключительно фильтрация в сети перед сервером. В KernelHost она двухуровневая, постоянно активна, без доплаты и без null-routing.
Если ваш проект уже работает в KernelHost, фильтрация активна, и делать для этого ничего не нужно. Если вы всё же замечаете странности, откройте тикет в поддержку, чтобы правила фильтрации подстроили под ваш IP-адрес. Во время идущей атаки с нами дополнительно можно связаться через экстренный чат WhatsApp по номеру +43 650 8209883.
Частые вопросы
Мой Lineage-2-сервер сейчас офлайн. Как понять, что это DDoS-атака?
Какие порты нужно оставить открытыми для Lineage-2-сервера?
Почему в Lineage 2 атакуют логин-сервер на порту 2106, а не игровой сервер?
Для чего нужен порт 9014 в L2J и должен ли он быть доступен снаружи?
Почему Lineage-2-серверы атакуют особенно на Grand Opening?
Можно ли отбиться от DDoS-атаки средствами iptables или защиты от флуда в L2J?
Поможет ли быстро сменить IP-адрес моего L2-сервера прямо сейчас?
С какого объёма атаки мой Lineage-2-сервер уже не справится сам?
Уйдёт ли мой сервер в KernelHost в офлайн во время атаки?
Стоит ли защита от DDoS в KernelHost отдельных денег?
Когда моему Lineage-2-проекту дополнительно нужна Advanced DDoS Protection?
2026 KernelHost GmbH. Все права защищены. Эта инструкция охраняется авторским правом. Публикация на других сайтах, в том числе частично или в изменённом виде, без нашего письменного согласия не разрешается. Цитирование с указанием источника и активной ссылкой мы приветствуем.

