先给结论:IP 分片攻击是利用 IPv4 数据包分片与重组过程制造安全问题的攻击方式。防御重点不是盲目禁止所有分片,而是识别异常偏移、重叠分片和超量分片,并在主机、防火墙与 CDN 层分别限制。
如果你正在排查服务器异常流量,可以继续阅读 VPS DDoS 防护指南,并结合 Linux SSH 安全加固 一起检查入口暴露和日志。
IP 分片本身不是攻击,它是网络协议为了适配不同链路最大传输单元(MTU)而设计的一个机制。一个 IP 包太大,中间路由器就把它切成几个小包继续传。问题出在分片可以被滥用——攻击者故意构造异常的分片包,让目标主机在重组时崩溃、占满内存,或者绕过基于包内容的防火墙规则。
分片攻击类型对比
| 类型 | 原理 | 危害 |
|---|---|---|
| Tiny Fragment | 把 TCP 头分到极小分片 | 绕过防火墙检测 |
| Overlapping Fragment | 分片重叠覆盖 | 绕过 ACL 规则 |
| Teardrop | 恶意偏移量 | 老系统崩溃蓝屏 |
IP 分片是怎么工作的
当一个 IP 包超过下一跳链路的 MTU 时,路由器会把它拆成多个分片。每个分片都有自己的 IP 头,携带以下关键字段:
- 标识(Identification):同一个原始包的所有分片这个值相同
- 标志(Flags):More Fragments 位表示后面还有没有分片
- 片偏移(Fragment Offset):当前分片在原始包中的位置
接收端收到所有分片后,按偏移排序重组。这个重组过程需要占用内存和 CPU,攻击者就盯着这里做文章。
常见的 IP 分片攻击类型
泪滴攻击(Teardrop Attack)
攻击者发送偏移重叠的分片包。比如第一个分片说占 0-100 字节,第二个又说占 50-150 字节。操作系统重组时指针重叠,老的系统会蓝屏或崩溃。现代内核已经修复了这个漏洞,但概念上它是最经典的 IP 分片攻击。
微小分片攻击(Tiny Fragment Attack)
攻击者把 TCP 头切得只剩几个字节,藏到第一个分片里,然后把真正的载荷放到后面的分片。某些只检查第一个分片的防火墙会漏掉载荷里的恶意内容。
分片重叠 / 分片耗尽
发送大量不完整、重叠或顺序错乱的分片,让目标主机一直缓存等待重组,最终内存耗尽、连接表被占满。
Ping of Death
虽然和 ICMP 关系更大,但本质也是 oversized packet 的分片重组问题。发送超过 65535 字节的 ICMP echo 请求分片,老的系统处理不了会崩溃。
为什么这些攻击有效
分片重组是操作系统协议栈里比较复杂的部分。为了支持分片,系统必须:
- 为每个待重组的流保留内存缓冲区
- 处理超时(等不到后续分片时要释放)
- 处理重叠、顺序错乱等边界情况
每一步都是潜在的攻击面。而防火墙为了性能,有时只对第一个分片做深度检测,后面的分片放行,这就给了绕过检测的机会。
防御方法
1. 限制或禁用分片重组
如果业务不需要处理大量分片,可以在边界路由器或防火墙上限制分片速率。Linux 内核本身也支持:
sysctl -w net.ipv4.ipfrag_low_thresh=196608
sysctl -w net.ipv4.ipfrag_high_thresh=262144
sysctl -w net.ipv4.ipfrag_time=30
这些参数控制分片缓冲区的内存上限和超时时间,避免内存被无限占用。
2. 防火墙正确处理分片
iptables 的分片处理规则:
iptables -A INPUT -f -j DROP
这条规则丢弃所有后续分片(非首片),简单粗暴但可能影响正常业务。更稳妥的是用连接跟踪让防火墙能看到重组后的包:
iptables -A INPUT -m conntrack --ctstate INVALID -j DROP
iptables -A INPUT -m conntrack --ctstate ESTABLISHED,RELATED -j ACCEPT
3. 使用现代内核
泪滴、Ping of Death 这类古老漏洞在现代 Linux/Windows 内核里已经修好了。保持系统更新是最有效的防御。
4. 网络层清洗
对于大流量的分片攻击,靠单台服务器扛不住。需要上游 ISP 或 CDN 做流量清洗,把异常分片在到达服务器前过滤掉。
实战排查
如果你怀疑正在遭受 IP 分片攻击,可以用 tcpdump 抓包看:
tcpdump -nn -i eth0 ip[6:2] & 0x2000 != 0 or ip[6:2] & 0x1fff != 0
这条命令过滤出有 More Fragments 标志或者片偏移非零的包。如果短时间内这种包暴增,说明有人在玩分片。
看 /var/log/kern.log 或 dmesg 也能发现端倪:
dmesg | grep -i frag
dmesg | grep -i "out of memory"
更多网络安全教程,请访问 fenij.com。
常见问题
问:IP 分片攻击现在还常见吗?
答:像 Teardrop、Ping of Death 这种老攻击已经很少能得手了,因为现代系统都打了补丁。但分片仍然是绕过防火墙和消耗系统资源的一种手段,在针对性攻击中仍会出现。
问:为什么防火墙会怕分片?
答:传统防火墙只看每个包的内容。如果一个 TCP 包被分成 10 个分片,防火墙只看到 10 个 IP 分片,不一定能还原出完整的 TCP 载荷,规则就可能失效。
问:完全禁止分片行不行?
答:不行。互联网中不同链路的 MTU 不一样,有些路径必须经过分片才能传输。正确的做法是限制异常分片、用连接跟踪做状态检测,而不是一刀切。