容器化fail2ban拦截非正常访问
容器化fail2ban拦截非正常访问
docker-compose.yml容器配置文件
使用基于linuxserver的镜像,linuxserver项目包含了很多linux常用应用的容器化。有包含一些容器安全的便捷配置,例如PUID、PGID。
简单的docker-compose.yml 启动文件
1 |
|
部分配置解释- 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 |
|
一些调试
fail2ban-client set loglevel DEBUG
启动调试日志后可以看到很多拓展信息:例如
- Jail(‘sshd’)正则表达式和配置的文件
- 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 |
|
参考
https://docs.linuxserver.io/images/docker-fail2ban/
https://github.com/linuxserver/fail2ban-confs/blob/master/README.md