大带宽服务器 DDoS 防护的尽头不是带宽:XDP、DPDK、SmartNIC 三种线速清洗方案实测对比

为什么 10G 大带宽也怕小包?

很多同行选大带宽服务器时只看带宽数字,以为 10G 就能硬扛 DDoS。但 64 字节小包下,10G 线速是 14.88 Mpps。如果内核协议栈处理不过来,带宽再大也白搭。默认 netfilter 在软中断里逐包匹配,单核跑到 1.5 Mpps 就差不多到顶了,SYN Flood 一来,CPU 全部耗在 ksoftirqd 上,业务直接失联。

测试环境与方法

本次对比使用轻云互联的 10G 不限流量大带宽服务器,配置:Xeon Gold 6248R、64G DDR4、Mellanox ConnectX-4 Lx 双口 10G、CentOS 8、kernel 5.15。打流工具用 TRex,构造 64 字节 SYN Flood,目标端口 80,目的 MAC 为服务器网卡。

# 确认网卡多队列
ethtool -l eth0
# 开启多队列 RSS
ethtool -L eth0 combined 8
# 查看中断分布
cat /proc/interrupts | grep eth0

Baseline:netfilter 到底能扛多少?

先看传统方案。在 nftables 里加一条简单规则,丢弃 SYN:

nft add table inet filter
nft add chain inet filter input { type filter hook input priority 0\; }
nft add rule inet filter input tcp flags syn drop

TRex 打到 1.5 Mpps 时,ksoftirqd 已经占满 4 个核心,丢包率开始上升。2 Mpps 时 SSH 无法响应。结论:netfilter 适合做策略,不适合做线速 DDoS 清洗。

方案一:XDP eBPF 驱动层丢弃

XDP 在网卡驱动收包点执行,早于协议栈分配 skb,所以性能极高。写一个最简单的 SYN 丢弃程序:

// xdp_synflood.c
#include <linux/bpf.h>
#include <linux/if_ether.h>
#include <linux/ip.h>
#include <linux/tcp.h>
#include <bpf/bpf_helpers.h>

SEC("xdp")
int xdp_synflood_prog(struct xdp_md *ctx) {
    void *data_end = (void *)(long)ctx->data_end;
    void *data = (void *)(long)ctx->data;
    struct ethhdr *eth = data;
    if (data + sizeof(*eth) > data_end) return XDP_PASS;
    if (eth->h_proto != htons(ETH_P_IP)) return XDP_PASS;
    struct iphdr *ip = data + sizeof(*eth);
    if (data + sizeof(*eth) + sizeof(*ip) > data_end) return XDP_PASS;
    if (ip->protocol != IPPROTO_TCP) return XDP_PASS;
    struct tcphdr *tcp = (void *)ip + sizeof(*ip);
    if (data + sizeof(*eth) + sizeof(*ip) + sizeof(*tcp) > data_end) return XDP_PASS;
    if (tcp->syn && !tcp->ack) return XDP_DROP;
    return XDP_PASS;
}
char _license[] SEC("license") = "GPL";

编译与加载:

clang -O2 -g -target bpf -c xdp_synflood.c -o xdp_synflood.o
ip link set dev eth0 xdp obj xdp_synflood.o sec xdp
# 查看是否加载
ip link show eth0 | grep xdp

测试数据:单队列 XDP 在 3.0 GHz 核心上可处理约 10 Mpps,CPU 占用 60%。开启 8 队列 RSS 后,整机 14 Mpps 线速无压力,业务延迟无明显抖动。如果配合 bpftool 动态更新黑名单 map,还能实现秒级封禁。

方案二:DPDK 用户态轮询

DPDK 完全绕过内核,独占网卡。先绑定网卡到 vfio-pci,再跑 l2fwd 测试转发/丢弃性能。

# 配置大页
echo 1024 > /sys/kernel/mm/hugepages/hugepages-2048kB/nr_hugepages
# 绑定网卡
modprobe vfio-pci
./dpdk-devbind.py --bind=vfio-pci 0000:01:00.0
# 启动 l2fwd,4 核
./l2fwd -l 0-3 -n 4 -- -p 0x1

测试数据:4 个核跑满 14.88 Mpps,每核约 3.7 Mpps,CPU 100%。延迟比 XDP 略高,且网卡被独占,SSH 和业务无法使用同一张卡。适合专用清洗设备,不适合大带宽服务器上跑业务的同时做清洗。

方案三:SmartNIC 卸载

如果网卡支持 XDP offload,可以把 eBPF 程序直接卸载到网卡。以 NVIDIA BlueField-2 为例:

ip link set dev eth0 xdp obj xdp_synflood.o sec xdp offload

测试数据:CPU 占用几乎为 0,吞吐保持 14.88 Mpps。但硬件成本高,且需要网卡固件和驱动支持。对于大多数业务,XDP native 模式已经够用。

三种方案横向对比

  • 吞吐/PPS:DPDK ≈ SmartNIC > XDP native > netfilter
  • CPU 占用:SmartNIC 最低,XDP 次之,DPDK 最高
  • 部署复杂度:XDP 最简单,DPDK 复杂,SmartNIC 依赖硬件
  • 与业务共存:XDP 可在同一网卡上共存,DPDK 独占,SmartNIC 可共存
  • 成本:XDP 零成本,DPDK 需要独占核心,SmartNIC 硬件成本高

真实案例:800 万 PPS SYN Flood 的处置

某游戏服在轻云互联 10G 大带宽服务器上被 SYN Flood 打到 800 万 PPS。默认内核下 ksoftirqd 占满所有核心,SSH 卡死。我们加载 XDP 程序后,流量在驱动层被丢弃,CPU 从 100% 降到 15%,业务恢复正常。注意:如果攻击流量超过网卡线速(比如 15 Mpps 以上),XDP 也无力回天,这时必须靠上游清洗中心引流。

结论:大带宽服务器只是起点

大带宽服务器提供了吞吐上限,但 DDoS 防护的瓶颈往往在 PPS 和软中断。netfilter 适合策略,XDP 是性价比最高的本地清洗方案,DPDK 适合专用设备,SmartNIC 是未来方向。如果你的业务需要大带宽且希望本地具备 L3/L4 清洗能力,轻云互联的 10G 大带宽服务器配合 XDP 是一个值得考虑的起点。但记住:任何本地清洗都有上限,真正的 DDoS 防护是分层架构。