通过对TOS的优化提高iptables防火墙性能
为了让Iptables对封包过滤规则更有效率,我们可以通过加载ipt_TOS模块来对各种类型的传输协议来做优化处理,从而来提高整体的性能。IP地址包大家都知道是各种封包的基础,而在IP地址封包的标头(header)的TOS(type-of-service)字段里面,则可以设置处理封包的执行效率。
IP地址封包标头的TOS字段由8位组成,可以由一个十六进制数来描述,在这8位里,分成两段,precedence(3个bit位)和TOS(4个bit位),和***一个保留位,该位通常为0。TOS的四个位分别来控制封包的:最小延时,***处理量,***可靠度和最小花费。这四个位只有一位是1。如果用十六进制来描述这四种状态的话,分别是0x10,0x08,0x04,0x02,如果四个位都是0,则表示正常运行,不做封包的特殊处理。更详细的信息请参考RFC1340和RFC1349。
不同的传输协议在封包的传输上由其不同的特性,比如telnet,http类型封包需要最小延迟控制;ftp类型封包需要最小延迟与***处理量控制;snmp类型封包需要***可靠度,而icmp则不需要做任何控制。为了让封包的传递能得到优化,当设置防火墙规则时,可以使用iptables的参数tos来对IP地址封包头的TOS字段做设置,以得到***的传输品质。
iptables中为在-j TOS --set-tos 后面接你想要的优化方式(参照iptables -j TOS -h),而在Ipchains中则是在-t后面接十六进制码,***个十六进制码会与IP地址封包头的TOS字段做AND运算,其处理结果会与参数-t后的第二个十六进制码再做XOR运算,***处理结果则写入IP地址封包头的TOS字段,用来控制封包传输优化.因此,如果要控制封包传输:最小延时,***处理量,***可靠度和最小花费等。早iptables中的设置可直接用iptables -j TOS -h里面得到的数字值。
比如我要优化telnet的TOS我可以用一下语句来进行。
- iptables -A PREROUTING -t mangle -p tcp --dport telnet -j TOS --set-tos Minimize-Delay
以下是iptables -j TOS -h 后得到的帮助中的可以使用的数字值
- TOS target v1.2.1a options:
- --set-tos value Set Type of Service field to one of the
- following numeric or descriptive values:
- Minimize-Delay 16 (0x10)
- Maximize-Throughput 8 (0x08)
- Maximize-Reliability 4 (0x04)
- Minimize-Cost 2 (0x02)
- Normal-Service 0 (0x00)
- iptables -A PREROUTING -t mangle -p tcp --dport telnet -j TOS --set-tos Minimize-Delay
- iptables -A PREROUTING -t mangle -p tcp --dport ftp -j TOS --set-tos Minimize-Delay
- iptables -A PREROUTING -t mangle -p tcp --dport ftp-data -j TOS --set-tos Maximize-Throughput
- iptables -A PREROUTING -t mangle -p tcp --dport www -j TOS --set-tos Minimize-Delay
- iptables -A PREROUTING -t mangle -p tcp --dport smtp -j TOS --set-tos Maximize-Throughput
- iptables -A PREROUTING -t mangle -p tcp --dport domain -j TOS --set-tos Maximize-Throughput
- iptables -A PREROUTING -t mangle -p udp --dport domain -j TOS --set-tos Minimize-Delay
- iptables -A PREROUTING -t mangle -p tcp --dport pop3 -j TOS --set-tos Minimize-Cost
接下来让我们来验证一下!
首先我在LINUX中telnet一个win2000服务器,这个win2000的服务器上安装了telnet服务,先在telnet服务管理器中,启动telnet服务。其中LINUX的IP是192.168.55.55,win2000 Server的IP是192.168.10.7。
首先对mangle表不做任何设置,采用系统默认值,也就是说对TOS不做任何改变,得到的结果如图1:
可以看出,Type of service的值为0,因为mangle中默认是不做改变的。
接下来我们要在LINUX的 mangle表中加点东西:
首先我们要装TOS模块,执行modprobe ipt_tos就行了,然后执行
- iptables -A OUTPUT -t mangle -p tcp --dport telnet -j TOS --set-tos 0x10
到这里,你是不是有点奇怪呢?明明在上文中规则都是加在mangle 表中的PREROUTING 链,到这里怎么变成加在OUTPUT链呢?注意上边的实验环境,的确如此,如果你加在PREROUTING,又按照上边的环境实验的话,得到的结果Type of service仍然是0。原因很简单,回顾一下,包在iptables中的流程(那个流程图非常重要,他是数据包的路标)就明白。因为我们是从linux中telnet到win2000 server,这个包是从本地发出的, 所以首先经过的是mangle中的OUTPUT,而不是PREROUTING了。
这个时候看下mangle表,iptables -L -t mangel
结果如下:
- Chain OUTPUT(policy ACCEPT)
- Target port opt sourece destination
- TOS tcp -- anywhere anywhere tcp dpt:telnet TOS set Minimize-Delay
然后再telnet到win2000上,抓包结果见图2:
这次IP包中的Type of service的值是不是已经变成了0x10,即十进制16了?iptables的基础知识-TOS优化提高防火墙性能就讲到这里了。
上一节:iptables规则 下一节:iptables中的limit 的试验
【编辑推荐】