Захист сервера 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 навіть у моменти агресивних спроб шкідливого флуду.