Docker中使用fail2ban监控traefik的access.log并过滤恶意IP地址

# Debian 10 docker 设置 fail2ban 过滤 traefik中BasicAuth失败的IPs

现在fail2ban也上docker了。

补充一::因为我的系统是Debian10,根据我上一篇教程直接安装fail2ban时会把iptables模块启用。所以直接按照下面的配置来即可。

补充二:查看crazymax的说明文档https://github.com/crazy-max/docker-fail2ban/blob/master/CHANGELOG.md

在0.11.1-RC3 (2020/07/30)日志中,移除了F2B_IPTABLES_CHAIN这个参数,所以网上有些教程不适合新的版本了。

整体结构如下:

./fail2ban
├── docker-compose.yml
├── fail2ban.env
└── fail2ban_data

docker-compose.yml内容如下:

services:
  fail2ban:
    image: crazymax/fail2ban:latest
    container_name: fail2ban
    network_mode: "host"
    env_file:
      - "./fail2ban.env"
    privileged: true
    cap_add:
      - NET_ADMIN
      - NET_RAW
    volumes:
      - ./fail2ban_data:/data
      # 下面的文件路径你根据需要换成traefik的logs的路径
      - /home/wwwroot/traefik/data/logs:/var/log:ro
    restart: always

fail2ban.env内容如下:

TZ=Asia/Shanghai

F2B_LOG_TARGET=STDOUT
F2B_LOG_LEVEL=INFO
F2B_DB_PURGE_AGE=1d

SSMTP_HOST=smtp.example.com
SSMTP_PORT=587
SSMTP_HOSTNAME=example.com
SSMTP_USER=smtp@example.com
SSMTP_PASSWORD=
SSMTP_TLS=YES

进入文件夹,启动容器

docker-compose up -d

在fail2ban_data/filter.d下建立文件traefik-botsearch.conf,内容如下:

[INCLUDES]
before = botsearch-common.conf

[Definition]
failregex = ^<HOST> \- \S+ \[\] \"(GET|POST|HEAD) \/<block> \S+\" 404 .+$

在fail2ban_data/jail.d下建立文件traefik.conf,内容如下:

[traefik-auth]
enabled = true
chain = DOCKER-USER
port = http,https
filter = traefik-auth
mode = aggressive
logpath = /var/log/access.log

[traefik-auth-ddos]
filter = traefik-auth[mode=ddos]

[traefik-botsearch]
enabled = true
chain = DOCKER-USER
port = http,https
filter = traefik-botsearch
logpath = /var/log/access.log

一些有用的命令:

sudo docker exec fail2ban fail2ban-client status

上面将列出您的 Fail2ban jail

sudo docker exec fail2ban fail2ban-client status traefik-auth

提供有关traefik-auth 的具体信息 - 包括任何被禁止的IP地址。

sudo docker exec fail2ban fail2ban-client set traefik-auth banip 1.1.1.1

将禁止特定 IP - 在所示示例中,它是 1.1.1.1 - 根据需要进行更改。

sudo docker exec fail2ban fail2ban-client set traefik-auth unbanip 1.1.1.1

以上将取消禁止特定IP - 在所示示例中,它是 1.1.1.1 - 根据需要进行更改。

(可选)

在fail2ban_data下建立文件jail.local,内容如下:

[DEFAULT]
# action = %(action_mwl)s
ignoreip = 192.168.1.0/24

这样可以告诉fail2ban忽略来自局域网的IP

(进阶)使用cloudflare来禁IP

规则来自这里[](https://github.com/fail2ban/fail2ban/tree/0.11/config/action.d)https://github.com/fail2ban/fail2ban/tree/0.11/config/action.d

根据你的需要拷贝文件cloudflare.conf到action.d,重启容器,这里不展开了

END

dark
sans