我使用“经典”配置设置了一个由 Docker 引擎在 Swarm 模式下运行的 Traefik 实例(见下文,为简洁起见,我只放置了相关的 [to me] 部分。如果需要,请随时询问更多详细信息)。
已安装 Fail2Ban 以及 firewalld(CentOS 发行版)。到目前为止,我通过观察 Traefik 访问日志进行了简单的过滤器/监狱配置,主要用于阻止 DOS 和暴力破解。
我的问题:当我尝试使用Nikto或Hydra时,我可以看到我尝试使用的 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/
# ...
Fail2Ban
我的过滤器
/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