使用 fail2ban 保護 frp 服務


背景

我們一般會使用 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 抓包日志來進行過濾,或編寫程序輸出一個更清晰的日志。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM