我使用“经典”配置在 Swarm 模式下设置了一个由 Docker 引擎运行的 Traefik 实例(见下文,为简洁起见,我仅放出了与 [我] 相关的部分)。如果需要,请随时询问更多详细信息)。
已安装 Fail2Ban 和防火墙(CentOS 发行版)。到目前为止,我通过查看 Traefik 访问日志,设置了简单的过滤器/监狱配置,主要用于阻止 DOS 和暴力破解。
我的问题:当我尝试尼克托或者九头蛇,我可以看到我的尝试IP已被列入黑名单:
# fail2ban-client status symfony-auth
Status for the jail: symfony-auth
|- Filter
| |- Currently failed: 3
| |- Total failed: 906
| `- File list: /var/log/traefik/access.log
`- Actions
|- Currently banned: 1
|- Total banned: 2
`- Banned IP list: 37.19.218.169
但 iptables 规则部分没有任何变化,我可以看到给定的 IP 没有被阻止。此外,如果我尝试从被禁止的 IP 浏览网站,我可以做到,即使它被禁止。
我必须补充一点00-firewalld.conf file
,我有关于此发行版操作的默认说明:
# cat /etc/fail2ban/jail.d/00-firewalld.conf
# This file is part of the fail2ban-firewalld package to configure the use of
# the firewalld actions as the default actions. You can remove this package
# (along with the empty fail2ban meta-package) if you do not use firewalld
[DEFAULT]
banaction = firewallcmd-rich-rules[actiontype=<multiport>]
banaction_allports = firewallcmd-rich-rules[actiontype=<allports>]
backend=systemd
最后,我没有任何时差,如上所述这里。
# tail /var/log/messages
Jul 12 13:28:05 ....
# timedatectl
Local time: Mon 2021-07-12 13:30:18 UTC
Universal time: Mon 2021-07-12 13:30:18 UTC
RTC time: Mon 2021-07-12 13:30:13
Time zone: UTC (UTC, +0000)
System clock synchronized: yes
NTP service: active
RTC in local TZ: no
那么为什么我被禁止的 IP 仍然可以访问目标网站?感谢您的指导和启发。
片段
特拉菲克docker-compose.yml
日志部分
version: "3.3"
services:
reverse-proxy:
image: "traefik:v2.4"
command:
# Log configuration
#- "--log.level=DEBUG"
- "--log.filepath=/var/log/traefik/traefik.log"
- "--accesslog.filepath=/var/log/traefik/access.log"
卷部分:
# ...
volumes:
# To persist certificates
- traefik-certificates:/letsencrypt
- "/var/run/docker.sock:/var/run/docker.sock:ro"
- /var/log/traefik:/var/log/traefik/
# ...
失败禁止
我的过滤器
/etc/fail2ban/filter.d/my_filter.conf
[Definition]
failregex = ^<HOST>.*"(GET|POST|HEAD).*" (404|444|403|400|301) .*$
ignoreregex =
我的监狱
[my_jail]
enabled = true
port = http,https
filter = my_filter
logpath = /var/log/traefik/access.log
maxretry = 10
客户端状态
# fail2ban-client status
Status
|- Number of jail: 2
`- Jail list: sshd, my_jail
答案1
那么为什么我被禁止的IP仍然可以访问目标网站?
可能有三个原因:
你的
firewalld
后端(iptables
?)不适合处理这个问题,请参阅https://github.com/fail2ban/fail2ban/issues/1609#issuecomment-303085942(或者https://github.com/firewalld/firewalld/issues/44#issuecomment-408211978) 了解详情。很快,firewalld 的新 nftables 后端可以正确处理这个问题,所以你可能需要切换到这个,或者……
这也可能导致我们接下来的两个原因(前者比后者更相关):如果你的网络子系统有一些白名单规则(我猜是这样),例如 conntrack 规则在 fail2ban 链之前绕过已经建立的连接,那么将规则添加到 fail2ban 表并拒绝 IP,不会影响这个已建立的连接(例如在保持活动的情况下),只有新的连接会被拒绝...在这种情况下,要么确保在 auth-failures 之后在 web 服务器中拒绝连接,要么重新排序链(白名单规则之前的 fail2ban 链),或者使用 中的额外命令终止连接
actionban
,例如ss -K dst "[<ip>]"
或conntrack -D -s <ip>
等。请参阅https://github.com/fail2ban/fail2ban/pull/3018/commits/8f6a8df3a45395620e434fd15b4ede694a1d00aa(或者https://github.com/fail2ban/fail2ban/commit/bbfff1828061514e48395a5dbc5c1f9f81625e82) 与 ufw 存在类似问题;因为它是 dockerized,所以您可能需要定义
chain = DOCKER-USER
或类似,只是操作firewallcmd-rich-rules
不适合那样(根本没有参数chain
)...使用另一个禁止操作(例如本机网络过滤器,如 iptables/ipset 或 nftables)支持它。
无论如何,您必须检查传入流量(包括已建立的流量)如何到达 fail2ban 为禁止 IP 而创建的结果链/表,同时考虑 docker 和firewalld 的所有预定义链/表。
或者,只需对本机网络过滤子系统(如 iptables+ipset 或 nftables)使用禁止操作(例如,使用 fail2ban 链的适当目标表,例如DOCKER-USER
而不是INPUT
)。