- 论坛徽章:
- 0
|
争对IP碎片,通常的理解是将一个过大的UDP或者ICMP包(大于1472),在通过IP层传递到数据链路层的时候,因为大于MTU,比如以太网的1500(这个1500是IP首部加UDP首部在加数据的总大小),从而在IP层上将上层传来的数据分成N份,每份分别封装在一个IP头中进行传递。这时有多个IP数据包承载一个UDP或者ICMP的数据报,这些IP包拥有相同的标识数字,并且除了最后一个分片MF标志字段为0外其它的分片MF标志字段均为1。因为上层数据被分片,这时除了第一个分片的IP数据字段中包含了上层数据的信息(因为UDP或者ICMP头部只在第一个分片中),所以后续的分片就不在包含上层的信息。
抱歉说了这么多废话,这些是我对IP碎片的理解,也不晓得有没有错,如果有错误那我想不通就很正常了。
以下是我的问题了。先构建一个网络路由:三台机子,A,B,C,其中B装RH8,充当路由器和包过滤防火墙,分别连接两个主机A,B,均安装2000,A的地址是192.168.0.1,B是192.168.1.1。环境按照我对IP碎片的理解,那么就有这么个问题。除了第一片的其它分片不包含上层信息,那么如果我刻意发送大的报文(比如从192.168.0.1 ping 192.168.1.1 -l 65535 ),那么这个报文将被分片,如果这些IP碎片在通过包过滤防火墙的时候,如果不设置允许IP碎片通过,(比如iptables -A FORWARD -p icmp --icmp-type 8 -s 192.168.0.1 -d 192.168.1.1 -j ACCEPT;iptables -A FORWARD -m -state --state ESTABLISHED,RELATED -j ACCEPT;iptables -P FORWARD DROP)那么就只有第一片能够通过,因为其包含了完整的上层信息,说明这个包是从192.168.0.1到192.168.1.1的icmp request包,即icmp类型8 ,而后续的包不包含这个信息,过应该被过滤。这时后通过的第一个包到到C,因为是分片的包,所以C将其缓存并等待后续的包,但后续的包以被过滤,所以当等待一段时间后,超时,这时候C会将包丢弃,故A不会得到C得响应,应该得到timed out的数据显示。
如果要让碎片能够通过,可以在iptables 中加上-f的选项,让后续包通过,这时应该得到响应。
以上是我根据理论推出的。但是实际试验中,我发现没有允许碎片的时候A依然可以得到C的响应,所以万分疑惑。希望各位大虾指点。小弟是网络的初学者,希望得到大家的帮助。 |
|