Cấu hình fail2ban chống brute-force SSH trên Ubuntu 24.04

Bạn SSH vào VPS mới, check journalctl -u ssh và thấy hàng trăm lần đăng nhập thất bại từ IP lạ chỉ trong vài phút. Đó là brute-force SSH. Nếu không chặn, một ngày đẹp trời, ai đó có thể leo vào server của bạn. Fail2ban là giải pháp đơn giản nhất: nó đọc log SSH, đếm số lần fail, và tự động thêm rule firewall chặn IP đó trong vài giây. Bài này hướng dẫn bạn cài và cấu hình fail2ban trên Ubuntu 24.04 LTS để chống brute-force SSH hiệu quả.
Yêu cầu trước khi bắt đầu
- Một VPS chạy Ubuntu 24.04 (bạn có thể thuê VPS Ubuntu với IPv4 Việt Nam, NVMe SSD).
- Quyền
sudohoặc root. - SSH đang chạy mặc định trên port 22 (bài này áp dụng cả nếu bạn đã đổi port thì chỉnh jail sau).
- Firewall UFW hoặc iptables đã bật (fail2ban làm việc với cả hai).
Fail2ban hoạt động thế nào
Fail2ban là một daemon viết bằng Python. Nó theo dõi các file log (như /var/log/auth.log hoặc journalctl) và so khớp với các pattern đã định nghĩa (ví dụ: "Failed password for invalid user"). Khi số lần xuất hiện vượt ngưỡng trong một khoảng thời gian, fail2ban sẽ thêm một rule vào firewall (iptables/nftables/UFW) để chặn IP đó. Mặc định, nó chặn trong 10 phút, sau đó tự động gỡ. Bạn có thể tùy chỉnh toàn bộ.
Bước 1 - Cài đặt fail2ban
Cập nhật package và cài fail2ban từ kho Ubuntu chính thức:
sudo apt update
sudo apt install fail2ban -y
Sau khi cài xong, dịch vụ chưa tự động chạy để tránh xung đột cấu hình mặc định. Bạn cần tạo file jail local trước.
Kiểm tra phiên bản:
fail2ban-server --version
Kết quả mong đợi: Fail2Ban v1.0.x (bản mới nhất trên Ubuntu 24.04).
Khởi động dịch vụ:
sudo systemctl enable --now fail2ban
sudo systemctl status fail2ban
Output: active (running).
Bước 2 - Cấu hình jail.local cho SSH
KHÔNG sửa file /etc/fail2ban/jail.conf vì nó sẽ bị ghi đè khi cập nhật. Thay vào đó, tạo file /etc/fail2ban/jail.local với nội dung bạn muốn ghi đè:
sudo nano /etc/fail2ban/jail.local
Dán nội dung sau (tập trung vào SSH, loại bỏ các jail không dùng để giảm tải):
[DEFAULT]
# Thời gian chặn: 10 phút (600 giây). Bạn có thể tăng lên 1h (3600) nếu muốn.
bantime = 600
# Thời gian theo dõi: 10 phút
findtime = 600
# Số lần fail tối đa trong findtime để bị chặn
maxretry = 5
# Bỏ qua các IP nội bộ và dải private
ignoreip = 127.0.0.1/8 ::1
# Gửi email cảnh báo (tắt nếu không dùng)
action = %(action_)s
[sshd]
enabled = true
port = ssh
logpath = %(sshd_log)s
backend = %(sshd_backend)s
# Nếu bạn đã đổi SSH port sang 2222, chỉnh: port = 2222
# Nếu muốn chặn lâu dài sau lần fail thứ 10, thêm:
# bantime = -1
# maxretry = 10
Giải thích các tham số:
| Tham số | Giá trị | Ý nghĩa |
|---|---|---|
bantime | 600 | Thời gian chặn (giây). 600s = 10 phút. |
findtime | 600 | Khung thời gian để đếm số lần fail. |
maxretry | 5 | Số lần fail tối đa trong findtime trước khi bị chặn. |
ignoreip | 127.0.0.1/8 ::1 | IP hiếm khi bị chặn (thêm IP văn phòng, VPN của bạn vào đây). |
Bước 3 - Cập nhật ignoreip với IP tin cậy của bạn
Đừng vội enable jail nếu chưa thêm IP của bạn vào danh sách trắng. Nếu bạn SSH từ IP tĩnh của văn phòng hoặc VPN, hãy thêm vào ignoreip trong /etc/fail2ban/jail.local:
ignoreip = 127.0.0.1/8 ::1 123.123.123.0/24 203.0.113.0/24
Trong đó, 123.123.123.0/24 là ví dụ. Bạn lấy IP thật qua:
curl ifconfig.me
Nếu IP nhà bạn là động, bạn có thể bỏ qua bước này và chỉ thêm dải VPN. Nhưng nếu không, rủi ro bạn tự chặn chính mình khi thao tác sai nhiều lần là có thật.
Bước 4 - Khởi động và verify jail SSH
Sau khi cấu hình xong, restart fail2ban:
sudo systemctl restart fail2ban
Kiểm tra jail SSH đã được kích hoạt:
sudo fail2ban-client status sshd
Output mong đợi:
Status for the jail: sshd
|- Filter
| |- Currently failed: 0
| |- Total failed: 0
| `- File list: /var/log/auth.log
`- Actions
|- Currently banned: 0
|- Total banned: 0
`- Banned IP list:
Nếu bạn thấy "Jail 'sshd' not found" có nghĩa là cú pháp jail.local sai hoặc SSH jail chưa được enabled. Kiểm tra lại file cấu hình.
Xem log fail2ban để biết chi tiết:
sudo tail -f /var/log/fail2ban.log
Bước 5 - Kiểm tra khả năng chặn thực tế
Để chắc chắn fail2ban hoạt động, bạn có thể tự test bằng cách SSH sai mật khẩu nhiều lần. Mở terminal khác, chạy:
ssh root@your-vps-ip
Nhập sai mật khẩu 6 lần (vì maxretry = 5). Sau lần thứ 6, kết nối từ terminal đó sẽ bị từ chối ngay lập tức (Connection refused).
Kiểm tra lại trạng thái jail SSH:
sudo fail2ban-client status sshd
Bây giờ bạn sẽ thấy:
Status for the jail: sshd
|- Currently banned: 1
|- Total banned: 1
`- Banned IP list: 203.0.113.5 <- IP của bạn bị chặn tạm thời
Để bỏ chặn IP của bạn (sau khi test xong):
sudo fail2ban-client set sshd unbanip 203.0.113.5
Bước 6 - Tinh chỉnh nâng cao
Một số tùy chỉnh hữu ích:
- Chặn lâu dài nếu fail quá nhiều: thêm vào jail.local trong [sshd]:
bantime = -1vàmaxretry = 10. IP sẽ bị block forever nếu fail 10 lần. - Gửi email khi có IP bị chặn: cài
sudo apt install sendmail -yvà chỉnh action thànhaction = %(action_mwl)s(gửi email kèm log). Thêmdestemail = [email protected]vào [DEFAULT]. - Bảo vệ thêm các dịch vụ khác: fail2ban có sẵn jail cho Apache, Nginx, Postfix, Dovecot,... Bạn chỉ cần enabled chúng trong jail.local với cấu hình tương tự.
Xử lý lỗi thường gặp
1. Fail2ban không chặn IP dù log có fail:
Nguyên nhân thường do backend không đọc được log. Trên Ubuntu 24.04, sshd dùng journald. Hãy chắc chắn trong /etc/fail2ban/jail.local bạn có:
backend = systemd
logpath = journal
hoặc để backend = %(sshd_backend)s mặc định.
2. Lỗi "Permission denied" khi fail2ban đọc log:
Kiểm tra quyền của file log:
sudo ls -l /var/log/auth.log
sudo ls -l /var/log/syslog
Fail2ban chạy với user fail2ban, cần có quyền đọc. Nếu không, thêm user vào group adm:
sudo usermod -aG adm fail2ban
sudo systemctl restart fail2ban
3. Không khởi động được fail2ban:
Kiểm tra cú pháp file jail.local:
sudo fail2ban-client -d 2>&1 | head -50
Nếu có lỗi cú pháp, sửa lại file /etc/fail2ban/jail.local. Thường gặp nhất là thiếu dấu = hoặc thụt đầu dòng sai.
Câu hỏi thường gặp
Có cần restart fail2ban mỗi khi thay đổi jail.local không?
Có. Sau khi sửa jail.local, bạn phải chạy sudo systemctl restart fail2ban để áp dụng.
Fail2ban có ảnh hưởng đến hiệu năng VPS không?
Rất ít. Fail2ban chỉ đọc log và so pattern, tốn rất ít CPU/RAM. Trên VPS Linux bạn có thể bật thoải mái mà không lo ảnh hưởng.
Tôi có thể chặn lâu dài tất cả IP lạ không?
Không nên. Fail2ban chỉ chặn IP có dấu hiệu tấn công (fail liên tục). Nếu bạn muốn chặn tất cả IP lạ, hãy dùng UFW firewall và chỉ cho phép IP tin cậy.
Làm sao để xem danh sách IP đã bị chặn?
Dùng lệnh sudo fail2ban-client status sshd. Để xem log chi tiết, dùng sudo tail -f /var/log/fail2ban.log.
Fail2ban có thể chặn brute-force cho WordPress không?
Có. Bạn có thể enabled jail [wordpress] nếu có log riêng. Hoặc dùng plugin Wordfence kết hợp. Fail2ban vẫn là lớp bảo vệ tốt cho SSH.
Tôi muốn chặn IP lâu dài sau lần fail thứ 10 thì làm thế nào?
Trong [sshd] của jail.local, thêm bantime = -1 và maxretry = 10. IP sẽ bị block forever khi fail 10 lần.
Bài viết liên quan
- Cách cài Docker trên VPS Ubuntu
- Hướng dẫn cấu hình UFW firewall trên Ubuntu VPS
- Cấu hình iptables cơ bản cho VPS Ubuntu 24.04
- Tối ưu Linux và NVMe cho workload I/O cao trên VPS


