透過我之前的文章(fail2ban與telegram連動),我介紹了如何讓 Fail2ban 在抓到壞人時,即時推播通知到我們的 Telegram 上。但身為一個伺服器管理員,只有「看」是不夠的。
試想一個情境:如果你在外面用手機網路連回伺服器,不小心密碼打錯太多次,自己被 Fail2ban 鎖在門外怎麼辦? 難道要等到回家用固定 IP 才能解鎖嗎?
這篇進階教學,將帶你用一小段 Python 腳本,把你的 Telegram 機器人升級成 「伺服器專屬控制中心」。你將可以直接在 Telegram 輸入 /unban 解鎖自己,或是輸入 /status 隨時查看各個監獄的狀況!
⚠️ 核心安全觀念:專屬識別
既然要讓 Telegram 可以對伺服器下達系統指令,安全性就是第一考量。 我們接下來寫的程式碼,會內建「身分驗證」機制。機器人只會認你的 Chat ID,如果路人甲亂連你的機器人下指令,系統會直接無視,確保伺服器的絕對安全。
你需要準備好:
- 你的 Telegram Bot Token (從 BotFather 取得)
- 你的專屬 Chat ID
步驟一:建立 Python 虛擬環境
為了不干擾 Ubuntu 系統預設的 Python 環境,我們為機器人建立一個獨立的家。請依序執行以下指令:
# 安裝 venv 虛擬環境套件
sudo apt update && sudo apt install python3-venv -y
# 建立機器人專屬資料夾並進入
sudo mkdir -p /opt/f2b-tg-bot
cd /opt/f2b-tg-bot
# 建立虛擬環境
sudo python3 -m venv venv
# 進入虛擬環境並安裝 Telegram 機器人專用套件
sudo ./venv/bin/pip install pyTelegramBotAPI
步驟二:撰寫核心控制腳本 (附避坑指南)
接下來我們要寫入機器人的靈魂。
建立並編輯 Python 檔案:
sudo nano /opt/f2b-tg-bot/bot.py
將以下程式碼貼上:
import telebot
import subprocess
import time
# ⚠️ 注意這裡!必須使用單引號或雙引號將字串包起來!
TOKEN = '你的_BOT_TOKEN'
ALLOWED_CHAT_ID = '你的_CHAT_ID' # 非常重要!防駭客關鍵
bot = telebot.TeleBot(TOKEN)
# 安全檢查:只允許你的 Chat ID 執行指令
def is_authorized(message):
return str(message.chat.id) == str(ALLOWED_CHAT_ID)
@bot.message_handler(commands=['start', 'help'])
def send_welcome(message):
if not is_authorized(message): return
help_text = (
"🛡️ **伺服器 Fail2ban 控制中心**\n\n"
"可用指令:\n"
"`/status` - 查看 Fail2ban 總覽\n"
"`/jail <監獄名稱>` - 查看特定監獄狀態 (例如 /jail recidive)\n"
"`/unban <IP>` - 從所有監獄中解鎖該 IP\n"
"`/ban <監獄名稱> <IP>` - 手動將 IP 關入特定監獄"
)
bot.reply_to(message, help_text, parse_mode="Markdown")
@bot.message_handler(commands=['status'])
def check_status(message):
if not is_authorized(message): return
result = subprocess.getoutput("fail2ban-client status")
bot.reply_to(message, f"```\n{result}\n```", parse_mode="Markdown")
@bot.message_handler(commands=['jail'])
def check_jail(message):
if not is_authorized(message): return
try:
jail_name = message.text.split()[1]
result = subprocess.getoutput(f"fail2ban-client status {jail_name}")
bot.reply_to(message, f"```\n{result}\n```", parse_mode="Markdown")
except IndexError:
bot.reply_to(message, "請指定監獄名稱,例如:`/jail recidive`", parse_mode="Markdown")
@bot.message_handler(commands=['unban'])
def unban_ip(message):
if not is_authorized(message): return
try:
ip = message.text.split()[1]
result = subprocess.getoutput(f"fail2ban-client unban {ip}")
bot.reply_to(message, f"✅ 解鎖結果:\n```\n{result}\n```", parse_mode="Markdown")
except IndexError:
bot.reply_to(message, "請提供 IP,例如:`/unban 192.168.1.1`", parse_mode="Markdown")
@bot.message_handler(commands=['ban'])
def ban_ip(message):
if not is_authorized(message): return
try:
parts = message.text.split()
jail_name = parts[1]
ip = parts[2]
result = subprocess.getoutput(f"fail2ban-client set {jail_name} banip {ip}")
bot.reply_to(message, f"⛔ 封鎖結果:\n```\n{result}\n```", parse_mode="Markdown")
except IndexError:
bot.reply_to(message, "格式錯誤,請使用:`/ban 監獄名稱 IP`", parse_mode="Markdown")
# 讓機器人持續運作,遇到網路錯誤自動重試
while True:
try:
bot.polling(none_stop=True, interval=1, timeout=20)
except Exception as e:
time.sleep(5)
🚨 常見新手錯誤 (踩坑經驗分享)
我自己一開始在填寫 TOKEN 和 ALLOWED_CHAT_ID 時,是直接把數字貼上去,像這樣: TOKEN = 9876543210:AAG... 這會導致服務啟動失敗,並在日誌中噴出 SyntaxError: invalid syntax 錯誤! 原因: 在 Python 中,這些金鑰與 ID 屬於「字串」,必須使用單引號 '' 或雙引號 "" 將它們包起來。請務必再三檢查第 6、7 行的格式!
步驟三:設定為系統背景服務 (Systemd)
為了讓這支程式在伺服器重開機時能自動啟動,且在背景穩定運行,我們要把它註冊為系統服務。
建立服務設定檔:
sudo nano /etc/systemd/system/f2b-tg-bot.service
貼上以下內容:
[Unit]
Description=Fail2ban Telegram Control Bot
After=network.target fail2ban.service
[Service]
Type=simple
User=root
WorkingDirectory=/opt/f2b-tg-bot
ExecStart=/opt/f2b-tg-bot/venv/bin/python /opt/f2b-tg-bot/bot.py
Restart=always
RestartSec=10
[Install]
WantedBy=multi-user.target
步驟四:啟動機器人與成果驗收
最後,重新載入系統守護行程並啟動服務:
# 重新載入設定
sudo systemctl daemon-reload
# 啟動並設定開機自啟動
sudo systemctl enable --now f2b-tg-bot
# 檢查運作狀態
sudo systemctl status f2b-tg-bot
如果看到綠色的 active (running),恭喜你,設定大功告成!
現在你可以打開 Telegram,對著你的機器人輸入指令:
📱 拿起手機測試吧!
- 傳送
/help呼叫功能選單。 - 傳送
/status看看你的伺服器目前有幾個監獄正在運作。 - 最棒的是,以後如果有朋友或自己的 IP 不小心被鎖了,只要優雅地拿出手機輸入
/unban 1.2.3.4,一秒鐘就能解決問題!
透過這個實作,我們不僅掌握了 Fail2ban 的防禦機制,更將伺服器的管理權限完美地延伸到了我們的手機上。這才是真正現代化、自動化的伺服器管理體驗!



