一 前言
本文对linux的IP组装算法进行了分析,因为IP碎片经常用于DOS等攻击,在文章后面我结合了一些攻击方法进行了更进一步的说明。内核主要参考版本是2.2.16,另外简要的介绍了2.4.0-test3中的一些变化.
二 目录
1- 概述
2- 关键数据结构
3- 重要函数说明
4- 2.4系列的变化
5- 常见碎片攻击
1. 概述
在linux源代码中,ip分片重组的全部程序几乎都在都在\net\ipv4\ip_fragment.c文件中。其对外提供一个函数接口ip_defrag()。其函数原型如下:
struct sk_buff *ip_defrag(struct sk_buff *skb)
众所周知,网络数据报在linux的网络堆栈中是以sk_buff的结构传送的,ip_defrag()的功能就是接受分片的数据包(sk_buff),并试图进行组合,当完整的包组合好时,将新的sk_buff返还,否则返回一个空指针。
此函数在其他文件中的调用如下:
ip层接收主函数为ip_rcv()(\net\ipv4\ip_input.c),任何IP包都需经过此函数处理。如果此包是发往本机,则调用ip_local_deliver()函数(\net\ipv4\ip_input.c)进行处理,一般的系统碎片只有在到达最终目的的时候才进行重组(尽管在传输过程中可能被进一步分成更小的片)。在ip_local_deliver()中我们可发现如下代码:
if (sysctl_ip_always_defrag == 0 && /*编译时未设置提前组装*/
(iph-〉frag_off & htons(IP_MF|IP_OFFSET))) { /*判断是否是分片包*/
skb = ip_defrag(skb); /*条件满足,进行组装*/








