Защита сервера SA:MP от Flood-атак и ложных пакетов на уровне Pawn
Сетевой движок SA:MP базируется на старой версии библиотеки RakNet. Главная уязвимость этой архитектуры заключается в том, что сервер безоговорочно доверяет многим пакетам, приходящим от клиента. Читерские программы (вредоносные скрипты на Lua, кастомные ракботы и софт вроде «SAMP Damage Changer» или флудеры) используют это доверие, чтобы атаковать сервер изнутри игрового протокола. Они имитируют массовый спавн транспорта, отправляют тысячи ложных запросов на поднятие пикапов в секунду или флудят пакетами авторизации, уводя TPS сервера в ноль и вызывая вылеты у реальных игроков.
Стандартные автовызываемые функции Pawn (колбэки вроде OnPlayerPickUpPickup) вызываются уже *после* того, как сервер потратил ресурсы на обработку пакета. Единственный способ выстроить надежную оборону — перехватывать и фильтровать вредоносные сетевые пакеты на ранней стадии с помощью плагина Pawn.RakNet или комплексного античета Nex-AC. В этой статье мы разберем, как реализовать такую защиту.
Понимание сетевого уровня: RPC и Пакеты
Взаимодействие между клиентом и сервером в SA:MP делится на два типа данных:
- Пакеты (Packets): Низкоуровневые данные, содержащие физическую информацию (координаты игрока, углы поворота, скорость автомобиля). Они отправляются непрерывно десятки раз в секунду.
- RPC (Remote Procedure Call): Удаленные вызовы процедур. Это пакеты, сообщающие о конкретном действии игрока: отправка сообщения в чат, нажатие клавиши, вход в интерьер, попытка сесть в машину или поднять пикап.
Анатомия флуд-атаки: Читер включает скрипт, который начинает слать RPC_PickedUpPickup (ID: 131) с частотой 5000 запросов в секунду. Сервер пытается обработать каждый запрос, вызывая цепочку проверок в моде. Процессор хостинга загружается на 100%, и сервер перестает отвечать остальным игрокам.
Часть 1: Низкоуровневая фильтрация через Pawn.RakNet
Плагин Pawn.RakNet предоставляет доступ к перехвату RPC до того, как они нагрузят игровой движок. Мы можем заблокировать пакет и сразу кикнуть нарушителя.
Реализация защиты от флуда пикапами и ложного спавна авто:
Добавьте этот код в свой игровой мод. Он отслеживает частоту отправки критических RPC от каждого игрока.
#include <Pawn.RakNet>
#define RPC_PICKED_UP_PICKUP 131
#define RPC_VEHICLE_CREATE 22
static last_pickup_tick[MAX_PLAYERS];
static pickup_flood_count[MAX_PLAYERS];
public OnIncomingRPC(playerid, rpcid, BitStream:bs)
{
if(rpcid == RPC_PICKED_UP_PICKUP)
{
new current_tick = GetTickCount();
if(current_tick - last_pickup_tick[playerid] < 200)
{
pickup_flood_count[playerid]++;
if(pickup_flood_count[playerid] > 5)
{
printf("[Защита] Игрок ID %d кикнут за флуд пикапами.", playerid);
Kick(playerid);
return 0;
}
}
else
{
pickup_flood_count[playerid] = 0;
}
last_pickup_tick[playerid] = current_tick;
}
if(rpcid == RPC_VEHICLE_CREATE)
{
if(GetPlayerAdminLevel(playerid) == 0)
{
printf("[Защита] Предотвращена попытка спавна авто читером ID %d.", playerid);
Kick(playerid);
return 0;
}
}
return 1;
}
Часть 2: Защита от флуда подключениями и ложной авторизации
Другой тип атаки — «Ракдроид» или «Ракбот», когда на сервер одновременно подключаются 100–200 ботов. Они не проходят стадию спавна, а зависают на этапе авторизации, бесконечно посылая ложные пакеты авторизации или запросы на смену класса (Class Request), забивая сетевой поток.
Защита от флуда диалогами и сменой класса:
Используя низкоуровневый перехват RPC, жестко лимитируйте интенсивность действий для неавторизованных слотов:
#define RPC_DIALOG_RESPONSE 62
#define RPC_REQUEST_CLASS 129
public OnIncomingRPC(playerid, rpcid, BitStream:bs)
{
if(PlayerInfo[playerid][pIsLoggedIn] == false)
{
if(rpcid == RPC_DIALOG_RESPONSE)
{
static last_dialog_tick[MAX_PLAYERS];
if(GetTickCount() - last_dialog_tick[playerid] < 150)
{
Kick(playerid);
return 0;
}
last_dialog_tick[playerid] = GetTickCount();
}
if(rpcid == RPC_REQUEST_CLASS)
{
static class_requests[MAX_PLAYERS];
class_requests[playerid]++;
if(class_requests[playerid] > 10)
{
Kick(playerid);
return 0;
}
}
}
return 1;
}
Часть 3: Комплексная интеграция Nex-AC (Инструкция)
Если вы не хотите прописывать каждый RPC вручную, рекомендуется установить проверенный временем и готовый античит Nex-AC. Он включает в себя встроенную защиту от большинства известных серверных уязвимостей, включая flood-атаки пакетами (Nop'ы, CarShot, FlyHack, Flood-подключения).
- Скачайте инклуд
nex-ac.incи плагинnex-ac.so(для Linux-хостинга). - Поместите плагин в папку
plugins/, а инклуд — в папкуpawno/include/. - Подключите инклуд в самом верху вашего игрового мода (сразу после
a_samp):#include <a_samp> #include <nex-ac> - Откройте конфигурационный файл
scriptfiles/nex-ac_settings.cfg, который сгенерируется после первого запуска, и настройте лимиты сетевой интенсивности под мощность вашего тарифа:
anti_flood_connect 5 # Максимум подключений с одного IP в секунду
max_ping 500 # Максимальный пинг (защита от лаг-флудеров)
kick_on_flood 1 # Кикать игроков при обнаружении флуда пакетами
minify_object_bullet 1 # Оптимизация обработки пакетов выпуска пуль (защита от RapidFire)
| Тип атаки / Читера | Что делает с сервером | Инструмент пресечения |
|---|---|---|
| Pickup Flood / Dialog Flood | Забивает процессор хостинга бесконечным вызовом логики мода. | Pawn.RakNet (Перехват RPC 131 и RPC 62) |
| Car crasher / Unoccupied flood | Читер раскидывает пустые машины по карте, вызывая лаги физики. | Nex-AC или кастомный перехват пакета ID_VEHICLE_SYNC |
| Брутфорс / Ракботы на спавне | Занимают слоты сервера, перегружают БД ложными авторизациями. | Таймаут на авторизацию (если игрок не вошел за 2 минуты — Kick(playerid)) |
Резюме: Защита сервера SA:MP должна быть проактивной. Отсекайте любые аномальные пакеты на уровне плагинов до того, как они дойдут до тяжелых скриптов вашего игрового режима. Это гарантирует стабильный TPS 50.0 даже в моменты агрессивных попыток вредоносного флуда.