iptables-模块&规则记录

警告
本文最后更新于 2021-04-27 15:34,文中内容可能已过时。

recent模块

这个模块会将匹配的规则中,源IP地址写到一个列表中,还支持通过创建时间来匹配这个列表中的IP。 存储的内容在/proc/net/xt_recent/列表名称

--name name 指定一个列表名称 [!] --set 将数据包的源IP添加到列表中。如果源地址已经在列表中,则更新现有条目(比如时间戳)。

[!] --rcheck 检查当前规则中数据包的源IP,是否存在于指定的列表中

[!] --update 检查当前规则中数据包的源IP,是否存在于指定的列表中,如果存在,还会更新时间戳

[!] --remove 检查当前规则中数据包的源IP,是否存在于指定的列表中,如果存在,则会删除这个地址

[!] --seconds seconds * 此选项必须与--rcheck--update一起使用。

这个选项只会检查指定秒内的IP地址。

比如: --rcheck --seconds 10: 检查当前规则中数据包的源IP,是否存在于指定的列表中,这个IP必须是在10秒内被写入列表的

[!] --hitcount hits * 此选项必须与--rcheck--update一起使用。

要求接收到的数据包大于等于指定的次数(命中次数)。 比如: --rcheck --hitcount 3: 只有源IP,第三次(或以上)存在于列表中才会匹配成功

这个选项也可以结合--seconds选项是使用。 比如: --rcheck --hitcount 3 --seconds 10: 只有源IP,第三次(或以上)存在于列表中,并且是10秒内的,才会匹配成功

--rttl: * 此选项必须与--rcheck--update一起使用。

要求接收到的数据包TTL值和--set生效时设置的一样。

手动操作列表中的IP

1
2
3
4
5
6
7
8
# 将指定的IP添加到列表中
echo xx.xx.xx.xx > /proc/net/ipt_recent/DEFAULT

# 删除指定的IP
echo -xx.xx.xx.xx > /proc/net/ipt_recent/DEFAULT

# 清空列表
echo clear > /proc/net/ipt_recent/DEFAULT

模块本身参数的默认值:

ip_list_tot=100 每个列表保存的IP数量 ip_pkt_list_tot=20 每个ip的当前数据包计数(当前是第几个包) ip_list_hash_size=0 哈希表大小,0表示根据ip_list_tot计算,其默认值为512 ip_list_perms=0644 ip列表文件权限/proc/net/ipt_recent/* debug=0 设置为1,可以获得更多调试信息

修改方法:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
# 1.停止iptables(如果需要保存别忘记保存规则)
service iptables stop

# 2.移除xt_recent模块
modprobe -r xt_recent

# 3.修改参数 vim /etc/modprobe.d/xt_recent.conf
options xt_recent ip_list_tot=1000 ip_pkt_list_tot=60

# 4.加载xt_recent模块
modprobe xt_recent

# 5.检查配置参数
grep -r '.*' /sys/module/xt_recent/parameters/

# 6.启动iptables
service iptables start

使用示例:

eg1.每个IP只允许在5秒内建立2个基于tcp 80端口的连接

1
2
3
4
5
6
7
8
# 检查5秒内的ip列表中源IP是否存在2个
iptables -A INPUT -p tcp --dport 80 -m state --state NEW -m recent --name webpool --rcheck --seconds 5 --hitcount 2  -j DROP

# 放行NEW状态的数据包,并记录至ip列表
iptables -A INPUT -p tcp --dport 80 -m state --state NEW -m recent --name webpool --set -j ACCEPT

# 放行ESTABLISHED状态的数据包
iptables -A INPUT -p tcp --dport 80 -m state --state ESTABLISHED -j ACCEPT

eg2.在连接ssh前,先使用ping才能连接

1
2
3
4
5
6
7
8
# 匹配icmp请求包(包大小为29),并将源IP加入ip列表(sudo ping 192.168.10.150 -s 1)
iptables -I INPUT -p icmp --icmp-type 8 -m length --length 29 -m recent --name sshlogin --set -j REJECT --reject-with icmp-host-unreachable

# 允许10秒内存在于列表中的IP连接22端口
iptables -A INPUT -p tcp --dport 22 -m state --state NEW -m recent --name sshlogin --rcheck --seconds 10 -j ACCEPT

# 允许ESTABLISHED状态的ssh连接
iptables -A INPUT -p tcp --dport 22 -m state --state ESTABLISHED -j ACCEPT
请我喝杯水
SoulChild 微信号 微信号
SoulChild 微信打赏 微信打赏
0%