我的 Centos 服务器上运行着 Fail2Ban。(配置如下)
在我的var/日志/消息我注意到一些非常奇怪的事情:
Jun 19 12:09:32 localhost fail2ban.actions: INFO [postfix] 114.43.245.205 already banned
我配置了 Fail2Ban 以将被禁止的 IP 添加到 iptables。
我的jail.conf:
[postfix]
enabled = true
filter = postfix
action = iptables
port = smtp,ssmtp
filter = postfix
logpath = /var/log/maillog
bantime = 43200
maxretry = 2
我的postfix.conf:
[INCLUDES]
before = common.conf
[Definition]
failregex = reject: RCPT from (.*)\[<HOST>\]: 550 5.1.1
reject: RCPT from (.*)\[<HOST>\]: 450 4.7.1
reject: RCPT from (.*)\[<HOST>\]: 554 5.7.1
reject: RCPT from (.*)\[<HOST>\]: (.*)@yahoo.com.tw
ignoreregex =
我的问题是,已经被阻止的人怎么还能iptables
连接到服务器?
答案1
另一个答案中推荐的 recidive jail 并没有为我解决这个问题。不过,我最终解决了这个问题,所以这是我的方法,希望它能对其他人有所帮助。
Fail2ban 默认仅通过 TCP 进行阻止。至少在我的设置中,我注意到当机器人返回尝试通过 UDP 阻止端口时,会出现“已被禁止”的消息。
要解决此问题,请告诉 Fail2ban 通过所有协议(而不仅仅是 TCP)阻止端口。您需要在/etc/fail2ban/jail.conf并在[Init] 部分你正在使用的每一个动作/etc/fail2ban/action.d/。
改变这个:
# Default protocol
protocol = tcp
到:
# Default protocol
protocol = all
接下来,我禁用了 ICMP 回显请求,这样被阻止的 IP 就无法访问服务器:
- 纳米/etc/sysctl.conf
添加以下两行:
net.ipv4.icmp_echo_ignore_all = 1 net.ipv4.icmp_echo_ignore_broadcasts = 1
- 退出并保存文件。
- 跑步系统控制-p以使更改生效。
之后,运行fail2ban-客户端重新加载您将不会再看到这些“已被禁止”的消息,除非在阻止生效之前,某个 IP 曾多次尝试访问,并向您发送垃圾邮件。
此外,重要的是,要在每个监狱中使用 iptables-allports 操作来阻止每个违规者的所有端口,而不是阻止他们试图访问的端口。否则,他们可能会触发另一个监狱,并最终在日志中显示为“已被禁止”。
答案2
如果您使用 Docker 容器运行应用程序但主机上使用 fail2ban,您可能会遇到此问题:https://github.com/fail2ban/fail2ban/issues/2292
借鉴那里的解决方法,可以通过在 jail.local 中配置以下行来解决此问题:
[YOUR-JAIL-NAME]
chain = DOCKER-USER
...
或者对于 Kubernetes
chain = KUBE-FIREWALL
更多信息请参见:https://github.com/fail2ban/fail2ban/issues/2292#issuecomment-593216779
在某些情况下,另一种选择可能是使用主机网络而不是 Docker 网络,请参阅:https://docs.docker.com/network/host/
答案3
如果您查看的输出iptables-save
,您将看到fail2ban
链的设置使得它们根据过滤器定义的规则评估数据包,例如:
:fail2ban-ssh - [0:0]
-A INPUT -p tcp -A INPUT -p tcp -A INPUT -p tcp -m multiport --dports 22 -j fail2ban-ssh
-A fail2ban-ssh -j RETURN
流量仍到达服务器在应用其他路由规则并拒绝流量之前。fail2ban
仍然会看到此初始流量,这就是您看到“已禁止”消息的原因。此外,还有一个针对惯犯的特殊过滤器(/etc/fail2ban/filter.d/recidive.conf
):
# Fail2Ban filter for repeat bans
#
# This filter monitors the fail2ban log file, and enables you to add long
# time bans for ip addresses that get banned by fail2ban multiple times.
#
# Reasons to use this: block very persistent attackers for a longer time,
# stop receiving email notifications about the same attacker over and
# over again.
#
# This jail is only useful if you set the 'findtime' and 'bantime' parameters
# in jail.conf to a higher value than the other jails. Also, this jail has its
# drawbacks, namely in that it works only with iptables, or if you use a
# different blocking mechanism for this jail versus others (e.g. hostsdeny
# for most jails, and shorewall for this one).
[INCLUDES]
# Read common prefixes. If any customizations available -- read them from
# common.local
before = common.conf
[Definition]
_daemon = fail2ban\.server\.actions
# The name of the jail that this filter is used for. In jail.conf, name the
# jail using this filter 'recidive', or change this line!
_jailname = recidive
failregex = ^(%(__prefix_line)s| %(_daemon)s%(__pid_re)s?:\s+)WARNING\s+\[(?!%(_jailname)s\])(?:.*)\]\s+Ban\s+<HOST>\s*$
[Init]
journalmatch = _SYSTEMD_UNIT=fail2ban.service PRIORITY=4
# Author: Tom Hendrikx, modifications by Amir Caspi
答案4
如果你要禁止的 IP 地址不是实际上连接到服务器的客户端的 IP 地址。例如,如果您的服务器恰好位于负载平衡器或代理后面。
最近我花了很长时间才弄清楚。误导性信息是日志配置为捕获X-Forwarded-For
IP 地址,而不是真正的源地址(在我的情况下是负载平衡器)。
在这种情况下,fail2ban 没有多大帮助,因为禁止违规 IP 最终会导致封锁全部交通。