容器化fail2ban拦截非正常访问

容器化fail2ban拦截非正常访问

docker-compose.yml容器配置文件

使用基于linuxserver的镜像,linuxserver项目包含了很多linux常用应用的容器化。有包含一些容器安全的便捷配置,例如PUID、PGID。
简单的docker-compose.yml 启动文件

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
services:
  fail2ban:
    image: lscr.io/linuxserver/fail2ban:latest
    container_name: fail2ban
    hostname: f2b
extra_hosts:
- "f2b:127.0.0.1"
    cap_add:
      - NET_ADMIN
      - NET_RAW
    network_mode: host
    environment:
      - PUID=1000
      - PGID=1000
      - TZ=Asia/Shanghai
      - VERBOSITY=-v #optional
    volumes:
      - ./config:/config
      - /var/log:/var/log:ro
      # - /path/to/airsonic/log:/remotelogs/airsonic:ro #optional
      # - /path/to/apache2/log:/remotelogs/apache2:ro #optional
      # - /path/to/authelia/log:/remotelogs/authelia:ro #optional
      # - /path/to/emby/log:/remotelogs/emby:ro #optional
      # - /path/to/filebrowser/log:/remotelogs/filebrowser:ro #optional
      # - /path/to/homeassistant/log:/remotelogs/homeassistant:ro #optional
      # - /path/to/lighttpd/log:/remotelogs/lighttpd:ro #optional
      # - /path/to/nextcloud/log:/remotelogs/nextcloud:ro #optional
      # - /path/to/nginx/log:/remotelogs/nginx:ro #optional
      # - /path/to/nzbget/log:/remotelogs/nzbget:ro #optional
      # - /path/to/overseerr/log:/remotelogs/overseerr:ro #optional
      # - /path/to/prowlarr/log:/remotelogs/prowlarr:ro #optional
      # - /path/to/radarr/log:/remotelogs/radarr:ro #optional
      # - /path/to/sabnzbd/log:/remotelogs/sabnzbd:ro #optional
      # - /path/to/sonarr/log:/remotelogs/sonarr:ro #optional
      # - /path/to/unificontroller/log:/remotelogs/unificontroller:ro #optional
      # - /path/to/vaultwarden/log:/remotelogs/vaultwarden:ro #optional
    restart: unless-stopped

部分配置解释
- VERBOSITY=-vv 设置容器日志的详细程度。有效的选项是-v, -vv, -vvv, -vvvv,或将值保留为空或不设置该变量。
 cap_add:  - NET_ADMIN   - NET_RAW 向容器添加必要的网络操作权限:

  • 允许容器执行网络管理任务,如配置网络接口、设置 IP 层的路由表、管理网络防火墙(iptables)规则等。
  • 允许容器进行某些原始套接字(raw sockets)操作,通常用于网络监控和制作特定的网络数据包

在第一次运行时,容器将在/config会生成fail2ban相关配置文件,后续可以直接在这里修改配置fail2ban。
Fail2ban中./config/fail2ban/jail.d的默认配置在默认情况下都是禁用的,里面的配置可以作为参考。
每次容器重新启动时,/config目录及其子目录中的*.conf 文件都将被原始生成文件覆盖。如果想自定义任何内容,请创建一个与*.conf 文件同名的*.local 文件。不用将整个*.conf 文件复制到*.local,只需包含要更改的内容即可(写入的内容会覆盖*.conf中的配置)。

jail.local一些自定义配置说明

使用容器化的fail2ban时需要注意:

  • 如果运行的服务器端口是容器化的需要指定chain = DOCKER-USER
  • 如果运行的服务端口不是容器化的,而是运行在宿主机上的需要指定chain = INPUT

指定port,会在ban IP时,限制对这些端口的访问.例如你的sshd服务的端口不是默认端口,这将非常有用 port = 8081,8442

常用命令

1
2
3
4
5
6
7
8
9
10
11
12
fail2ban-client --help
fail2ban-server --help

fail2ban-client status
fail2ban-client restart
fail2ban-client reload
fail2ban-client unban --all
fail2ban-client unban <IP>

# debug日志调试
fail2ban-client set loglevel DEBUG
fail2ban-client set loglevel INFO

一些调试

fail2ban-client set loglevel DEBUG 启动调试日志后可以看到很多拓展信息:例如

  1. Jail(‘sshd’)正则表达式和配置的文件
  2. fail2ban.server.action.CommandAction 是通过什么bash命令来启停jail、添加删除ban的iptables规则

可以通过这些信息来反推配置是否有问题

fail2ban的基础是一个python程序,监控特定的日志文件,正则匹配出关联事件的IP和时间等信息,然后调用防火墙工具(iptables\ufw\firewallcmd\cloudflareAPI)来封IP
以iptables为例,fail2ban程序启动后iptables -nL基本无变化.当Banned IP后,会在jail中指定的chain下生成一个子chain,子chain中添加需要被ban的IP.

踩坑

新版本的 Debian 中,iptables 默认使用了 iptables-nft 而不是传统的 iptables-legacy。而在容器中,由于网络模式设置为 host,容器内的 iptables 实际上会直接使用宿主机的 iptables 设置。然而,如果宿主机上的 iptables 使用了 legacy 模式而不是 nft 模式,那么在容器中就会出现iptables-legacy tables present告警,并且可能导致fail2ban的拦截不起作用。

1
2
3
4
5
6
7
8
9
10
11
# 容器中
root@f2b:/# iptables -nL
# Warning: iptables-legacy tables present, use iptables-legacy to see them
root@f2b:/# iptables -V
iptables v1.8.10 (nf_tables)


# 宿主机
root@xxxx:/opt# iptables -V
iptables v1.8.9 (legacy)

参考

https://docs.linuxserver.io/images/docker-fail2ban/
https://github.com/linuxserver/fail2ban-confs/blob/master/README.md