Fail2Ban:已被禁止?

Fail2Ban:已被禁止?

我的 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 就无法访问服务器:

  1. 纳米/etc/sysctl.conf
  2. 添加以下两行:

    net.ipv4.icmp_echo_ignore_all = 1  
    net.ipv4.icmp_echo_ignore_broadcasts = 1
    
  3. 退出并保存文件。
  4. 跑步系统控制-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-ForIP 地址,而不是真正的源地址(在我的情况下是负载平衡器)。

在这种情况下,fail2ban 没有多大帮助,因为禁止违规 IP 最终会导致封锁全部交通。

相关内容