iptables模块介绍:recent

recent模块可以看作iptables里面维护了一个地址列表,这个地址列表可以通过”–set”、”–update”、”–rcheck”、”–remove”四种方法来修改列表,每次使用时只能选用一种。还可附带”–name”参数来指 定列表的名字(默认为DEFAULT),“–rsource”、“–rdest”指示当前方法应用到数据包的源地址还是目的地址(默认是前者)。

recent语句都带有布尔型返回值,每次执行若结果为真,则会执行后续的语句,比如“-j ACCEPT”之类的。

对于实现前面提到的功能,还需要额外的参数。“–second”限制包地址被记录进列表的时间要小于等于后面的时间。另外,还有”–hitcount”、”–rttl”,显然是可以有其他高级的play。

基于上面的说明,现在来看四个基本方法的作用:
–set将地址添加进列表,并更新信息,包含地址加入的时间戳。–rcheck检查地址是否在列表。–update跟rcheck一样,但会刷新时间戳。–remove就是在列表里删除地址,如果要删除的地址不存在就会返回假。

例:
#限制无法ssh直接连接服务器,需先用较大包ping一下,此时在15秒内才可以连接上:

1
2
3
4
5
6
iptables -P INPUT DROP
iptables -A INPUT -s 127.0.0.1/32 -j ACCEPT
iptables -A INPUT -m state --state RELATED,ESTABLISHED -j ACCEPT
iptables -A INPUT -p icmp --icmp-type 8 -m length --length 128 -m recent --set --name SSHOPEN --rsource -j ACCEPT
iptables -A INPUT -p icmp --icmp-type 8 -j ACCEPT
iptables -A INPUT -p tcp --dport 22 -m state --state NEW -m recent --rcheck --seconds 15 --name SSHOPEN --rsource -j ACCEPT

说明:
\1. 将INPUT链默认策略置为DROP,当包走完INPUT链而没被拿走时就会丢弃掉;
\2. 本地localhost的包全部接受;
\3. 对于已建立连接或是与已连接相关的包都接受,服务器对外连接回来的包一般都走这条;基本环境已经配好了,现在开始要为连接到服务器的ssh打开通路。
\4. icmp类型8是ping包;指定包大小为128字节;recent用的列表名称为SSHOPEN,列表记录源地址。符合上述条件的数据包都接收。如果ping包内容为100字节,则加上IP头、ICMP头的28字节,总共128字节。
\5. 接受一般的ping包;
\6. 对连接ssh 22端口的连接进行处理,来源于SSHOPEN源地址列表并且在列表时间小于等于15秒的才放行。

测试:
无法ssh直接连接服务器,使用“ping -l 100 服务器ip ”后,15秒内就可以ssh连接服务器了。

#限制每ip在一分钟内最多对服务器只能有8个http连接

1
2
3
iptables -I INPUT -p tcp --dport 80 -d 199.15.25.116 -m state --state NEW -m recent --name httpuser --set
iptables -A INPUT -m recent --update --name httpuser --seconds 60 --hitcount 9 -j LOG --log-prefix 'HTTP attack: '
iptables -A INPUT -m recent --update --name httpuser --seconds 60 --hitcount 9 -j DROP

说明:
199.15.25.116是服务器ip

\1. -I,将本规则插入到 INPUT 链里头的最上头。只要是 TCP连接,目标端口是80,目标 IP是我们服务器的IP,刚刚新被建立起来时,我们就将这个联机列入 httpuser 这分清单中;
\2. -A,将本规则附在 INPUT 链的最尾端。只要是60秒内,同一个来源连续产生多个联机,到达第9个联机时,我们对此联机留下Log记录。记录行会以 HTTP attack 开头。每一次的本规则比对, –update 均会更新httpuser清单中的列表;
\3. -A,将本规则附在 INPUT 链的最尾端。同样的比对条件,但是本次的动作则是将此连接丢掉;
\4. 所以,这三行规则表示,我们允许一个客户端,每一分钟内可以接上服务器8个。具体数值可以看管理者决定。这些规则另外也可以用在其它对外开放的网络服务上,例如 port 22 (SSH), port 25 (smtp email)。

#对连接到本机的SSH连接进行限制,每个IP每小时只限连接5次

1
2
-A INPUT -p tcp --dport 22 -m state --state NEW -m recent --name SSHPOOL --rcheck --seconds 3600 --hitcount 5 -j DROP
-A INPUT -p tcp --dport 22 -m state --state NEW -m recent --name SSHPOOL --set -j ACCEPT

参考:
http://linux.ccidnet.com/art/737/20060705/596661_1.html
http://www.sudu.cn/info/html/edu/20070102/296328.html
http://shiverfalcon.blog.51cto.com/245825/406236
http://blog.nelson10.info/2012/03/17/module_recent_in_iptables.html
http://www.cnblogs.com/hiloves/archive/2011/07/19/2109899.html
http://www.libertyvps.com/thread-44-1-1.html