假设我有以下规则:
iptables -P INPUT DROP
iptables -P FORWARD ACCEPT
iptables -P OUTPUT ACCEPT
iptables -A INPUT -m conntrack --ctstate RELATED,ESTABLISHED -j ACCEPT
iptables -A INPUT -p tcp -m conntrack --ctstate NEW -m tcp --dport 22 -m recent --set --name counting1 --rsource
iptables -A INPUT -m recent --update --seconds 60 --hitcount 2 --name counting1 --rsource -j LOG --log-prefix "SSH ataque "
iptables -A INPUT -m recent --update --seconds 60 --hitcount 2 --name counting1 --rsource -j RETURN
-A INPUT -j ACCEPT
我已经阅读了手册,但我仍然不明白在什么情况下是首选--rcheck 还是--update 选项......更新是否意味着命中次数重置为 0 并重新启动(如上例所示) 60 秒?
请记住,这些规则只是为了揭示这个问题的例子。
答案1
来自 iptables 的手册页:
[!] --rcheck
Check if the source address of the packet is currently in the
list.
[!] --update
Like --rcheck, except it will update the "last seen" timestamp
if it matches.
因此,使用update
不会重置命中次数,它将(重新)设置最后看到的时间戳。关于 ,有以下说明--seconds
:
--seconds seconds
This option must be used in conjunction with one of --rcheck or
--update. When used, this will narrow the match to only happen
when the address is in the list and was seen within the last
given number of seconds.
这意味着使用--rcheck
会使规则每次只匹配规则中指定的时间间隔(例如--seconds
),而使用--update
如果在间隔期间遇到匹配的数据包,则会延长匹配规则的时间间隔。
因此,如果每 45 秒有一个匹配的数据包,则问题中显示的示例规则将继续记录数据包并从链中返回。另一方面,如果--rcheck
已使用,则每个第二个数据包都不会匹配(因为两个匹配数据包的 60 秒间隔已过期)。
答案2
没有测试过——但是看着来源,我怀疑这个例子是这样工作的:
--set
添加IP地址并增加命中次数;- 第一个“LOG”
--update
检查 hitcount 是否为 2 或更多并增加它,如果是的话; - 接下来“RETURN”
--update
再次测试如果匹配,则再次增加。
因此对于任何新的匹配数据包:
- 如果之前没有命中——我们就通过,并且命中数增加到 1;
- 如果最近有 1 次命中 -- 我们停止,并且命中数增加 3 并变为 4。
另一方面,--rcheck
不会增加命中次数,因此它只会增加--set
一次,然后通过以下每个规则进行检查:
- 对于之前没有匹配的内容 -- 与之前相同;
- 对于一次先前的命中 - 设置增加最近命中数,然后我们停止;结果最近命中数为 2。
综上所述——我可能会这样说:
- 使用
--set
后--update
或者--rcheck
; - 用于
--rcheck
LOG 规则; - 用于
--update
DROP/ACCEPT/RETURN 规则。
希望有所帮助。