home server 篇四:翻车的home server经验分享

首先介绍下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 我在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-inputchain_hook = input action.d/nftables-forward.conf [INCLUDES]before = nftables.conf[Init]chain = f2b-chain-forwardchain_hook = forward filter.d/traefik-auth.conf [Definition]failregex = ^ - S+ [] "(GET|POST|HEAD) .+" 401 .+$ignoreregex = filter.d/traefik-botsearch.conf [INCLUDES]before = botsearch-common.conf[Definition]failregex = ^ - S+ [] "(GET|POST|HEAD) / S+" 404 .+$ jail.d/traefik.conf [traefik-auth]enabled = truebanaction = nftables-forwardbantime = 86400findtime = 600port = 80,443,666filter = traefik-authlogpath = /var/log/traefik/access.logmaxretry = 5[traefik-botsearch]enabled = truebanaction = nftables-forwardbantime = 86400findtime = 600port = 80,443,666filter = traefik-botsearchlogpath = /var/log/traefik/access.logmaxretry = 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问,反正上面的配置我都看不懂。