4、数据包标记技术:概率包标记(PPM)、确定性包标记(DPM)、ICMP溯源
说到DDoS溯源,很多人第一反应是“查IP”。但说实话,在真实攻击场景里,源IP基本都是伪造的。你查到的那个IP,大概率是某个被控的肉鸡,甚至是更下一层的跳板。
那怎么办?数据包标记技术就是干这个的。它的核心思路很简单:让路由器在转发包的时候,顺手留下自己的“签名”。这样即便源IP是假的,我们也能根据这些签名,一步步拼出攻击路径。
我最早接触这个技术是在一次金融行业的护网行动中。当时攻击流量从十几个省份涌进来,源IP每天都在变。我们用了概率包标记,硬是把攻击路径还原到了三个核心的C段。嗯,那次之后我就觉得,这技术虽然老,但真管用。
核心认知:数据包标记不是用来“阻止”攻击的,而是用来“定位”攻击源的。它解决的是“谁在打我”的问题,而不是“怎么挡住他”。
4.1 概率包标记(PPM)
PPM是最早被广泛研究的标记方案。它的原理很直接:每个路由器以一定的概率(比如1/20000)在IP包的标识字段里写入自己的地址信息。
你想想看,一个包从攻击源到目标,可能要经过几十跳。每个路由器都只有很小的概率去标记。但攻击者通常会发海量的包,只要包的数量够多,我们就能收集到足够多的标记,从而重建整条路径。
这里有个关键点:标记不是写完整地址,而是写“分片”。因为IP头里的标识字段只有16位,放不下一个完整的IP地址(32位)。所以PPM会把路由器地址拆成8个片段,每个包只带一个片段和它的偏移量。
// PPM标记格式(简化版)
// IP标识字段(16位)被重新利用:
// bit 0-3: 分片偏移(0-7,表示8个分片中的哪一个)
// bit 4-7: 距离(TTL相关,表示距离受害者多少跳)
// bit 8-15: 地址分片(8位,路由器地址的1/8)
重建的时候,受害者需要收集来自同一路径的多个标记,按偏移量拼回完整的路由器地址。我个人的经验是,至少需要收集到几百个来自同一跳的标记,才能比较确定地还原出那个路由器的地址。如果攻击流量不够大,PPM的效果会大打折扣。
实战技巧:PPM的标记概率不是越高越好。概率太高,后面的路由器就没机会标记了,路径信息会丢失。我一般建议把概率设在0.01%到0.1%之间,具体要看攻击流量的规模和路径长度。
4.2 确定性包标记(DPM)
PPM有个明显的短板:它依赖大量数据包来重建路径。如果攻击者只发少量包,或者流量被清洗设备截断了,PPM基本就废了。
DPM的思路完全不同。它只在网络的入口路由器(也就是流量刚进入网络的那个边界路由器)做标记。而且不是概率性的,是每个包都标记。
说白了,DPM不关心中间路径,它只关心“这个包是从哪个入口进来的”。对于大型ISP或数据中心来说,这往往就够了——因为攻击流量再花哨,也得从有限的几个入口进来。
我记得有一次帮一个云厂商做溯源方案,他们内部有几十个接入点。攻击流量从三个入口涌进来,但源IP一直在变。我们用DPM在边界路由器上打标记,不到五分钟就锁定了三个入口。然后直接在入口处做流量限速,攻击就解了。
| 对比维度 | PPM | DPM |
|---|---|---|
| 标记位置 | 沿途所有路由器 | 仅入口路由器 |
| 标记概率 | 概率性(如1/20000) | 确定性(每个包都标记) |
| 路径信息 | 完整路径 | 仅入口信息 |
| 所需包数量 | 大量(数千到数万) | 少量(几十个即可) |
| 适用场景 | 攻击流量大、需要完整路径 | 边界清晰、快速定位入口 |
注意:DPM要求所有入口路由器都支持标记,并且标记格式要统一。如果某个入口的路由器不支持,那从那里进来的攻击流量就溯源不到了。我曾经就踩过这个坑——部署的时候漏了一台老旧的Cisco路由器,结果那一路的攻击完全没被标记到。
4.3 ICMP溯源
ICMP溯源是另一种思路。它不修改数据包本身,而是利用ICMP协议的特性来“旁路”传递路径信息。
具体做法是:路由器在转发数据包时,以很低的概率(比如1/20000)向受害者发送一个ICMP消息。这个消息里包含了原始数据包的头部信息,以及当前路由器的地址。
受害者收到这些ICMP消息后,就能知道攻击流量经过了哪些路由器。这和PPM有点像,但信息是通过独立的ICMP包传递的,而不是嵌入在原始数据包里。
我个人觉得,ICMP溯源有个天然的优势:它不需要修改IP头的任何字段。这意味着它和现有的网络设备兼容性最好。你不需要升级路由器固件,不需要配置特殊的标记规则,只要路由器支持ICMP(基本都支持),就能用。
但缺点也很明显:ICMP包本身可能被防火墙或ACL过滤掉。我在一个客户现场就遇到过这种情况——他们内部的安全策略把ICMP全封了,结果ICMP溯源包一个都没到受害者手里。折腾了半天才发现是策略问题。
// ICMP溯源消息格式(RFC 792扩展)
// Type: 8(Echo Request)或自定义类型
// Code: 0
// 数据部分包含:
// - 原始IP头(20字节)
// - 原始数据前8字节
// - 路由器IP地址(4字节)
// - 时间戳(4字节,可选)
建议:ICMP溯源最好作为辅助手段,和PPM或DPM配合使用。比如用PPM做主要标记,ICMP做补充验证。这样即便ICMP包被过滤了,还有PPM的数据兜底。
4.4 三种技术的选型建议
说了这么多,到底该用哪种?我根据实际项目经验,给几个参考建议:
- 如果你有完整的网络控制权(比如自建数据中心),优先考虑DPM。它简单、高效,定位入口最快。
- 如果你需要完整攻击路径(比如做安全分析、取证),用PPM。它能还原每一跳,但需要足够的攻击流量。
- 如果你不想动现有网络设备,或者设备太老旧不支持标记,用ICMP溯源。兼容性最好,但可靠性最低。
- 最稳妥的方案:DPM + ICMP组合。DPM负责主要标记,ICMP做冗余和验证。
下面这张图展示了三种技术的核心流程对比,我画的时候尽量把逻辑关系理清楚了:
最后说一句:没有银弹。这三种技术各有优劣,选哪个取决于你的网络规模、设备能力、以及你到底想溯源到什么粒度。我个人的习惯是,先搞清楚“我要解决什么问题”,再选技术,而不是反过来。