Fail2ban與Telegram連動

之前我介紹了Fail2ban這個強大的伺服器守門員,它會24 小時盯著監視器(日誌),一旦發現可疑人物(惡意 IP)就立即將其拒之門外。現在讓我們更進一步,讓fail2ban每封鎖一個ip就推播給我們,這樣不但能讓我們隨時知道我們的伺服器正在遭受怎樣的攻擊,也能即時發現被誤鎖的IP。在比較了幾種不同的通知方式(寄email、Line、Telegram)後,我選擇了Telegram,因為透過Telegram,我們不但能隨時收到封鎖/解鎖通知,我們還能透過Telegram下指令控制Fail2ban,在沒有電腦在身邊、或不小心把自己正在用的ip封鎖了的情況下,也能透過Telegram解救自己。本篇文章先介紹簡單的連動,下篇在進階到透過Telegram發指令控制Fail2ban。

第一步:準備 Telegram機器人與 Chat ID

您需要兩樣東西:機器人 Token您的 Chat ID

  1. 取得機器人 Token (API Token)
    • 在 Telegram 搜尋 @BotFather
    • 發送指令 /newbot
    • 依序輸入「機器人顯示名稱」和「機器人帳號 ID (必須以 bot 結尾)」。
    • BotFather 會給您一串紅色文字的 Token (例如:123456789:ABCdefGHIjklMNOpqrst...),請記下來
  2. 取得您的 Chat ID
    • 在 Telegram 搜尋 @userinfobot (這是最快的方法)。
    • 點擊 Start 或發個訊息給它。
    • 它會回覆您的 ID (例如:987654321),請記下來
    • 重要: 記得先去搜尋您剛剛建立的那個機器人,隨便發個「Hello」給它(啟動對話),否則機器人沒權限主動傳訊息給您。

第二步:建立 Fail2ban 的 Telegram 動作檔

我們要告訴 Fail2ban 如何呼叫 Telegram API。

建立設定檔:

sudo nano /etc/fail2ban/action.d/telegram.conf

貼上以下內容:

# Fail2ban configuration file for Telegram
#
[Definition]

# 當封鎖 IP 時發送訊息
actionban = curl -s -X POST "https://api.telegram.org/bot<token>/sendMessage" -d chat_id=<chat_id> -d text="⛔ <b>[Fail2ban]</b> %0A伺服器: <name> %0A剛剛封鎖了 IP: <code><ip></code> %0A(攻擊次數: <failures>)" -d parse_mode="HTML"

# 當解鎖 IP 時發送訊息 (不需要可刪除)
actionunban = curl -s -X POST "https://api.telegram.org/bot<token>/sendMessage" -d chat_id=<chat_id> -d text="✅ <b>[Fail2ban]</b> %0A伺服器: <name> %0A剛剛解鎖了 IP: <code><ip></code>" -d parse_mode="HTML"

[Init]
# 預設為空,由 jail.local 傳入
token =
chat_id =

儲存並退出 (Ctrl+O -> Enter -> Ctrl+X)。

小細節:發送的訊息是HTML格式 ,可以按照自己喜好做修改


第三步:在 jail.local 啟用設定

編輯您的 jail.local

sudo nano /etc/fail2ban/jail.local

[DEFAULT] 區塊中,加入您的 Token 和 ID,並啟用動作:

[DEFAULT]
# --- Telegram 設定 ---
# 請填入第一步取得的真實資料
telegram_token = 123456789:ABCdefGHIjkl...
telegram_chat_id = 987654321

# --- 動作設定 ---
# 定義新的動作別名,方便呼叫
# 這行意思是:呼叫 telegram.conf,並把上面的 token 和 id 傳進去
action_telegram = telegram[token="%(telegram_token)s", chat_id="%(telegram_chat_id)s"]

# 決定要執行的動作
# %(action_)s 是預設的封鎖 (只封鎖不通知)
# %(action_telegram)s 是我們剛剛定義的 Telegram 通知
action = %(action_)s
         %(action_telegram)s

儲存並退出。


第四步:重啟並測試

重啟 Fail2ban

sudo systemctl restart fail2ban

測試發送 (手動封鎖一個假 IP):

sudo fail2ban-client set sshd banip 1.0.0.1

手機響了嗎? 🔔 如果設定正確,您的 Telegram 應該會收到一條訊息:

[Fail2ban] 伺服器: sshd 剛剛封鎖了 IP: 1.0.0.1 (攻擊次數: 1)

測試完畢記得解鎖

sudo fail2ban-client set sshd unbanip 1.0.0.1

發佈留言

發佈留言必須填寫的電子郵件地址不會公開。 必填欄位標示為 *

這個網站採用 Akismet 服務減少垃圾留言。進一步了解 Akismet 如何處理網站訪客的留言資料