UDP 攻击怎么防御?游戏服务器必看
做游戏的基本都碰过 UDP 攻击。它比 TCP 攻击更难防,因为 UDP 协议本身没有握手验证。
为什么 UDP 容易被攻击
UDP 是无连接协议——发出去就不管了,不确认对方收没收到,也不验证源 IP 是不是真的。
这个设计让 UDP 很快(适合游戏),但也带来两个致命问题:
- 源 IP 可以随意伪造。攻击者可以伪造成你的 IP,让别人的服务器把响应发给你。
- 没有连接状态。防护设备无法通过「握手是否完成」来区分正常流量和攻击流量。
三种常见的 UDP 攻击
1. UDP Flood
最直接:向目标端口灌大量 UDP 包。服务器收到包要检查端口、要回复 ICMP「端口不可达」,这些都要消耗资源。
量级可以很大,几百 G 很常见。
2. UDP 反射放大
这是最阴的一种。攻击者伪造你的 IP,向 DNS、NTP、Memcached、SSDP 这些服务发小请求,这些服务会把大响应发给你。
| 协议 | 请求大小 | 响应大小 | 放大倍数 |
|---|---|---|---|
| DNS | 60 B | 3000 B | ~50x |
| NTP (monlist) | 8 B | 440 B | ~55x |
| SSDP | ~100 B | ~500 B | ~5x |
| Memcached | 15 B | 最高 1 MB | ~50000x |
攻击者只需要 2Gbps 的上传带宽,就能打出 100Gbps 的效果。
3. 游戏协议层攻击
这类最专业:攻击者先逆向你的游戏协议,然后伪造合法的游戏包发送。
特点是防护设备看起来完全正常——包格式对、端口对、大小对,只是内容是恶意的。
怎么防
第一层:隐藏源站 IP
这是最有效的。UDP 反射放大需要知道你的 IP 才能打。如果客户端连的是节点,源站 IP 不暴露,攻击者连目标都找不到。
第二层:协议白名单
只允许符合游戏协议格式的 UDP 包通过。垃圾包、反射包的特征通常和游戏协议不符,直接丢弃。
这一层能挡掉 90% 的 UDP Flood 和几乎全部反射放大。
第三层:会话校验
客户端接入时先做一次握手(类似 TCP 的三次握手,但在应用层实现),拿到会话令牌后才允许发数据包。
这样伪造的包因为拿不到令牌,直接被丢弃。
第四层:速率限制
按会话限制发包速率。正常游戏客户端的发包频率是稳定的(比如 20-60 包/秒),超过这个范围就是异常。
游戏服务器加固清单
- 关掉不必要的 UDP 端口。只开游戏必需的,其他全部关掉。很多攻击是扫端口扫出来的。
- 源站防火墙只放行防护节点。除了清洗中心的回源 IP,其他一律拒绝。
- 禁用 UDP 反射服务。如果服务器上跑了 DNS、NTP、SNMP 服务,检查是否对外开放,该关的关掉。
- 限制 ICMP 响应。避免被用来做放大攻击的跳板。
- 监控异常流量。按端口统计入向包速率,超过基线就告警。
一个容易忽略的点
很多人以为「我的游戏用的是自定义 UDP 协议,别人伪造不了」。
实际上,只要有客户端在跑,协议就能被逆向。抓包分析、反编译客户端,有经验的人一两天就能搞清楚协议格式。
所以别指望「协议保密」当防护。真正的防护是会话校验 + 行为分析,让攻击者即使知道协议格式,也拿不到有效会话。
小结
UDP 攻击难防,本质是因为协议本身没有验证机制。所以防护的重点不是「识别攻击流量」(很难),而是:
- 让攻击者找不到目标(隐藏源站 IP)
- 让伪造的包过不了校验(会话令牌)
- 让异常速率被限制(按会话限速)
游戏场景的完整防护方案,可以看 游戏盾是什么。