Fail2ban chặn IP bằng cách đọc log cục bộ trên từng máy chủ. Nếu một địa chỉ IP gõ sai mật khẩu SSH 5 lần trong 10 phút, công cụ này sẽ gọi tường lửa để cấm IP đó (như hướng dẫn trong bài về cấu hình Fail2ban trên Linux hiện đại). Cách làm này xử lý tốt các đợt quét đơn lẻ, nhưng không hiệu quả khi gặp botnet phân tán: nếu kẻ tấn công dùng hàng trăm địa chỉ IP khác nhau và mỗi IP chỉ thử đăng nhập đúng 1 lần trong ngày, số lần thử sai của từng IP không bao giờ vượt ngưỡng để Fail2ban kích hoạt lệnh chặn.
CrowdSec giải quyết trường hợp này bằng cách bổ sung danh sách IP vi phạm từ cộng đồng. Thay vì chờ một địa chỉ IP gửi yêu cầu lỗi vào máy chủ của bạn rồi mới xử lý, CrowdSec tự động đồng bộ danh sách các IP độc hại đã bị hàng nghìn máy chủ khác trong mạng lưới báo cáo trước đó. Địa chỉ IP của kẻ tấn công có thể bị tường lửa trên VPS của bạn chặn ngay từ gói tin đầu tiên.
Tuy nhiên, việc thay thế Fail2ban bằng CrowdSec đòi hỏi sự đánh đổi về tài nguyên và độ phức tạp vận hành. CrowdSec chạy bằng Go thay vì các script Python gọn nhẹ, chia nhỏ thành nhiều dịch vụ riêng biệt và tiêu tốn nhiều RAM hơn. Với các gói VPS nhỏ từ 1GB đến 2GB RAM, người quản trị cần đo lường mức độ chiếm dụng tài nguyên trước khi quyết định chuyển đổi.
Luồng xử lý từ log cục bộ và danh sách cộng đồng qua Security Engine đến Firewall Bouncer.
Kiến trúc hai phần: Security Engine và Bouncer
Khác với Fail2ban gom việc đọc log và gọi tường lửa vào một tiến trình duy nhất, CrowdSec tách biệt hoàn toàn giữa hai vai trò:
- Security Engine (
crowdsec.service): Chịu trách nhiệm đọc log (từsystemd-journaldhoặc file log dịch vụ), phân tích cú pháp qua các bộ parser, đối chiếu với các kịch bản phát hiện (scenarios) và trao đổi dữ liệu với máy chủ trung tâm của CrowdSec. Engine này chỉ đưa ra quyết định (ví dụ: cấm IP198.51.100.20trong 4 giờ), nhưng bản thân nó không trực tiếp can thiệp vào tường lửa. - Remediation Component (thường gọi là Bouncer): Là một dịch vụ phụ trợ cài đặt độc lập. Bouncer kết nối với Security Engine thông qua Local API (LAPI) qua cổng nội bộ
8080(hoặc Unix socket). Khi Engine ra quyết định cấm, Bouncer sẽ nhận danh sách IP này và trực tiếp gọinftables,iptables, cấu hình Nginx hoặc gọi API của Cloudflare để thực thi lệnh chặn.
Cấu trúc tách rời này mang lại sự linh hoạt: bạn có thể dùng một máy chủ mạnh để chạy Security Engine gom log cho 5 máy chủ web khác nhau, và trên mỗi máy chủ web chỉ cần cài đặt một Bouncer rất nhẹ để nhận lệnh chặn.
So sánh tài nguyên thực tế giữa CrowdSec và Fail2ban
Trước khi cài đặt lên máy chủ production, việc so sánh mức tiêu thụ tài nguyên thực tế là yếu tố quyết định để tránh gây quá tải bộ nhớ (xem thêm cách chẩn đoán tại bài VPS hết RAM và OOM Killer).
| Tiêu chí | Fail2ban | CrowdSec (Engine + Bouncer) |
|---|---|---|
| Ngôn ngữ phát triển | Python | Go |
| Mức tiêu thụ RAM tĩnh (RSS) | 20MB – 35MB | 80MB – 120MB |
| Cơ chế phát hiện | Regex so khớp log | Parser + Scenario định dạng YAML |
| Nguồn dữ liệu đe dọa | Chỉ log cục bộ của VPS | Log cục bộ + Danh sách IP cộng đồng |
| Khả năng chặn phân tán | Kém (dễ bị lách qua ngưỡng) | Rất tốt (chặn trước theo danh sách chung) |
| Can thiệp tầng ứng dụng | Chỉ chặn cổng mạng | Hỗ trợ Captcha Nginx, chặn Cloudflare |
| Phù hợp với phần cứng | VPS từ 512MB – 1GB RAM | VPS từ 2GB RAM trở lên |
Trên một VPS cấu hình 1 vCPU và 1GB RAM đang gánh Nginx cùng cơ sở dữ liệu MySQL, mức chiếm dụng khoảng 100MB RAM của CrowdSec chiếm tới 10% tổng dung lượng bộ nhớ. Nếu ngân sách RAM của bạn đang ở mức giới hạn, Fail2ban vẫn là giải pháp an toàn hơn. Ngược lại, nếu máy chủ có từ 2GB RAM trở lên, mức tiêu tốn 100MB là hoàn toàn xứng đáng để đổi lấy khả năng chặn botnet chủ động.
Cài đặt CrowdSec Security Engine trên Debian và Ubuntu
CrowdSec cung cấp kho lưu trữ (repository) chính thức cho các bản phân phối Linux. Bạn nên cài đặt trực tiếp từ kho này để nhận các bản vá và bộ kịch bản mới nhất.
Trước tiên, chạy script cài đặt kho lưu trữ:
curl -s https://packagecloud.io/install/repositories/crowdsec/crowdsec/script.deb.sh | sudo bashCài đặt gói Security Engine:
sudo apt update
sudo apt install crowdsec -yTrong quá trình cài đặt, CrowdSec sẽ tự động quét các dịch vụ đang chạy trên VPS (như SSH, Nginx hay Apache) để tự động nạp các bộ phân tích cú pháp (parsers) và kịch bản phát hiện (scenarios) tương ứng.
Kiểm tra trạng thái hoạt động của dịch vụ:
sudo systemctl status crowdsecCài đặt Bouncer tường lửa với nftables
Như đã phân tích ở phần kiến trúc, chỉ cài đặt crowdsec là chưa đủ để bảo vệ máy chủ vì Security Engine không tự đóng cổng mạng. Bạn cần cài đặt thêm Remediation Bouncer để kết nối với tường lửa.
Trên Ubuntu 22.04/24.04 và Debian 12, gói bouncer tối ưu nhất là crowdsec-firewall-bouncer-nftables. Gói này sử dụng cơ chế tập hợp băm (set) của nftables tương tự như cấu hình chuẩn của Fail2ban, giúp việc chặn hàng nghìn IP không làm tăng độ trễ mạng:
sudo apt install crowdsec-firewall-bouncer-nftables -ySau khi cài đặt, tiến trình bouncer sẽ tự động đăng ký một API key với Security Engine tại file cấu hình /etc/crowdsec/bouncers/crowdsec-firewall-bouncer.yaml và khởi chạy dịch vụ crowdsec-firewall-bouncer.service.
Kiểm tra xem bouncer đã kết nối thành công với Engine hay chưa:
sudo cscli bouncers listĐầu ra mẫu xác nhận kết nối:
---------------------------------------------------------------------------------------------------------------------------------------
Name IP Address Valid Last API Pull Type Version Auth Type
---------------------------------------------------------------------------------------------------------------------------------------
firewall-bouncer-1729310000 127.0.0.1 ✔ 2026-10-19T06:10:00Z crowdsec-firewall-bouncer-nftables v0.0.30 api-key
---------------------------------------------------------------------------------------------------------------------------------------Cột Valid hiển thị dấu tích xác nhận bouncer đã sẵn sàng nhận lệnh cấm từ Engine.
Các lệnh vận hành thực tế với cscli
Công cụ dòng lệnh cscli là trung tâm điều khiển của CrowdSec. Dưới đây là các thao tác thường dùng nhất trong quá trình vận hành:
1. Xem danh sách các IP đang bị chặn
sudo cscli decisions listĐầu ra sẽ liệt kê chi tiết từng quyết định cấm:
+--------+----------+--------------------+----------------------+--------+---------+----+--------+--------------------+
| ID | Source | Scope:Value | Reason | Action | Country | AS | Events | Expiration |
+--------+----------+--------------------+----------------------+--------+---------+----+--------+--------------------+
| 145021 | CAPI | Ip:198.51.100.44 | crowdsecurity/ssh-bf | ban | CN | -- | 1 | 3h58m |
| 145022 | crowdsec | Ip:203.0.113.12 | crowdsecurity/ssh-bf | ban | VN | -- | 6 | 3h45m |
+--------+----------+--------------------+----------------------+--------+---------+----+--------+--------------------+Trong bảng trên, bạn cần chú ý cột Source:
crowdsec: Quyết định chặn do chính máy chủ của bạn phát hiện khi có IP vi phạm kịch bản cục bộ.CAPI(Central API): Quyết định chặn được đồng bộ từ danh sách cộng đồng toàn cầu của CrowdSec. Đây là các IP đã tấn công máy chủ khác và bị đưa vào danh sách đen trước khi kịp chạm tới VPS của bạn.
2. Kiểm tra chỉ số phân tích log (Metrics)
Để biết CrowdSec có thực sự đọc đúng log của hệ thống hay không, sử dụng lệnh:
sudo cscli metricsBảng tổng kết sẽ cho bạn biết:
- Số dòng log đã đọc từ từng nguồn (
systemd,/var/log/nginx/access.log). - Số dòng log đã được phân tích cú pháp thành công (parsed).
- Số lần các kịch bản vi phạm được kích hoạt.
Nếu số dòng log đọc được liên tục tăng nhưng số lượng parsed bằng 0, bạn cần kiểm tra lại định dạng log format của Nginx hoặc xem service SSH có đang dùng cổng mặc định hay không.
3. Thêm và gỡ lệnh cấm IP thủ công
Nếu phát hiện một địa chỉ IP có hành vi bất thường, bạn có thể cấm thủ công bằng lệnh:
sudo cscli decisions add --ip 198.51.100.99 --duration 24h --reason "Scanning web vulnerability"Khi muốn gỡ cấm khẩn cấp cho một IP của người quản trị hoặc đồng nghiệp:
sudo cscli decisions delete --ip 198.51.100.994. Đối chiếu trực tiếp với kernel nftables
Để chắc chắn các IP bị cấm đã được bouncer đưa vào tầng tường lửa của Linux kernel, bạn chạy lệnh kiểm tra set của nftables:
sudo nft list set inet crowdsec-blacklists crowdsec-blacklistsToàn bộ các IP từ danh sách quyết định sẽ xuất hiện trong tập hợp băm của kernel. Mọi gói tin từ các IP này gửi tới bất kỳ cổng nào của VPS sẽ bị drop ngay tại card mạng.
Khi nào nên dùng CrowdSec, khi nào nên giữ Fail2ban?
Việc lựa chọn giữa hai công cụ phụ thuộc vào bài toán vận hành và tài nguyên sẵn có của bạn:
Nên giữ Fail2ban khi:
- VPS có cấu hình tối thiểu (1 vCPU, 512MB đến 1GB RAM) và cần tiết kiệm từng megabyte bộ nhớ cho ứng dụng chính.
- Máy chủ chỉ chạy các dịch vụ nội bộ, cổng SSH đã được đổi sang cổng khác và bảo vệ bằng xác thực SSH key an toàn cùng danh sách IP truy cập tương đối cố định theo quy tắc mở cổng tường lửa tối thiểu trên VPS.
- Bạn ưu tiên sự đơn giản tối đa: một dịch vụ duy nhất, không phụ thuộc vào kết nối mạng ra bên ngoài để tải danh sách chặn.
Nên chuyển sang CrowdSec khi:
- VPS có cấu hình từ 2GB RAM trở lên.
- Bạn vận hành các dịch vụ công cộng đối mặt trực tiếp với Internet (website thương mại điện tử, API backend, diễn đàn) và thường xuyên bị quét bởi các botnet phân tán.
- Bạn cần các hình thức xử lý linh hoạt hơn việc drop gói tin: ví dụ như hiển thị trang thử thách Captcha trên Nginx thay vì chặn hoàn toàn, hoặc muốn đồng bộ danh sách chặn lên Cloudflare WAF qua Cloudflare Bouncer.
Checklist kiểm tra an toàn sau khi cài đặt
- Dịch vụ
crowdsec.servicevàcrowdsec-firewall-bouncer.serviceđều ở trạng tháiactive (running). - Lệnh
cscli bouncers listhiển thị bouncer hợp lệ với cộtValidcó dấu tích. - Lệnh
cscli decisions listhiển thị danh sách các IP từ nguồnCAPI(chứng tỏ máy chủ đã đồng bộ thành công với mạng lưới cộng đồng). - Đã kiểm tra mức tiêu thụ RAM qua lệnh
free -hvàtop -b -n 1 -o %MEMđể đảm bảo hệ thống còn ít nhất 20% dung lượng RAM trống an toàn. - Kiểm tra kết nối SSH từ một thiết bị khác để đảm bảo firewall bouncer không khóa nhầm IP quản trị.



