iptables有很多扩展功能的patch,打上这些patch后可以支持许多扩展功能,就比如时间限制功能。如何使用这个功能?这也是曾经的一个面试题,一个朋友问过我,今天演示一下。
首先你的kernel要支持“time match”也就是iptables策略里可以通过时间的匹配规则。
我的操作系统的内核版本是2.6.32.22
1.查看内核是否支持
#cd /usr/src/linux
#make menuconfig 执行之后出现选择内核模块的界面,通过相应的菜单,选择需要加载的模块
1.2 Networking support -->>Networking Options -->>Network packet filtering framework -->>Core Netfilter Configuration ,如图所示
可以看的到默认是支持对时间的匹配功能的
2.1卸载系统默认用rpm包安装的iptables
卸载前我们先把iptables的启动脚本及脚本配置文件备份到/tmp目录
#cp /etc/init.d/iptables /tmp
#cp /etc/sysconfig/iptables-config /tmp
卸载iptables,在卸载时会存在包的依赖关系无法卸载
#rpm -e --nodeps iptables-ipv6 iptables iptstate
2.2接着编译安装iptables,用的iptables版本是1.4.20,写博文时是最新的iptables版本
#cd /usr/src
#tar jxvf iptables-1.4.20.tar.bz2
#cd iptables-1.4.20
#./configure --prefix=/usr --with-ksource=/usr/src/linux
#make
#make install
3.1 修改iptables启动脚本
首先将脚本跟配置文件复制到相应的目录然后再做修改
#cp /tmp/iptables-config /etc/sysconfig/
#cp /tmp/iptables /etc/init.d/
#chmod a+x /etc/init.d/iptables
#vim /etc/init.d/iptables 把所有/sbin/$IPTABLES替换为/usr/sbin/$IPTABLES 在vim命令模式下:%s@/sbin/$IPTABLES@/usr/sbin/$IPTABLES@g 然后保存退出
3.2 重新启动iptables
#service iptables restart
测试时间限制功能
首先查看两台主机的时间,由于截图的时间间隔,存在秒级别
主机名tomcat1的时间
主机名tomcat2的时间
当前的时间是2013年8月26日星期一20点06分左右,在tomcat2上去ping主机tomcat1
看到没有问题,网络是通的,icmp包都有返回响应
现在在tomcat1上,增加一条iptables策略
iptables -A INPUT -p ICMP --icmp-type 8 -m time --timestart 00:00:00 --timestop 23:59:59 --weekdays Mon -j DROP
限制在每个星期一的0点0分0秒到23点59分59秒这个时间段内,所有icmp协议报文的应答都会拒绝,8代表echo-reply,另外0代表echo-request。
注意:weekdays参数,很多文章写成days,但是days是无法被识别的,weekday的写法可以是数字1-7或者英文星期的缩写Mon-Sun。
再次从tomcat2上去ping主机tomcat1,18个包全部丢失,丢失率100%
如果在主机tomcat1上修改时间为2013年8月31日,iptables不变,如下图所示
主机tomcat2系统时间不变再次去ping主机tomcat1,可以ping通,说明没有被限制。
对于其它协议的时间限制方法也类似,利用time限制的功能可以按照时间段限制对端口的访问和协议的使用,在某些应用场景下还是很有用处的。