作者:空調救我命
介紹
首先介紹下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 = ^
- 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 = 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問,反正上面的配置我都看不懂。