Linux 2.6.11.x上使用Netfilter Time Match遇到的问题
最近在学习netfilter,在www.netfilter.org上看到有个time的match可以进行时间匹配,所以打算给机器加个ipt_time patch,我的操作步骤如下:
相关软件版本:Kernel 2.6.11.10,patch-o-matic-20050519,iptables 1.3.1
Kernel source 放在 /usr/src/linux
Iptables source 放在 /usr/src/iptables
# cd /usr/src/linux
# make menuconfig (生成了.config)
# tar -jxvf patch-o-matic-20050519.tar.bz2
# cd patch-o-matic-20050519
# export KERNEL_DIR=/usr/src/linux
# export IPTABLES_DIR=/usr/src/iptables
# ./runme time
# cd /usr/src/linux
# make menuconfig (加上TIME MATCH)
# make
# make modules_install
# cp arch/i386/boot/bzImage /boot/kernel-2.6.11.10-time
# cd /usr/src/iptables
# make KERNEL_DIR=/usr/src/linux
# make install
重新启动系统后可以看到:
ip_tables: (C) 2000-2002 Netfilter core team
ipt_time loading
登录进入系统清空所有iptables规则,然后执行:
iptables -A INPUT -p icmp -m time --timestart 14:20 --timestop 14:21 -j REJECT
这时在另外一台机器 ping 该机(ip为 192.168.0.123),当机器时间到达 14:20 的时候依然可以ping通,一直到了 14:23 分还是一样(照理在 14:20:00 至 14:21:59 这个时间段都应该ping不通)。
似乎ipt_time没有起作用?
在网上搜索了很久也没有找到相关的信息,苦思了接近一天的时间,最后终于找到了原因。
time match的代码位于:/usr/src/linux/net/ipv4/netfilter/ipt_time.c
long int tm_gmtoff; /* we don't care, we count from GMT */
const char *tm_zone; /* we don't care, we count from GMT */
原来是与timezone有关,看来这个patch还没有实现自动处理timezone的功能,它的所有计时都是从GMT时间开始的,而我的timezone是Asia/Chongqing 即 GMT+8。后来把timezone改成了GMT就工作正常了。
如果不改timezone也可以把原来的规则中的时间改成GMT时间,即-8:
iptables -A INPUT -p icmp -m time --timestart 6:20 --timestop 6:21 -j REJECT
现在就一切正常了,time match的确不错,非常实用的功能 ^_^