|
--fragment,中文是碎片之意。在一些网络接口上,经常会用到 MTU 这个参数对数据包的大小进行限制,该参数定义了可以通过的数据包的最大尺寸。如果一个数据包的尺寸大于这个参数时,系统会将这个数据包分成更小的数据包(IP 碎片)来传输,在接收方一边,会对这些 IP 碎片进行重组以还原整个数据包。这样会带来一个问题:当系统将大数据包划分成 IP 碎片传输时,第一个碎片中含有完整的包头信息(IP + TCP, UDP 和 ICMP),但后续的碎片只有包头的部分信息(如源地址,目的地址)。因此,检查后面的 IP 碎片的头部是不可能的。
假如有这样的一条规则:
- iptables -I FORWARD -p tcp -s 192.168.1.0/24 -d 192.168.2.100 --destination-port 80 -j ACCEPT
复制代码
假设这个 FORWARD 的策略为 DROP 时,系统会让第一个 IP 碎片通过,而余下的碎片因为包头信息不完整而无法通过。这个问题就可以通过 --fragment / -f 选项来解决,比如:
- iptables -A FORWARD -f -s 192.168.1.0/24 -d 192.168.2.100 -j ACCEPT
复制代码
iptables 的 man 手册中对 --fragment 是这样写的:
使用该选项,意味着规则仅适用于数据包中的第二个及后面的的碎片。
如果对该选项使用 ! 参数,那么就该规则就只匹配第一个碎片, 或是没有碎片的数据包。
|
|