【译文】游戏程序员的 XDP

💡 原文中文,约11000字,阅读约需27分钟。
📝

内容提要

未来10年内,每人拥有10GBps互联网,改变游戏制作方式。XDP/eBPF技术成熟,可被普通人使用。XDP是快速数据路径方法,可在数据包发出前调用函数。eBPF是在Linux内核中编译、链接和运行XDP程序的技术。XDP可用于数据包丢弃、修改、转发等操作,保护游戏服务器免受DDoS攻击。XDP还可用于网络加速和加密。

🔎

延伸解读

XDP 与 DPDK 的关键区别

文章指出,使用 DPDK 等内核旁路技术时,通常需要安装第二个网卡或实现完整的 TCP/IP 协议栈,以确保网卡能处理其他网络任务。而 XDP 允许将特定流量(如发往 40000 端口的 IPv4 UDP 包)交给 XDP 程序处理,其余数据包仍由 Linux 内核常规处理。这种选择性旁路降低了部署复杂度,更适合游戏服务器场景。

eBPF 验证器带来的实际限制

由于 eBPF 函数在内核中运行,必须通过验证器确保不会崩溃或越界。文章提到,验证器要求程序“固定”地从左到右处理数据包,难以读取数据包末尾的字节;同时,向 kfunc 传递数据包大小时,只能使用常量大小,无法传递实际动态长度。这些限制影响了 XDP 程序的灵活性,作者希望未来内核版本能改进。

从白名单到中继的 DDoS 缓解思路

文章展示了多层防御:先用哈希编码过滤随机 UDP 包,再通过 BPF Maps 维护 IP 白名单,只允许已知地址通信。若攻击规模仍大,可在游戏服务器前部署中继器,隐藏真实 IP,并只转发通过白名单和哈希检查的有效数据包。作者建议结合序列号防重放和每客户端速率限制,形成更可靠的系统。

XDP 加密与内核模块的协作

为了在 XDP 中实现加密,作者没有直接编写加密原语,而是通过自定义内核模块导出 kfunc,并利用 BTF 注释参数,让 BPF 验证器认可安全性。这样 XDP 程序可以调用内核模块中的 sha256 等函数。但受验证器限制,只能对数据包前 256 字节等常量部分进行哈希,无法处理整个动态数据包。

❓

Q&A

XDP技术是什么,它的主要功能是什么?

XDP是快速数据路径技术,可以在数据包发出前调用函数,主要用于丢弃、修改和转发数据包。

如何在Ubuntu 22.04上设置eBPF/XDP?

需要更新内核到6.5版本,并安装必要的软件包,如libcurl3-gnutls-dev、build-essential等。

XDP如何帮助保护游戏服务器免受DDoS攻击?

XDP可以通过丢弃不匹配的数据包和维护IP地址白名单来保护游戏服务器,减少DDoS攻击的影响。

eBPF的作用是什么,它如何与XDP相关联?

eBPF是扩展伯克利数据包过滤器,允许在Linux内核中编译和运行XDP程序,是实现XDP的基础技术。

XDP程序如何处理数据包?

XDP程序可以丢弃、修改数据包,或将其下传给内核进行常规处理,灵活应对不同的网络需求。

XDP如何实现网络加速?

XDP通过优化数据包处理流程,减少延迟和丢包率,从而改善玩家的网络性能。

🏷️

标签

➡️

继续阅读