Bản chất của các đợt quét SSH tự động và lạm dụng xác thực
Hãy thử khởi tạo một VPS unmanaged, mở cổng 22 ra ngoài internet và theo dõi log hệ thống. Chỉ trong vòng mười lăm phút, các bot tự động sẽ bắt đầu gõ cửa. Một máy chủ thông thường kết nối internet công cộng phải hứng chịu từ 1.000 đến 5.000 lượt xác thực trái phép mỗi ngày, khi các công cụ quét liên tục thử các danh sách tài khoản phổ biến như root, admin, deploy và test.
Nút thắt cổ chai cốt lõi nằm ở chính cơ chế hoạt động của SSH. OpenSSH thiết lập kết nối TCP, hoàn tất quá trình trao đổi khóa mã hóa và tính toán khóa phiên trước khi kiểm tra mật khẩu. Quá trình bắt tay này tiêu tốn rất nhiều tài nguyên tính toán. Nhân con số đó với hàng chục yêu cầu mỗi phút, các bot quét sẽ làm tiêu hao chu kỳ CPU, làm tràn ngập log hệ thống (/var/log/auth.log hoặc systemd journal) và không ngừng dò tìm các tài khoản có thông tin đăng nhập yếu.
Xác thực bằng SSH key và đổi sang cổng non-standard có thể giúp giảm bớt, nhưng không loại bỏ được lưu lượng truy cập không mong muốn. Bạn cần một hệ thống phòng thủ biên tự động, có khả năng drop các gói tin độc hại ngay ở cấp độ kernel trước khi chúng chạm tới các daemon tầng userland.
So sánh kiến trúc các cơ chế lọc gói tin
Việc kết nối các công cụ giám sát log với bộ lọc gói tin không phải là điều mới mẻ. Trong nhiều năm, các quản trị viên đã dựa vào iptables hoặc các wrapper ở tầng ứng dụng. Giờ đây, nftables mang đến một cách tiếp cận vượt trội hơn về mặt kiến trúc.
Dưới đây là cách ba chiến lược chặn gói tin chính hoạt động khi đối mặt với lưu lượng tấn công dồn dập:
- Fail2ban kết hợp với Iptables truyền thống: Thêm từng quy tắc
-j DROPriêng lẻ cho mỗi IP bị cấm. Khi một botnet quy mô lớn tấn công và danh sách chặn vượt quá 5.000 địa chỉ, Linux kernel phải duyệt tuần tự từng quy tắc cho mỗi gói tin gửi đến. Cơ chế đánh giá tuyến tính O(N) này làm tăng độ trễ rõ rệt cho các kết nối hợp lệ. - TCP Wrappers (
hosts.deny) / Danh sách chặn tầng ứng dụng: Chặn lưu lượng hoàn toàn trong userspace. Kernel vẫn phải hoàn tất quy trình bắt tay 3 bước của TCP và đánh thức tiến trình daemon, gây lãng phí RAM, socket handle và tạo ra các context switch không cần thiết. - Fail2ban kết hợp với Nftables Set: Ghi trực tiếp các địa chỉ bị cấm vào các set nguyên tử trong kernel. Chi phí tra cứu giảm từ quét tuyến tính O(N) xuống mức tra cứu hash table O(1). Dù bạn chặn 15 IP hay 50.000 IP, tốc độ lọc gói tin vẫn tức thì.
Ưu và nhược điểm khi tích hợp Nftables
Trước khi chuẩn hóa nftables trên toàn bộ hạ tầng của bạn, hãy cân nhắc các yếu tố đánh đổi trong vận hành.
Ưu điểm
- Mức tiêu hao CPU và bộ nhớ ổn định: Lưu trữ hàng nghìn IP bị chặn trong các hash set gốc giúp việc lọc gói tin luôn nhẹ tải. Trên một máy chủ cloud khiêm tốn với 2 vCPU và 4 GB RAM đối mặt với làn sóng 20.000 lệnh cấm kéo dài, mức sử dụng CPU kernel trong quá trình kiểm tra gói tin gần như không đổi—khác hẳn với iptables khi tải softirq có thể bị đẩy lên hơn 15%.
- Thao tác Set nguyên tử (Atomic): Fail2ban thêm và xóa các phần tử trong bộ nhớ một cách linh hoạt mà không cần flush hay nạp lại toàn bộ ruleset tường lửa đang hoạt động.
- Xử lý thống nhất IPv4 và IPv6: Bạn có thể quản lý bộ lọc dual-stack bên trong một bảng family
inetduy nhất thay vì phải chạy các lệnhiptablesvàip6tablesriêng biệt.
Nhược điểm
- Thói quen sử dụng câu lệnh: Các lệnh quen thuộc như
iptables -L -nsẽ không hiển thị các IP đang bị cấm được lưu trong nftables set, trừ khi hệ thống có cấu hình lớp tương thích. - Yêu cầu về phiên bản gói: Để hành động tương tác với nftables set hoạt động ổn định, hệ thống cần Fail2ban phiên bản 0.11.x trở lên. Nếu bạn đang quản trị các bản phân phối Linux đời cũ, bạn sẽ cần cài đặt từ kho backport.
Môi trường triển khai khuyến nghị
Hướng dẫn này áp dụng cho các bản phân phối Linux hiện đại chạy kernel 5.4 trở lên—bao gồm Debian 11/12, Ubuntu 22.04/24.04, AlmaLinux 9 và Rocky Linux 9. Chúng ta sẽ kết hợp Fail2ban 1.0+ với các set gốc của Nftables bằng action nftables-multiport, đồng thời lấy dữ liệu sự kiện xác thực trực tiếp từ systemd journal.
Hướng dẫn triển khai chi tiết
1. Cài đặt các gói cần thiết
Cài đặt cả hai gói phần mềm thông qua trình quản lý gói của hệ thống:
# Trên Ubuntu / Debian
sudo apt update
sudo apt install -y fail2ban nftables
# Trên AlmaLinux / Rocky Linux / RHEL 9
sudo dnf install -y epel-release
sudo dnf install -y fail2ban nftables
Bật và khởi động engine xử lý gói tin nftables:
sudo systemctl enable --now nftables
2. Cấu hình các thiết lập chung cho Fail2ban
Không bao giờ chỉnh sửa trực tiếp file /etc/fail2ban/jail.conf; các bản cập nhật từ nhà phân phối sẽ ghi đè lên các thay đổi của bạn. Thay vào đó, hãy đặt cấu hình tùy chỉnh trong một file override riêng biệt tại /etc/fail2ban/jail.local:
sudo cp /etc/fail2ban/jail.conf /etc/fail2ban/jail.local
sudo nano /etc/fail2ban/jail.local
Tìm section [DEFAULT] và áp dụng các cấu hình sau để thiết lập dải IP tin cậy, thời gian phạt và action dùng nftables:
[DEFAULT]
# Loại trừ localhost và các dải mạng nội bộ VPN/văn phòng
ignoreip = 127.0.0.1/8 ::1 10.8.0.0/24 192.168.1.50
# Khung thời gian theo dõi và ngưỡng kích hoạt phạt
findtime = 10m
maxretry = 5
bantime = 1h
# Tăng thời gian phạt theo cấp số nhân đối với bot cố tình tấn công lặp lại
bantime.increment = true
bantime.factor = 2
bantime.maxtime = 4w
# Chuyển hướng chặn gói trực tiếp vào các Nftables set ở cấp kernel
banaction = nftables-multiport
banaction_allports = nftables-allports
3. Định nghĩa Jail cho dịch vụ SSH
Để dễ quản lý theo dạng module, hãy định nghĩa các jail cho từng dịch vụ trong các drop-in file riêng. Tạo file /etc/fail2ban/jail.d/sshd.local:
[sshd]
enabled = true
port = ssh
backend = systemd
maxretry = 3
findtime = 10m
bantime = 24h
4. Kiểm tra và xác thực các quy tắc lọc
Fail2ban phân tích log dựa trên các mẫu regex được định nghĩa trong /etc/fail2ban/filter.d/. Trước khi kích hoạt bất kỳ jail nào trên môi trường production, hãy đảm bảo regex khớp chính xác với định dạng log thực tế trên hệ thống:
sudo fail2ban-regex systemd-journal /etc/fail2ban/filter.d/sshd.conf
Xem phần tóm tắt kết quả trả về. Nếu quy tắc bắt đúng các lần nhập sai mật khẩu và yêu cầu từ user không hợp lệ trong journal, hệ thống đã sẵn sàng áp dụng lệnh chặn.
5. Khởi động Fail2ban và kiểm tra trạng thái trong Kernel
Áp dụng cấu hình và khởi động daemon:
sudo systemctl enable --now fail2ban
Kiểm tra trạng thái hoạt động của jail bằng lệnh fail2ban-client:
sudo fail2ban-client status sshd
Khi kẻ tấn công chạm ngưỡng vi phạm, hãy quan sát cách nftables xử lý việc chặn gói. Thay vì tạo ra một chuỗi dài các quy tắc đơn lẻ, nftables quản lý các lệnh cấm gọn gàng trong một named set:
sudo nft list table inet f2b-table
Kết quả hiển thị cho thấy các phần tử đang hoạt động được lưu trữ trong một kernel set tốc độ cao:
table inet f2b-table {
set addr-set-sshd {
type ipv4_addr
elements = { 198.51.100.23, 203.0.113.88 }
}
chain f2b-chain-sshd {
type filter hook input priority filter - 1; policy accept;
meta l4proto tcp ip saddr @addr-set-sshd tcp dport 22 drop
}
}
6. Quản lý lệnh cấm thủ công và gỡ cấm khẩn cấp
Trong trường hợp kỹ sư vô tình bị khóa IP khi làm việc tại nhà hoặc bạn cần chủ động chặn một địa chỉ IP khả nghi, hãy sử dụng trực tiếp lệnh client mà không cần sửa file cấu hình:
# Gỡ lệnh cấm do thao tác nhầm
sudo fail2ban-client set sshd unbanip 198.51.100.23
# Chặn ngay lập tức một địa chỉ IP độc hại
sudo fail2ban-client set sshd banip 203.0.113.99

