home server 篇四:翻车的home server经验分享-[fail2ban]
介绍
首先介绍下fail2ban是干嘛的,很简单,就是filter监视log,排查ban恶意IP,找到后丢进jail,被丢进jail后,action让那些ip不能继续尝试暴力破解了。你们要是看了authelia的文档也就知道authelia是自带fail2ban的,看看Security-Regulation就能明白。
但即使authelia ban了试图恶意突破它的ip,也只能保护ForwardAuth指向它的服务,其它的像jellyfin这类不能指向它的,依然在果奔,如下图的service3。 good ip可以访问所有服务,bad ip因为被ban了,访问不了service1、service2和authelia,但是还是能访问service3的。
然后我就在想怎么在一层里就能保护所有服务,所以就轮到fail2ban出场。 一开始我是不知道fail2ban的,又是在的时候看到的。这样无论是是在traefik这层,还是authelia这层,还是单独service这层,只要有恶意行为的IP就会被ban。如下图,good ip可以访问所有服务,bad ip一个服务都访问不了。 不过fail2ban官网里关于书写配置的说明相当骨干,对不懂代码的我非常不友好。
https://www.fail2ban.org/wiki/index.php/MANUAL_0_8#Jails
fail2ban
安装
我在ubuntu上使用fail2ban,网络配置依赖于nftables,但是这个镜像默认使用iptables,所以需要在action.d里override些配置才能用,不过都是用file形式,不用担心。然后我拿traefik做示范,这个示范只能监视traefik的BasicAuth的登陆,所以只有使用BasicAuth的服务被攻击超过5次时,才会触发ban action把恶意IP给ban了,其它没有使用BasicAuth的服务即使出现5次以上的无效登陆也不会触发ban action。不过要是恶意IP被ban了,那IP就无法访问traefik反代的任一服务了。 先建好文件夹,然后就是复制黏贴代码了,非常简单,除了port要改成自己用的之外,其它都不用修改。所以如果要用fail2ban,配置需要自己学怎么写。投机取巧的方法就是把所有ForwardAuth可以指向authelia全指向authelia,然后给authelia配置fail2ban,剩下不能这么干的,只能一步步做了。
action.d/nftables-input.conf
[INCLUDES]
before = nftables.conf
[Init]
chain = f2b-chain-input
chain_hook = input
action.d/nftables-forward.conf
[INCLUDES]
before = nftables.conf
[Init]
chain = f2b-chain-forward
chain_hook = forward
filter.d/traefik-auth.conf
[Definition]
failregex = ^<HOST> - S+ [] "(GET|POST|HEAD) .+" 401 .+$
ignoreregex =
filter.d/traefik-botsearch.conf
[INCLUDES]
before = botsearch-common.conf
[Definition]
failregex = ^<HOST> - S+ [] "(GET|POST|HEAD) /<block> S+" 404 .+$
jail.d/traefik.conf
[traefik-auth]
enabled = true
banaction = nftables-forward
bantime = 86400
findtime = 600
port = 80,443,666
filter = traefik-auth
logpath = /var/log/traefik/access.log
maxretry = 5
[traefik-botsearch]
enabled = true
banaction = nftables-forward
bantime = 86400
findtime = 600
port = 80,443,666
filter = traefik-botsearch
logpath = /var/log/traefik/access.log
maxretry = 5
好了,所有的配置都写好了,是不是很简单。maxretry规定了最高重试次数,超过就ban。bantime规定了时间,单位是秒。所以上面的jail会在ip实施,在80,443,666任一端口,在600秒内,在BasicAuth里出现5次密码错误时,把ip ban 86400秒。
现在用docker compose建容器。把!全替换成空格。
version: "3.5"
services:
!!fail2ban:
!!!!image: crazymax/fail2ban:latest
!!!!container_name: fail2ban
!!!!network_mode: "host"
!!!!cap_add:
!!!!!!- NET_ADMIN
!!!!!!- NET_RAW
!!!!volumes:
!!!!!!- "/home/用户名/docker/fail2ban/data:/data"
!!!!!!- "/home/用户名/docker/traefik/logs/access.log:/var/log/traefik/access.log:ro"
!!!!restart: always
!!!!environment:
!!!!!!- TZ=Asia/Shanghai
!!!!!!- F2B_LOG_TARGET=STDOUT
!!!!!!- F2B_LOG_LEVEL=INFO
!!!!!!- F2B_DB_PURGE_AGE=1d
使用
这样容器就建好了,来试下能不能ban ip。用portainer点进fail2ban容器的控制台,然后点连接,就进容器里了。不要介意我的access.log名字。
fail2ban-client status
这样就能看到自己有什么jail。
fail2ban-client status jail的名字
这样就能看到自己jail有什么内容,主要看actions。
fail2ban-client set jail的名字 banip 目标IP
先试下ban 192.168.0.163。fail2ban-client set traefik-auth banip 192.168.0.163。然后用fail2ban-client status traefik-auth就能看到163被ban了。然后不需要在traefik里设置什么,163就访问不了任何traefik的服务了。
unban就是在banip前加个un。
fail2ban-client set jail的名字 unbanip 目标IP
Done,你们要是有什么不懂就去gayhub问,反正上面的配置我都看不懂。
作者声明本文无利益相关,欢迎值友理性交流,和谐讨论~