通过iptables的recent模块实现服务器的动态访问控制

2014-09-29 • 技术文章评论

模块介绍

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

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

利用ping命令实现SSH动态开放

1
2
3
4
5
6
7
8
9
10
11
12
# 当包走完INPUT链而没被拿走时就会丢弃掉
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
# icmp类型8是ping包;指定包大小为128字节;recent用的列表名称为SSHOPEN,列表记录源地址。符合上述条件的数据包都接收。如果ping包内容为100字节,则加上IP头、ICMP头的28字节,总共128字节。
iptables -A INPUT -p icmp --icmp-type 8 -m length --length 128 -m recent --set --name SSHOPEN --rsource -j ACCEPT
# 接受一般的ping包
iptables -A INPUT -p icmp --icmp-type 8 -j ACCEPT
# 对连接ssh 22端口的连接进行处理,来源于SSHOPEN源地址列表并且在列表时间小于等于15秒的放行
iptables -A INPUT -p tcp --dport 22 -m state --state NEW -m recent --rcheck --seconds 15 --name SSHOPEN --rsource -j ACCEPT

实现连接限制

1
2
3
# 1小时内只允许连接5次
iptables -A INPUT -p tcp --dport 22 -m state --state NEW -m recent --name SSHPOOL --rcheck --seconds 3600 --hitcount 5 -j DROP
iptables -A INPUT -p tcp --dport 22 -m state --state NEW -m recent --name SSHPOOL --set -j ACCEPT

参考资料

http://www.cszhi.com/20120510/iptables-modules-recent.html