Quản trị VPS

CrowdSec trên Linux VPS: Đánh giá khả năng chặn IP độc hại thời gian thực

Đánh giá CrowdSec trên Linux VPS: so sánh tài nguyên với Fail2ban, cơ chế nhận danh sách IP độc hại từ cộng đồng và cách cấu hình bouncer với nftables.

Đánh giá CrowdSec trên Linux VPS giải pháp thay thế Fail2ban
MỤC LỤC

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.

Kiến trúc hoạt động của CrowdSec trên Linux: Security Engine và Bouncer

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ò:

  1. Security Engine (crowdsec.service): Chịu trách nhiệm đọc log (từ systemd-journald hoặ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 IP 198.51.100.20 trong 4 giờ), nhưng bản thân nó không trực tiếp can thiệp vào tường lửa.
  2. 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ọi nftables, 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íFail2banCrowdSec (Engine + Bouncer)
Ngôn ngữ phát triểnPythonGo
Mức tiêu thụ RAM tĩnh (RSS)20MB – 35MB80MB – 120MB
Cơ chế phát hiệnRegex so khớp logParser + Scenario định dạng YAML
Nguồn dữ liệu đe dọaChỉ log cục bộ của VPSLog cục bộ + Danh sách IP cộng đồng
Khả năng chặn phân tánKé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ụngChỉ chặn cổng mạngHỗ trợ Captcha Nginx, chặn Cloudflare
Phù hợp với phần cứngVPS từ 512MB – 1GB RAMVPS 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ữ:

bash
curl -s https://packagecloud.io/install/repositories/crowdsec/crowdsec/script.deb.sh | sudo bash

Cài đặt gói Security Engine:

bash
sudo apt update
sudo apt install crowdsec -y

Trong 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ụ:

bash
sudo systemctl status crowdsec

Cà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:

bash
sudo apt install crowdsec-firewall-bouncer-nftables -y

Sau 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:

bash
sudo cscli bouncers list

Đầu ra mẫu xác nhận kết nối:

text
---------------------------------------------------------------------------------------------------------------------------------------
 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

bash
sudo cscli decisions list

Đầu ra sẽ liệt kê chi tiết từng quyết định cấm:

text
+--------+----------+--------------------+----------------------+--------+---------+----+--------+--------------------+
|   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:

bash
sudo cscli metrics

Bả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:

bash
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:

bash
sudo cscli decisions delete --ip 198.51.100.99

4. Đố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:

bash
sudo nft list set inet crowdsec-blacklists crowdsec-blacklists

Toà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

  1. Dịch vụ crowdsec.service và crowdsec-firewall-bouncer.service đều ở trạng thái active (running).
  2. Lệnh cscli bouncers list hiển thị bouncer hợp lệ với cột Valid có dấu tích.
  3. Lệnh cscli decisions list hiển thị danh sách các IP từ nguồn CAPI (chứng tỏ máy chủ đã đồng bộ thành công với mạng lưới cộng đồng).
  4. Đã kiểm tra mức tiêu thụ RAM qua lệnh free -h và 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.
  5. 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ị.
Nội dung hướng dẫn này có hữu ích với hệ thống của bạn không?

Chia sẻ bài viết hữu ích

Gửi bài viết này cho đồng nghiệp

Đọc tiếp

Bài nên đọc tiếp

Xem tất cả bài về Quản trị VPS