Захист сервера SA:MP від Flood-атак та нелегітимних пакетів на рівні Pawn

Технічний посібник із налаштування захисту серверів SA:MP від мережевого флуду, злому діалогів та нелегального спавну об'єктів за допомогою Pawn.RakNet та Nex-AC.

20.05.2026 Українська

Захист сервера 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-підключення).

  1. Скачайте інклуд nex-ac.inc та плагін nex-ac.so (для Linux-хостингу).
  2. Помістіть плагін у папку plugins/, а інклуд — у папку pawno/include/.
  3. Підключіть інклуд у самому верху вашого ігрового мода (відразу після a_samp):
    #include <a_samp>
    #include <nex-ac>
  4. Відкрийте конфігураційний файл 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 навіть у моменти агресивних спроб шкідливого флуду.

Схожі статті

Виправлення багу з «невидимками» та розсинхронізацією віртуальних світів

Технічний посібник з усунення багу з невидимими гравцями та розсинхронізації віртуальних світів у SA:MP/CRMP за допомогою правильного використання інструментів Incognito Streamer.

Читати далі

Борьба з витоками пам'яті (Memory Leaks) в AMX-скриптах

Технічний посібник із пошуку та усунення витоків пам'яті в серверних скриптах SA:MP/CRMP AMX, фокусуючись на очищенні кешу MySQL, об'єктах Стрімера та стеку.

Читати далі

Організація правильного кешування даних (PlayerInfo) в RAM

Технічний посібник зі створення високопродуктивної архітектури кешування в оперативній пам'яті за допомогою масиву PlayerInfo в Pawn для зниження дискового навантаження I/O.

Читати далі