使用 fail2ban 保護 frp 服務

SangriaChant發表於2022-01-20

背景

我們一般會使用 fail2ban 來保護暴露到公網的提供密碼登入的 ssh 連線等。

但使用 frp 穿透後所有的從外網訪問都會變成 127.0.0.1 進入的,原本能用 fail2ban 保護的如 ssh 服務將無法使用。

因此 fail2ban 應該放到 frps 伺服器上。但 frps 的日誌並不會對失敗進行辨別,無論你訪問哪個服務,frp 日誌只會有連線和斷開兩種日誌。

不完美的解決途徑

正常情況下,我們不會頻繁地連線和斷開,只有被掃描時才容易出現。

因此新增自定義 filter,並設定一段時間內連線超過閾值後進入監獄。

編寫檔案 /etc/fail2ban/filter.d/frps.conf

[Definition]

failregex = ^.*get a user connection \[<HOST>:[0-9]*\]
            ^.*get a new work connection: \[<HOST>:[0-9]*\]
ignoreregex =

編寫檔案 /etc/fail2ban/jail.local 新增

[frp]
enabled = true
findtime = 10m
maxretry = 100
bantime = 1d
filter = frps
logpath = /data/frp/log/frps.log
protocol = all
chain = all
port = all
action = iptables-allports[name=frp,protocol=tcp]

記得 fail2ban-client reload 過載服務和 fail2ban-client status frp 確認服務狀態。

如果你要新增自己的過濾規則可以使用 fail2ban-regex <LOG> <REGEX> [IGNOREREGEX] 進行驗證,比如 fail2ban-regex /data/frp/log/frps.log /etc/fail2ban/filter.d/frps.conf (記得要用絕對路徑)

然後你可以把閾值改小一點,用多次 telnet 來驗證是否能過成功封鎖。 然後用 fail2ban-client set frp unbanip 12.36.14.241 來解除封鎖。

Outlook

不是很完美的方案,比如如果是 http 連線,很可能超過限制,實際使用需要做一些排除的匹配。

也許能通過 tcpdump 抓包日誌來進行過濾,或編寫程式輸出一個更清晰的日誌。

相關文章