我刚刚尝试添加一个新的 fail2ban 规则,该规则应该扫描 Apache2 错误日志以查找可疑的文件访问尝试(尝试访问三个不存在的常见登录 URL 的人通常没有良好的意图)。
为此,我在 jail.local 文件中添加了一条新规则:
[apache-suspiciousfiles]
enabled = true
port = http,https
filter = apache-suspiciousfiles
banaction = iptables-allports
action = %(action_mwl)s
logpath = /var/log/apache2/error*.log
maxretry = 3
然而,这在我的日志中出现了一条意外的错误消息:
2014-02-10 13:28:51,450 fail2ban.jail : INFO Jail 'apache-suspiciousfiles' started
2014-02-10 13:28:51,690 fail2ban.actions.action: ERROR iptables -N fail2ban-apache-suspiciousfiles
iptables -A fail2ban-apache-suspiciousfiles -j RETURN
iptables -I INPUT -p tcp -j fail2ban-apache-suspiciousfiles returned 200
在此之前,我已经使用 fail2ban-regex 检查过过滤器,因此我很确定那里面没有东西。
(注:这是“退回 200”。很多人似乎对 100 有疑问,但这是关于200)
答案1
我快速地在谷歌上搜索了一下,似乎没有任何答案能帮助我,所以我只是尝试了首先想到的办法:
我重命名了该规则并使其名称更短:
[apache-suspicious]
enabled = true
port = http,https
filter = apache-suspicious
banaction = iptables-allports
action = %(action_mwl)s
logpath = /var/log/apache2/error*.log
maxretry = 3
(我将规则从 apache-suspiciousfiles 重命名为 apache-suspicious)
这确实对我有帮助。现在一切都正常启动,我的规则也开始起作用了。
答案2
如果您的配置同时产生“多端口”和“全部”,也会发生这种情况(“全部”可用于解决从 tcp 到 udp 的机器人切换问题,这会在日志中填充“警告:...已被禁止”)。
$ sudo iptables -I INPUT -p all -m multiport --dports ssh -j fail2ban-ssh
iptables: multiport needs `-p tcp', `-p udp', `-p udplite', `-p sctp' or `-p dccp'
$ echo $?
2
$ cat fail2ban.log
iptables -I INPUT -p all -m multiport --dports ssh -j fail2ban-ssh returned 200
答案3
对我来说,200 是因为无法解析发送到 iptables 的 action.d 规则。
我的 iptables action.d 规则如下
[Definition]
actionstart = iptables -N fail2ban-<name>
iptables -A fail2ban-<name> -j RETURN
iptables -I INPUT -p <protocol> --dport <port> -j fail2ban-<name>
##comments and more actions removed for brevity
[Init]
name = default
#port = ssh
protocol = any
注意我的端口变量是如何被注释掉的!我不知道 iptables 会输入什么,我假设它会是空白的。无论它的值是什么,它都不会是 iptables 可以理解的已知端口。
我必须编辑我的规则以删除 --dport 位,因为我实际上并不打算传递端口,然后就可以加载而不会导致它返回 200。
答案4
就我的情况而言,我的规则名称足够短,但 200 错误仍然存在。
我的错误是试图用一个iptables[]
操作禁止多个端口,但该操作只对单个端口有效。一旦我将操作改为使用iptables-multiport[]
,错误就停止了:
action = iptables[name=HTTPD, port="http,https", protocol=tcp] # < bad
action = iptables-multiport[name=HTTPD, port="http,https", protocol=tcp] # < good
错误停止了。