跑過 VPS 的人多半裝過 fail2ban——盯著 SSH log,抓到暴力破解就把 IP 丟進防火牆黑名單。這套工具從 2004 年活到現在,邏輯簡單,單機部署幾乎零門檻。但它有一個根本性的限制:每台機器只看得見自己的 log,每次都要等攻擊者「先打你一輪」才開始反應。
CrowdSec 的出發點不一樣。它把全球數萬個節點偵測到的攻擊行為匯集起來,當一個 IP 在德國的伺服器上掃 SSH,你在臺灣的 VPS 幾分鐘內就能收到這筆情報,在攻擊者敲門之前先把門鎖上。這不是商業 WAF 才有的功能——CrowdSec 是開源的,社群版完全免費。
架構拆解:偵測和封鎖是兩件事
fail2ban 把偵測和封鎖綁在同一支程式裡,CrowdSec 刻意把它們拆開。
Log Processor(偵測端) 負責讀取系統日誌,套用 scenario(行為偵測規則)比對可疑模式。例如「同一個 IP 在 30 秒內 SSH 登入失敗 5 次」就是一個 scenario。觸發後產生 alert,交給下一層處理。
Local API(決策中心) 接收 alert,根據 profile 決定要採取什麼行動——封鎖 4 小時、封鎖 24 小時、或只是記錄不處理。所有決策(decision)儲存在本地 SQLite 資料庫裡。同時,LAPI 也負責和 CrowdSec 的 Central API 溝通,上傳匿名化的攻擊資料、下載社群黑名單。
Bouncer(執行端) 是真正動手擋人的元件。它定期向 LAPI 查詢最新的 decision,然後操作 nftables 規則把 IP 封掉。偵測和執行分離的好處是:你可以在一台機器上跑偵測,在另一台防火牆上跑 Bouncer;或者一個 LAPI 管十台機器的偵測結果,統一下發封鎖指令。
這個三層架構乍看麻煩,單機部署時其實 Log Processor 和 LAPI 跑在同一個 process 裡,體感跟裝 fail2ban 差不多。
安裝 CrowdSec:從零到能擋人
以 Ubuntu 24.04 / Debian 12 為例。CrowdSec 官方維護自己的套件庫,不建議用發行版倉庫裡的舊版本。
1 | curl -s https://install.crowdsec.net | sudo sh |
裝完後確認服務狀態:
1 | sudo systemctl status crowdsec |
CrowdSec 本體只負責偵測,還需要安裝 Bouncer 才能實際封鎖。臺灣多數 VPS 跑的是 nftables 核心,直接裝 firewall bouncer:
1 | sudo apt install crowdsec-firewall-bouncer-nftables -y |
裝完後 Bouncer 會自動向 LAPI 註冊。確認註冊狀態:
1 | sudo cscli bouncers list |
應該會看到一筆 FirewallBouncer-xxxx 的紀錄,狀態為 validated。
安裝 Collection:告訴 CrowdSec 要看什麼 log
CrowdSec 用 collection 的概念打包 parser(日誌解析器)和 scenario(偵測規則)。預設安裝已經包含 crowdsecurity/linux,涵蓋基本的 SSH 和系統日誌偵測。
如果伺服器跑了 Nginx 或 Caddy 反向代理,加裝對應的 collection:
1 | sudo cscli collections install crowdsecurity/nginx |
加完後重啟讓新規則生效:
1 | sudo systemctl restart crowdsec |
查看目前啟用了哪些偵測規則:
1 | sudo cscli scenarios list |
典型的 scenario 包括 ssh-bf(SSH 暴力破解)、ssh-slow-bf(慢速 SSH 掃描)、http-crawl-non_statics(異常爬蟲行為)、http-cve-probing(CVE 漏洞掃描)。每個 scenario 都可以獨立調整觸發閾值和封鎖時間。
群眾情報:CrowdSec 真正拉開差距的地方
裝完 CrowdSec、跑起來之後,到 CrowdSec Console 註冊帳號,把你的 instance 登錄上去。這一步不只是為了漂亮的儀表板——登錄後你的 instance 會開始接收社群共享的惡意 IP 黑名單。
運作方式是這樣的:全球數萬個 CrowdSec 節點各自偵測攻擊行為,把匿名化的 IP 和攻擊類型回報給 Central API。CrowdSec 後端對這些回報做交叉比對——一個 IP 必須被來自不同 AS(自治系統)的多個節點獨立回報,才會被加入社群黑名單。這個機制同時防止了誤判和蓄意投毒。
實務效果是:一個殭屍網路的 C2 伺服器在歐洲開始掃描,你的 VPS 在幾分鐘內就能從黑名單裡拿到這個 IP,不用等它真的來敲你的 SSH。對比 fail2ban 的「先被打一輪再反應」,這是本質上的差異。
1 | sudo cscli console enroll <你的enrollment-key> |
日常維運的幾個指令
CrowdSec 的 CLI 工具 cscli 設計得相當直覺。以下是日常最常用的操作:
查看目前被封鎖的 IP:
1 | sudo cscli decisions list |
手動封鎖一個 IP(例如發現有人在掃你的 API):
1 | sudo cscli decisions add --ip 203.0.113.42 --duration 24h --reason "manual ban" |
解除封鎖:
1 | sudo cscli decisions delete --ip 203.0.113.42 |
查看偵測引擎的即時指標——處理了多少行 log、觸發了幾次 scenario、Bouncer 攔截了多少請求:
1 | sudo cscli metrics show |
這個指標面板在除錯時特別有用。如果 lines parsed 是 0,代表 CrowdSec 根本沒讀到目標日誌,通常是 acquisition 設定指錯了路徑。
Docker 環境的部署方式
如果伺服器上的服務都跑在 Docker 裡,CrowdSec 也可以用容器部署。關鍵是把要監控的 log 目錄掛進去:
1 | services: |
注意 /var/lib/crowdsec/data 必須掛載為 volume,否則容器會拒絕啟動。LAPI 預設監聽 8080 port,只綁 127.0.0.1 就好,Bouncer 透過 localhost 連線。
Bouncer 仍然建議直接裝在 host 上而不是容器裡,因為它需要操作 host 的 nftables 規則。容器內的 Bouncer 要開 NET_ADMIN capability 和 host network mode,反而更麻煩。
CrowdSec 和 fail2ban 該選哪個
這不是非此即彼的問題,但在 2026 年的現實環境下,CrowdSec 在多數場景是更好的選擇。
效能差異:fail2ban 每封一個 IP 就加一條 iptables 規則,管理幾千條規則時效能明顯下降。CrowdSec 用 nftables 的 IP set,底層是 hash table,塞幾十萬筆 IP 也不影響封包處理速度。
情報差異:fail2ban 只能看見自己這台機器的 log。CrowdSec 的社群黑名單讓你在攻擊抵達之前就有防線。對於暴露在公網上的 VPS,這層預防性封鎖的價值遠大於事後補救。
多機管理:fail2ban 沒有集中管理的概念,十台機器就要維護十份設定。CrowdSec 的 LAPI 天生支援多個 Log Processor 回報,一個儀表板管所有機器。
fail2ban 仍然合理的場景:只有一台機器、只開 SSH、已經關掉密碼登入只用 Key 認證——這時候攻擊面極小,fail2ban 的簡單反而是優勢。但只要伺服器上跑了 Web 服務、API、或任何面向公網的應用,CrowdSec 提供的偵測廣度和社群情報就有明顯價值。
驗證防禦是否生效
裝完之後最重要的事:確認它真的在運作。
1 | sudo cscli metrics show |
確認 acquisition 區塊有你預期的 log 來源,parsers 有解析到行數,scenarios 有觸發紀錄(如果伺服器暴露在公網上,通常幾分鐘內就會有 SSH 掃描觸發)。
檢查 nftables 是否有 CrowdSec 的規則集:
1 | sudo nft list ruleset | grep crowdsec |
應該會看到 crowdsec-blacklists 和 crowdsec6-blacklists 兩個 set。
如果想主動測試,可以從另一台機器故意輸錯 SSH 密碼幾次,然後回來看:
1 | sudo cscli decisions list |
確認該 IP 有出現在封鎖清單中,就代表從偵測到封鎖的完整鏈路都通了。
VPS 暴露在公網上,每天面對的不是一兩個腳本小子,而是自動化殭屍網路的持續掃描。CrowdSec 把全球社群的偵測結果變成即時可用的防禦情報,這種協作式的安全模型是單機工具做不到的。如果你正在找一台穩定的 VPS 來部署服務,NCSE Network 提供臺灣機房的高效能 VPS 主機,搭配 Intel Gold CPU 與 NVMe SSD,適合需要低延遲、高可靠性的生產環境——了解更多 NCSE Network VPS 方案。