Hướng dẫn cấu hình Fail2Ban bảo vệ SSH trên VPS Ubuntu 24.04

Vấn đề: SSH bị quét mật khẩu liên tục
Mỗi khi bạn thuê VPS mới và bật dịch vụ SSH với port mặc định 22, gần như ngay lập tức các bot từ khắp nơi trên Internet sẽ bắt đầu quét và thử đăng nhập bằng danh sách tài khoản/mật khẩu phổ biến. Đây là cuộc tấn công brute-force tự động. Nếu bạn dùng mật khẩu yếu, VPS của bạn sẽ bị chiếm quyền điều khiển trong vài giờ. Bài viết này hướng dẫn chi tiết cách dùng Fail2Ban trên VPS Ubuntu 24.04 để tự động phát hiện và chặn các IP tấn công, giúp bạn an tâm hơn khi quản trị hệ thống từ xa.
Yêu cầu trước khi bắt đầu
- Một VPS Linux chạy Ubuntu 24.04 LTS (các phiên bản khác thao tác tương tự).
- Quyền sudo hoặc root.
- SSH đã hoạt động (bạn đã đăng nhập được).
- Kiến thức cơ bản: biết dùng terminal, hiểu khái niệm rule firewall là lợi thế.
Fail2Ban là gì và hoạt động thế nào?
Fail2Ban là một chương trình mã nguồn mở giúp phát hiện và ngăn chặn các cuộc tấn công brute-force. Nó hoạt động bằng cách giám sát các file log của dịch vụ (ví dụ: /var/log/auth.log cho SSH). Khi phát hiện một IP có quá số lần thất bại trong một khoảng thời gian nhất định (mặc định là 5 lần trong 10 phút), nó sẽ tự động tạo một rule tường lửa (firewall) để chặn IP đó trong thời gian cấu hình (mặc định 10 phút). Đây là lớp bảo vệ thiết yếu cho bất kỳ máy chủ nào kết nối Internet, đặc biệt là các dịch vụ như VPS Linux mà bạn quản trị qua SSH.
Bước 1 - Cài đặt Fail2Ban
Cập nhật danh sách gói và cài đặt Fail2Ban từ kho lưu trữ mặc định của Ubuntu. Lệnh này rất an toàn và nhanh chóng.
sudo apt update
sudo apt install fail2ban -ySau khi cài xong, dịch vụ sẽ tự động khởi động. Kiểm tra trạng thái:
sudo systemctl status fail2banBạn sẽ thấy trạng thái active (running). Nếu chưa chạy, hãy khởi động thủ công:
sudo systemctl start fail2ban
sudo systemctl enable fail2ban
Bước 2 - Cấu hình Jail cho SSH
Fail2Ban sử dụng khái niệm "jail" để quản lý các quy tắc cho từng dịch vụ. File cấu hình mặc định là /etc/fail2ban/jail.conf, nhưng bạn không nên sửa trực tiếp file này vì nó sẽ bị ghi đè khi cập nhật. Thay vào đó, tạo file cấu hình cục bộ tại /etc/fail2ban/jail.local.
Tạo và mở file cấu hình để chỉnh sửa:
sudo nano /etc/fail2ban/jail.localThêm nội dung sau vào file. Phần [sshd] là jail dành riêng cho SSH:
[DEFAULT]
# Thời gian chặn mặc định: 1 giờ (3600 giây)
bantime = 3600
# Thời gian theo dõi: 10 phút
findtime = 600
# Số lần thất bại tối đa trong findtime
maxretry = 5
# Bỏ qua các địa chỉ IP nội bộ (hiếm khi chặn)
ignoreip = 127.0.0.1/8 ::1
[sshd]
enabled = true
port = ssh
# Hoặc nếu bạn đổi port SSH, hãy ghi đúng port: port = 2222
logpath = %(sshd_log)s
backend = %(sshd_backend)sGiải thích các tham số quan trọng:
- bantime: Thời gian (giây) mà một IP bị chặn. Giá trị 3600 = 1 giờ. Bạn có thể đặt cao hơn như 86400 (24 giờ).
- findtime: Khoảng thời gian (giây) để Fail2Ban đếm số lần thất bại.
- maxretry: Số lần thất bại tối đa cho phép trước khi bị chặn.
- ignoreip: Danh sách IP hiếm khi bị chặn (nên thêm IP tĩnh của bạn vào đây nếu có).
Sau khi chỉnh sửa, lưu file (Ctrl+O, Enter) và thoát (Ctrl+X).
Bước 3 - Khởi động lại và kiểm tra Jail
Khởi động lại Fail2Ban để áp dụng cấu hình mới:
sudo systemctl restart fail2banKiểm tra trạng thái của jail SSH để xem nó đã hoạt động chưa:
sudo fail2ban-client status sshdOutput mong đợi sẽ tương tự như sau:
Status for the jail: sshd
|- Filter
| |- Currently failed: 0
| |- Total failed: 0
| `- Journal matches: _SYSTEMD_UNIT=sshd.service + _COMM=sshd
`- Actions
|- Currently banned: 0
|- Total banned: 0
`- Banned IP list:Nếu bạn thấy Status for the jail: sshd và không có lỗi, nghĩa là Fail2Ban đã sẵn sàng bảo vệ SSH của bạn.
Bước 4 - Mô phỏng và kiểm tra tính năng chặn
Để chắc chắn Fail2Ban hoạt động, bạn có thể mô phỏng một cuộc tấn công brute-force từ chính VPS đó hoặc một máy khác. Cảnh báo: Chỉ thực hiện trên VPS của bạn, không thử lên máy chủ của người khác.
Từ một terminal khác (hoặc chính VPS), đăng nhập SSH với mật khẩu sai liên tục 6 lần (nhiều hơn maxretry = 5):
ssh root@your-server-ipNhập sai mật khẩu 6 lần. Sau đó, quay lại terminal VPS chính và kiểm tra lại trạng thái jail:
sudo fail2ban-client status sshdLúc này bạn sẽ thấy Currently banned: 1 và địa chỉ IP bị chặn xuất hiện trong danh sách. Bạn cũng có thể kiểm tra rule tường lửa:
sudo nft list set inet f2b-table addr-set-sshdHoặc nếu hệ thống dùng iptables cũ:
sudo iptables -L -nBạn sẽ thấy một chain tên f2b-sshd chứa IP bị chặn.
Xử lý lỗi thường gặp
Lỗi: Không tìm thấy file log
Fail2Ban không tìm thấy file log SSH. Kiểm tra xem SSH có đang ghi log không bằng lệnh journalctl -u ssh. Nếu dùng Ubuntu 24.04, file log thường ở /var/log/auth.log hoặc qua journald. Cấu hình backend trong jail.local thành systemd nếu cần.
Lỗi: Không thể khởi động Fail2Ban
Kiểm tra log lỗi của Fail2Ban:
sudo journalctl -u fail2ban -n 50Lỗi thường do sai cú pháp trong file jail.local. Kiểm tra lại file cấu hình, đảm bảo không có dấu cách thừa hoặc thiếu dấu ngoặc.
Fail2Ban chặn nhầm IP của tôi
Nếu bạn vô tình bị chặn, hãy bỏ chặn thủ công bằng lệnh:
sudo fail2ban-client set sshd unbanip YOUR_IP_ADDRESSSau đó thêm IP của bạn vào danh sách ignoreip trong jail.local để tránh bị chặn lại.
Câu hỏi thường gặp
Fail2Ban có làm chậm VPS không?
Không. Fail2Ban rất nhẹ, chỉ tiêu tốn vài MB RAM và gần như không ảnh hưởng đến CPU vì nó chỉ quét log và cập nhật rule tường lửa.
Tôi có cần cấu hình gì khác cho dịch vụ web (Nginx, Apache) không?
Có. Fail2Ban có thể bảo vệ cả Nginx và Apache khỏi tấn công brute-force vào login page. Bạn chỉ cần tạo thêm jail tương ứng trong file jail.local với các filter có sẵn như nginx-http-auth hoặc apache-auth.
Nếu tôi đổi port SSH, tôi có cần sửa cấu hình Fail2Ban không?
Có. Bạn cần thay đổi giá trị port trong jail [sshd] thành port mới. Ví dụ: port = 2222.
Làm sao để xem danh sách IP đang bị chặn?
Dùng lệnh sudo fail2ban-client status sshd. Tại mục Banned IP list, bạn sẽ thấy tất cả IP đang bị chặn.
Fail2Ban có tự động xóa IP sau thời gian bantime không?
Có. Sau khi hết thời gian bantime, IP đó sẽ tự động được bỏ chặn và có thể thử đăng nhập lại. Nếu tiếp tục thất bại, nó sẽ bị chặn lại với thời gian tương tự hoặc lâu hơn.
Bài viết liên quan
- Cấu hình UFW firewall cơ bản trên VPS Ubuntu
- 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


