So sánh các phương pháp: Static Firewall vs. Fail2ban vs. CrowdSec
Khoảnh khắc bạn mở cổng 80 và 443 cho Nextcloud, Vaultwarden hoặc Plex, các đợt quét tự động sẽ bắt đầu. Chỉ trong vài phút, các bot bắt đầu dò quét các trang quản trị lộ diện, những lỗ hổng CVE đã biết và mật khẩu SSH yếu. Khi bảo vệ các dịch vụ self-hosted, người quản trị homelab thường lựa chọn giữa ba chiến lược sau:
- Quy tắc tường lửa tĩnh (UFW, iptables, pfSense): Chặn các cổng thô hoặc toàn bộ dải IP theo quốc gia hoạt động rất tốt ở lớp biên mạng (edge). Tuy nhiên, các quy tắc tĩnh hoàn toàn không có nhận thức về tầng ứng dụng (application-awareness). Một quy tắc mở cổng 443 không thể phân biệt giữa việc bạn truy cập Nextcloud và việc kẻ tấn công đang rải các payload duyệt thư mục trái phép (như
../../etc/passwd) qua reverse proxy của bạn. - Fail2ban: Tiêu chuẩn lâu đời cho homelab. Công cụ này giám sát các tệp log dạng text bằng biểu thức chính quy (regex) và áp dụng các lệnh cấm tạm thời thông qua các chuỗi tường lửa cục bộ. Nó hoạt động ổn định trên các máy chủ Linux độc lập, nhưng lại có điểm yếu lớn: chạy hoàn toàn biệt lập. Nếu một IP botnet quét qua 10.000 máy chủ trên internet trước khi nhắm tới bạn, Fail2ban vẫn sẽ bỏ qua nó cho đến khi máy chủ của bạn bị tấn công trực tiếp. Trong môi trường Docker, việc cấu hình Fail2ban còn đồng nghĩa với việc phải xử lý mount log từ đường dẫn host, chuyển tiếp systemd journal và các mẫu regex dễ bị lỗi.
- CrowdSec (Hệ thống phòng chống xâm nhập cộng đồng): CrowdSec kế thừa ý tưởng cốt lõi về phân tích log của Fail2ban và kết hợp với mạng lưới trí tuệ mối đe dọa phân tán. Khi một địa chỉ IP tấn công bất kỳ phiên bản CrowdSec nào trên toàn thế giới, tín hiệu đó sẽ được phân tích. Nếu đạt được sự đồng thuận, IP vi phạm sẽ được đưa vào danh sách chặn chung trên toàn cầu. CrowdSec cũng tách biệt phần phát hiện (Security Engine) khỏi phần thực thi (Bouncers), giúp việc triển khai trên các cụm container trở nên gọn gàng và chuẩn mực hơn rất nhiều.
Ưu và nhược điểm khi chạy CrowdSec trên Docker
Chạy CrowdSec Security Engine bên trong Docker cùng với các container khác giúp việc triển khai trở nên đơn giản, tuy nhiên bạn cũng cần lưu ý một vài điểm đánh đổi.
Ưu điểm
- Kiến trúc tách rời (Decoupled): CrowdSec engine chạy ở không gian người dùng (user space) và chỉ đảm nhận việc phân tích log. Nó không bao giờ cần quyền can thiệp trực tiếp vào kernel firewall. Việc thực thi chặn được chuyển giao cho các bouncer nhẹ chạy trên host, tại reverse proxy (như plugin Traefik hoặc module Nginx), hoặc thậm chí ngay trên router của bạn.
- Phòng thủ chủ động nhờ cộng đồng: Máy chủ của bạn được hưởng lợi từ các cuộc tấn công được phát hiện ở những nơi khác. Nếu một trình quét độc hại ở khu vực khác nhắm vào hàng nghìn trang web WordPress, engine của bạn sẽ tự động kéo quyết định cấm đó về trong các chu kỳ cập nhật định kỳ trước khi bot kịp chạm tới tên miền của bạn.
- Quy tắc YAML trực quan: Các scenario, parser và profile xử lý đều sử dụng các tệp YAML dễ đọc. Điều này giúp bạn dễ dàng quản lý phiên bản trên Git và triển khai trên nhiều node bằng Docker Compose.
- Sử dụng tài nguyên tối thiểu: Engine viết bằng Go rất nhanh và nhẹ. Trong hầu hết các homelab xử lý dưới 50 request mỗi giây, container chỉ chiếm khoảng 60MB RAM và lượng CPU không đáng kể ở trạng thái nhàn rỗi.
Nhược điểm
- Thiết lập nhiều thành phần: Quá trình bắt đầu đòi hỏi nhiều bước hơn so với việc chỉ chạy lệnh
apt install fail2ban. Bạn cần nắm rõ cách Local API (LAPI), thu thập log (acquis.yaml), các collection trên hub và bouncer giao tiếp với nhau. - Vấn đề che giấu IP trong Docker (IP Masquerading): Nếu reverse proxy hoặc mạng bridge của Docker không chuyển tiếp đúng IP thực của client (thông qua các header như
X-Forwarded-ForhoặcX-Real-IP), CrowdSec sẽ chỉ nhìn thấy gateway bridge nội bộ (ví dụ:172.18.0.1) và có nguy cơ cấm nhầm chính mạng proxy của bạn.
Cấu hình đề xuất cho môi trường HomeLab
Dưới đây là mô hình triển khai gọn gàng và thực tế cho một homelab đơn node:
- CrowdSec Security Engine (Docker): Chạy dưới dạng container, mở Local API (LAPI) tại
127.0.0.1:8080. Nó gắn kết (mount) ở chế độ chỉ đọc các thư mục log từ reverse proxy của bạn (Nginx Proxy Manager, Traefik hoặc Caddy) cùng với log xác thực của host. - Host Firewall Bouncer (Dịch vụ Native): Được cài đặt trực tiếp trên hệ điều hành host dưới dạng dịch vụ systemd iptables/nftables. Nó sẽ truy vấn LAPI của container và chặn các gói tin độc hại ngay tại cấp độ kernel của host trước khi lưu lượng kịp tới các container Docker.
- Hub Collections: Các gói quy tắc dựng sẵn được cài đặt bên trong container nhằm xử lý việc chống tấn công brute-force SSH, phân tích log xác thực Linux, ngăn chặn các khai thác HTTP phổ biến và đọc log truy cập của reverse proxy cụ thể.
Sự phân tách này giữ cho việc phân tích log nằm gọn trong Docker, đồng thời đảm bảo việc chặn các gói tin mạng thực tế diễn ra đúng vị trí tối ưu: trực tiếp trên lớp mạng của host.
Hướng dẫn triển khai từng bước
Bước 1: Thiết lập cấu trúc thư mục và Docker Compose
Tạo một thư mục chuyên dụng trên host để lưu cấu hình và cơ sở dữ liệu SQLite của CrowdSec:
sudo mkdir -p /opt/crowdsec/config /opt/crowdsec/data
cd /opt/crowdsec
Tạo tệp <a href="https://itnotes.dev/vi/dung-vat-lon-voi-cli-nua-tai-sao-dockge-la-trinh-quan-ly-docker-compose-tot-nhat-cho-homelab-cua-ban/">docker-compose.yml</a>:
services:
crowdsec:
image: crowdsecurity/crowdsec:v1.6.3
container_name: crowdsec
restart: unless-stopped
environment:
- GID=1000
- COLLECTIONS=crowdsecurity/linux crowdsecurity/sshd crowdsecurity/nginx crowdsecurity/http-cve
volumes:
- ./config:/etc/crowdsec
- ./data:/var/lib/crowdsec/data
- /var/log/auth.log:/var/log/auth.log:ro
- /var/log/syslog:/var/log/syslog:ro
- /var/log/nginx:/var/log/nginx:ro
ports:
- "127.0.0.1:8080:8080"
security_opt:
- no-new-privileges:true
Bước 2: Cấu hình thu thập log (Log Acquisition)
CrowdSec cần biết cần theo dõi những tệp log nào và định dạng log cần xử lý là gì. Hãy tạo tệp /opt/crowdsec/config/acquis.yaml:
filenames:
- /var/log/auth.log
- /var/log/syslog
labels:
type: syslog
---
filenames:
- /var/log/nginx/*.log
labels:
type: nginx
Khởi chạy container ở chế độ chạy nền để khởi tạo các cấu hình mặc định và cơ sở dữ liệu:
docker compose up -d
Bước 3: Xác minh Collections và Parsers
Sử dụng công cụ dòng lệnh của CrowdSec (cscli) bên trong container để đảm bảo các parser và scenario đã được nạp chính xác:
# Kiểm tra các collection scenario đã cài đặt
docker exec crowdsec cscli collections list
# Xác nhận các bộ phân tích log (parsers) đang hoạt động
docker exec crowdsec cscli parsers list
# Xem các chỉ số xử lý theo thời gian thực
docker exec crowdsec cscli metrics
Bước 4: Cài đặt Host Firewall Bouncer
Container đảm nhận việc phát hiện mối đe dọa, nhưng cần một công cụ thực thi để chặn lưu lượng độc hại trên host. Trước tiên, hãy tạo một API key cho bouncer bên trong container:
docker exec crowdsec cscli bouncers add host-firewall-bouncer
Sao chép khóa vừa được tạo từ kết quả đầu ra trên terminal. Tiếp theo, thêm repository chính thức và cài đặt firewall bouncer trên máy host của bạn (ví dụ trên Debian/Ubuntu):
curl -s https://packagecloud.io/install/repositories/crowdsec/crowdsec/script.deb.sh | sudo bash
sudo apt-get install -y crowdsec-firewall-bouncer-iptables
Mở tệp /etc/crowdsec/bouncers/crowdsec-firewall-bouncer.yaml trên host và cấu hình kết nối tới LAPI của bạn:
api_url: http://127.0.0.1:8080/
api_key: DIEN_API_KEY_VUA_TAO_TAI_DAY
inactivity_threshold: 10s
ipset_type: nethash
Khởi động và kích hoạt dịch vụ bouncer:
sudo systemctl restart crowdsec-firewall-bouncer
sudo systemctl status crowdsec-firewall-bouncer
Bước 5: Kiểm tra khả năng phát hiện và thực thi quy tắc
Xác minh rằng cấu hình cục bộ của bạn đang giao tiếp tốt với mạng lưới toàn cầu và áp dụng chính xác các quyết định chặn:
# Liệt kê các quyết định cấm cục bộ và từ cộng đồng đang có hiệu lực
docker exec crowdsec cscli decisions list
# Kiểm tra thủ công lệnh cấm 10 phút đối với một IP thử nghiệm (RFC 5737)
docker exec crowdsec cscli decisions add --ip 192.0.2.1 --type ban --duration 10m --reason "Lệnh cấm thử nghiệm thủ công"
# Xác minh IP thử nghiệm đã được thêm vào bảng ipset của kernel trên host
sudo ipset list | grep 192.0.2.1
# Dọn dẹp lệnh cấm thử nghiệm
docker exec crowdsec cscli decisions delete --ip 192.0.2.1
Sau khi hoàn tất thiết lập này, homelab của bạn giờ đây đã chủ động giám sát lưu lượng truy cập đến, tự động cập nhật danh sách đe dọa từ cộng đồng và chặn đứng các tác nhân xấu ngay tại tường lửa host trước khi chúng có thể tiếp cận các container self-hosted của bạn.

