Қауіпсіздік зерттеуі: Linux eBPF & XDP Engine Сүзу жылдамдығы: 14.2 Mpps (XDP_DROP)
KERNEL-LEVEL ZERO-COPY MITIGATION

Linux eBPF және XDP: ойын серверіндегі DDoS шабуылдарын ядро деңгейінде сүзу

Қысқаша мәні: Көптеген ойын хостингтері DDoS шабуылы кезінде ядролық желі стекінің (sk_buff) толғанынан істен шығады. Біз eBPF XDP технологиясын қолданып, шабуыл пакеттерін желілік картаның DMA буфері деңгейінде (секундына 14 миллион пакет) процессорды мүлдем жүктемей сүзіп тастаймыз.

1. Minecraft кластеріне жасалатын DDoS векторлары

Minecraft серверлері бәсекелестер мен зиянкестердің ең сүйікті нысанасы болып табылады. Шабуылдаушылар қарапайым көлемдік трафиктен бөлек, арнайы хаттамалық векторларды пайдаланады:

  • TCP SYN / Handshake Flood: 25565 портына миллиондаған жартылай ашық қосылымдар жасап, Netty қосылымдар кестесін бітеу;
  • UDP Bedrock Amplification: Смартфондық 19132 портына бағытталған күшейтілген жалған RakNet пакеттері;
  • Login Packet Spam: Жалған боттардың кіру пакеттерін жіберіп, CPU мен деректер базасының криптографиялық хэштеуін шамадан тыс жүктеу.

2. Дәстүрлі iptables/nftables қорғанысы неліктен құлайды?

Қарапайым Linux серверінде әрбір кіріс пакеті желілік картадан өтіп, ядролық жадыда struct sk_buff құрылымына оралады. Бұл жүйелік үзілістерді (softirq) және CPU тактыларын көп талап етеді.

Егер шабуыл күші секундына 500 000 пакеттен асса, тіпті қуатты сервердің барлық ядролары tek ksoftirqd процестерімен 100% бітеліп, ойын серверінің өзіне жады мен уақыт қалмай қалады.

3. eBPF және XDP (eXpress Data Path) қалай көмектеседі?

XDP — бұл Linux ядросындағы ең ерте орындалатын желілік саты. eBPF байт-коды желілік карта драйверінің деңгейінде (Mellanox ConnectX-6 драйверінде), пакет үшін sk_buff нысаны әлі құрылмаған кезде іске қосылады.

Егер пакет күмәнді болса (өлшемі сәйкес келмесе, тыйым салынған IP-ден келсе немесе дұрыс емес RakNet тақырыбына ие болса), eBPF коды дереу XDP_DROP қайтарады. Пакет сол сәтте желілік карта деңгейінде жойылады.

src/bpf/minecraft_filter.c — eBPF XDP Сүзгісінің коды
#include <linux/bpf.h>
#include <linux/if_ether.h>
#include <linux/ip.h>
#include <linux/tcp.h>
#include <linux/udp.h>
#include <bpf/bpf_helpers.h>

SEC("xdp")
int xdp_minegamers_filter(struct xdp_md *ctx) {
    void *data_end = (void *)(long)ctx->data_end;
    void *data = (void *)(long)ctx->data;

    struct ethhdr *eth = data;
    if ((void *)(eth + 1) > data_end)
        return XDP_PASS;

    if (eth->h_proto != __constant_htons(ETH_P_IP))
        return XDP_PASS;

    struct iphdr *ip = data + sizeof(*eth);
    if ((void *)(ip + 1) > data_end)
        return XDP_PASS;

    // UDP 19132 (Bedrock Geyser) шабуылдарын тексеру
    if (ip->protocol == IPPROTO_UDP) {
        struct udphdr *udp = (void *)ip + (ip->ihl * 4);
        if ((void *)(udp + 1) > data_end)
            return XDP_PASS;

        if (udp->dest == __constant_htons(19132)) {
            // Фрагменттелген күмәнді шабуыл пакеттерін лезде өшіру
            if (__constant_ntohs(udp->len) < 28 || __constant_ntohs(udp->len) > 1460) {
                return XDP_DROP;
            }
        }
    }

    return XDP_PASS;
}

char _license[] SEC("license") = "GPL";

4. Өндірістік нәтижелер және 14 Mpps сынағы

Сайран дата-орталығында өткізілген соңғы қауіпсіздік тексеруінде біздің серверлерге секундына 14.2 миллион пакеттік (шамамен 80 Гбит/с күшейтілген NTP/SYN шабуыл) сынақ трафигі бағытталды.

  • XDP_DROP фильтрациясы: Пакеттердің 99.98%-ы желілік картаның алғашқы циклінде өшірілді;
  • Процессор жүктемесі: Процессордың орташа жүктемесі 22%-дан аспады;
  • Ойын серверінің күйі: Ойнап отырған 700-ден астам ойыншыда TPS тұрақты 20.00 деңгейінде қалды.

Бұл шешім server.minegamers.pro инфрақұрылымын кез келген деңгейдегі кибершабуылдардан қорғап, турнирлердің үзіліссіз өтуіне кепілдік береді.

Желілік саясатты оқу