之前我介紹了Fail2ban這個強大的伺服器守門員,它會24 小時盯著監視器(日誌),一旦發現可疑人物(惡意 IP)就立即將其拒之門外。現在讓我們更進一步,讓fail2ban每封鎖一個ip就推播給我們,這樣不但能讓我們隨時知道我們的伺服器正在遭受怎樣的攻擊,也能即時發現被誤鎖的IP。在比較了幾種不同的通知方式(寄email、Line、Telegram)後,我選擇了Telegram,因為透過Telegram,我們不但能隨時收到封鎖/解鎖通知,我們還能透過Telegram下指令控制Fail2ban,在沒有電腦在身邊、或不小心把自己正在用的ip封鎖了的情況下,也能透過Telegram解救自己。本篇文章先介紹簡單的連動,下篇在進階到透過Telegram發指令控制Fail2ban。
第一步:準備 Telegram機器人與 Chat ID
您需要兩樣東西:機器人 Token 和 您的 Chat ID。
- 取得機器人 Token (API Token):
- 在 Telegram 搜尋
@BotFather。 - 發送指令
/newbot。 - 依序輸入「機器人顯示名稱」和「機器人帳號 ID (必須以 bot 結尾)」。
- BotFather 會給您一串紅色文字的 Token (例如:
123456789:ABCdefGHIjklMNOpqrst...),請記下來。
- 在 Telegram 搜尋
- 取得您的 Chat ID:
- 在 Telegram 搜尋
@userinfobot(這是最快的方法)。 - 點擊 Start 或發個訊息給它。
- 它會回覆您的 ID (例如:
987654321),請記下來。 - 重要: 記得先去搜尋您剛剛建立的那個機器人,隨便發個「Hello」給它(啟動對話),否則機器人沒權限主動傳訊息給您。
- 在 Telegram 搜尋
第二步:建立 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