Защита сервера 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.

Читать далее