Hướng Dẫn Cài Đặt Fail2ban Chống Brute-Force SSH (2026)

Tóm tắt nhanh: Fail2ban chống brute-force SSH bằng cách liên tục giám sát file log hệ thống (auth.log trên Ubuntu, secure trên CentOS) để phát hiện các địa chỉ IP đăng nhập sai mật khẩu nhiều lần. Khi số lần thất bại vượt ngưỡng maxretry, Fail2ban tự động thêm rule vào tường lửa (iptables, UFW, Firewalld) để chặn IP đó truy cập vào port SSH — không cần can thiệp thủ công.

  • Cài đặt nhanh qua apt (Ubuntu/Debian) hoặc yum (CentOS/RHEL) — không phụ thuộc gói bên thứ ba trừ kho EPEL trên CentOS.
  • Bắt buộc VPS đã bật tường lửa (UFW hoặc Firewalld) — nếu chưa bật, Fail2ban cài xong vẫn không chặn được IP nào.
  • Không bao giờ sửa trực tiếp jail.conf; toàn bộ cấu hình tùy chỉnh đặt trong jail.local để tránh bị ghi đè khi update.
  • Gỡ chặn IP bị khóa nhầm chỉ cần một lệnh fail2ban-client set sshd unbanip <IP>.

Mở file /var/log/auth.log ra mà thấy hàng trăm dòng kiểu “Failed password for root from 45.89.233.x port 52341” chạy liên tục — đó là dấu hiệu rõ nhất VPS của bạn đang bị botnet quét mật khẩu SSH. Không phải vài lần, mà hàng nghìn lần mỗi giờ. CPU tăng cao không vì lý do rõ ràng? Rất có thể đây là nguyên nhân. Đổi port SSH hay cài mật khẩu phức tạp làm giảm rủi ro, nhưng vẫn không ngăn được băng thông và tài nguyên hệ thống bị nuốt dần bởi các kết nối rác. Fail2ban xử lý đúng tầng đó — phát hiện pattern tấn công, đóng cửa ngay tại firewall trước khi SSH kịp phản hồi. Bài này đi thẳng vào CLI: lệnh cài, file cấu hình, cách test thực tế, và cách xử lý khi lỡ tay tự chặn IP của chính mình.

auth.log bị tấn công brute-force SSH
auth.log bị tấn công brute-force SSH

Chuẩn bị trước khi cài đặt Fail2ban cho VPS

Yêu cầu tối thiểu: VPS chạy Linux (Ubuntu 20.04/22.04/24.04 hoặc CentOS 7/8/Stream), quyền root hoặc tài khoản có sudo. Đây là phần hầu hết hướng dẫn bỏ qua nhưng lại gây ra 80% trường hợp “cài xong không thấy chặn gì”: tường lửa phải được bật trước. Fail2ban không tự tạo rule firewall từ đầu — nó chỉ thêm rule vào engine sẵn có (iptables, UFW, Firewalld). Không có engine đó, lệnh ban IP chạy cũng như không.

Kiểm tra nhanh trạng thái UFW (Ubuntu):

sudo ufw status
Trạng thái UFW đang bật
Trạng thái UFW đang bật

Nếu thấy Status: inactive thì bật trước:

sudo ufw allow 22/tcp
sudo ufw enable

Trên CentOS, kiểm tra Firewalld:

sudo systemctl status firewalld

Mẹo từ InterData: Trước khi bắt đầu, mở hai phiên SSH song song vào VPS. Nếu cấu hình sai làm Fail2ban tự chặn IP của bạn, bạn vẫn còn session thứ hai để vào gỡ. Mất cả hai session mà không có KVM/console thì tình huống rất phức tạp.

Hướng dẫn cài đặt Fail2ban trên hệ điều hành Linux

Fail2ban có trong repository chính thức của Ubuntu/Debian. Với CentOS/RHEL, cần thêm kho EPEL trước — đây là điểm khác biệt quan trọng, bỏ qua bước này sẽ báo lỗi “No package fail2ban available”.

Cài đặt trên Ubuntu / Debian

Cập nhật danh sách package trước, sau đó cài:

sudo apt update && sudo apt install fail2ban -y

Flag -y tự động xác nhận toàn bộ prompt, không cần ngồi gõ “Y” thủ công. Sau khi cài xong, Fail2ban tự khởi động — kiểm tra nhanh bằng sudo systemctl status fail2ban.

Trạng thái cài đặt Fail2ban thành công
Trạng thái cài đặt Fail2ban thành công

Cài đặt trên CentOS / RHEL

CentOS không đưa Fail2ban vào repo mặc định, phải thêm kho EPEL (Extra Packages for Enterprise Linux) trước:

sudo yum install epel-release -y

Sau khi EPEL sẵn sàng:

sudo yum install fail2ban -y

Trên CentOS 8 hoặc Stream, thay yum bằng dnf nếu cần. Cú pháp tương tự, kết quả như nhau.

Cấu hình Fail2ban bảo vệ SSH qua file jail.local

File /etc/fail2ban/jail.conf là cấu hình gốc của Fail2ban. Tuyệt đối không sửa trực tiếp file này. Mỗi lần cập nhật Fail2ban, file đó sẽ bị ghi đè hoàn toàn. Quy tắc chuẩn là tạo file jail.local riêng — Fail2ban đọc file này sau và cho phép nó override bất kỳ giá trị nào trong jail.conf.

Cách tạo và cấu hình jail.local:

Bước 1 — Tạo file mới:

sudo nano /etc/fail2ban/jail.local

Bước 2 — Dán nội dung cấu hình sau vào file:

[DEFAULT]
bantime  = 3600
findtime = 600
maxretry = 5

[sshd]
enabled  = true
port     = ssh
filter   = sshd
# Ubuntu/Debian dùng dòng này:
logpath  = /var/log/auth.log
# CentOS/RHEL dùng dòng này (bỏ comment, comment dòng trên):
# logpath = /var/log/secure
maxretry = 5

Bước 3 — Lưu file: nhấn Ctrl+O, Enter, rồi Ctrl+X để thoát nano.

Lưu ý quan trọng về logpath: Ubuntu/Debian ghi log SSH vào /var/log/auth.log. CentOS/RHEL ghi vào /var/log/secure. Trỏ sai file log, Fail2ban không đọc được — cài mấy cũng không chặn được IP nào. Hãy xác nhận đúng OS trước khi lưu.
Tạo file jail.local
Tạo file jail.local

Ý nghĩa các thông số cấu hình (maxretry, bantime, findtime)

Ba thông số này quyết định “độ nhạy” của Fail2ban. Chỉnh sai có thể dẫn đến hai thái cực: quá lỏng (không chặn được) hoặc quá chặt (tự khóa người dùng hợp lệ).

  • enabled = true — Bật jail cho dịch vụ SSH. Đặt false để tắt tạm mà không cần xóa config.
  • port = ssh — Mặc định là port 22. Nếu bạn đã đổi SSH sang port khác (ví dụ 2222), thay thành port = 2222. Quan trọng — xem phần FAQ bên dưới.
  • filter = sshd — Trỏ đến file filter regex tại /etc/fail2ban/filter.d/sshd.conf. File này định nghĩa pattern nhận diện đăng nhập thất bại trong log. Không cần sửa.
  • logpath — Đường dẫn file log SSH cần giám sát. Ubuntu/Debian: /var/log/auth.logCentOS/RHEL: /var/log/secure. Đây là chỗ hay nhầm nhất.
  • maxretry = 5 — Số lần đăng nhập sai tối đa trong khoảng findtime trước khi bị block. 5 là giá trị an toàn — đủ khoan dung cho người gõ nhầm, đủ chặt với botnet.
  • bantime = 3600 — Thời gian block tính bằng giây. 3600 = 1 giờ. Tấn công thực sự có thể đặt cao hơn, thậm chí -1 để block vĩnh viễn, nhưng rủi ro tự khóa cũng tăng theo.
  • findtime = 600 — Cửa sổ thời gian (giây) để đếm số lần thất bại. 600 giây = 10 phút. Nghĩa là: nếu 5 lần sai xảy ra trong vòng 10 phút → block. Sai 4 lần trong 11 phút → không block.

Mối quan hệ giữa ba thông số này: findtime xác định khoảng quan sát, maxretry là ngưỡng kích hoạt, bantime là hình phạt. Tăng bantime lên 86400 (1 ngày) nếu server bị tấn công liên tục.

Kích hoạt dịch vụ và kiểm tra trạng thái Fail2ban

Sau khi lưu jail.local, khởi động lại Fail2ban để nó đọc cấu hình mới:

sudo systemctl restart fail2ban

Cài đặt để Fail2ban tự khởi động mỗi khi VPS reboot:

sudo systemctl enable fail2ban

Kiểm tra jail SSH đã nhận cấu hình chưa:

sudo fail2ban-client status sshd

Output trả về sẽ hiển thị: số lần thất bại đang theo dõi, tổng IP đã bị ban, và danh sách IP trong Banned IP list. Nếu thấy “Sorry but the jail ‘sshd’ does not exist”, kiểm tra lại file jail.local — thường do lỗi cú pháp hoặc sai tên section.

Trạng thái Fail2ban đã nhận cấu hình jail.local
Trạng thái Fail2ban đã nhận cấu hình jail.local

Cách tự kiểm tra (Test) Fail2ban đã chặn IP thành công chưa

Đừng tin tưởng vào cấu hình mà chưa test thực tế. Dưới đây là cách xác minh Fail2ban hoạt động đúng mà không mạo hiểm khóa luôn IP đang dùng:

Bước 1 — Dùng mạng 4G trên điện thoại (IP hoàn toàn khác với IP WiFi máy tính đang SSH vào VPS).

Bước 2 — Từ điện thoại, thử SSH vào VPS và gõ sai mật khẩu liên tục — đủ 5 lần (hoặc đúng bằng maxretry bạn đã đặt):

ssh root@IP_VPS_CUA_BAN

Gõ bất kỳ mật khẩu sai nào. Làm đủ 5 lần trong vòng 10 phút.

Bước 3 — Quay lại màn hình SSH trên máy tính (session vẫn còn), chạy:

sudo fail2ban-client status sshd

Nếu IP 4G của điện thoại xuất hiện trong Banned IP list — cấu hình hoạt động chính xác. Tuyệt đối không dùng IP đang SSH vào VPS để test, vì nếu bị khóa, bạn mất luôn quyền truy cập remote cho đến khi hết bantime.

Các lệnh quản lý Fail2ban SSH hữu ích cho Quản trị viên

Sau khi cài xong, đây là những lệnh dùng thường xuyên nhất trong công việc vận hành hàng ngày:

Xem trạng thái tổng quan:

sudo fail2ban-client status

Xem chi tiết jail SSH (bao gồm danh sách IP đang bị chặn):

sudo fail2ban-client status sshd

Xem log hoạt động của Fail2ban:

sudo tail -f /var/log/fail2ban.log

Log này cho thấy IP nào vừa bị ban, thời gian, và dịch vụ nào kích hoạt. Dùng để theo dõi khi nghi ngờ đang bị tấn công.

Reload cấu hình sau khi sửa jail.local (không cần restart toàn bộ service):

sudo fail2ban-client reload

Lệnh gỡ chặn (Unban) một IP trong Fail2ban như thế nào?

Để gỡ chặn một IP đã bị Fail2ban khóa khỏi dịch vụ SSH, dùng cú pháp sau:

sudo fail2ban-client set sshd unbanip <ĐỊA_CHỈ_IP>

Ví dụ cụ thể:

sudo fail2ban-client set sshd unbanip 203.0.113.45

Tình huống thường gặp nhất là: IP 4G dùng để test bị khóa, hoặc sysadmin gõ sai password quá nhiều lần từ một IP mới. Lệnh này có hiệu lực ngay lập tức — không cần restart Fail2ban, không cần chờ hết bantime.

InterData

VPS Giá Rẻ InterData — Firewall 2 Lớp, Hỗ Trợ Bảo Mật Từ Ngày Đầu

Triển khai Fail2ban và toàn bộ tầng bảo mật SSH ngay trên hạ tầng VPS ổn định — datacenter Hà Nội & TP.HCM, uptime 99.9%.

  • Firewall cứng bảo vệ 2 lớp — chặn tấn công từ tầng mạng trước khi đến VPS
  • Hỗ trợ cài đặt bảo mật ban đầu (Fail2ban, SSH hardening) miễn phí cho khách mới
  • Ổ NVMe SSD, băng thông 1Gbps, full root access — toàn quyền cấu hình theo nhu cầu

Thuê VPS Giá Rẻ Ngay →

Câu hỏi thường gặp về cấu hình Fail2ban SSH

Làm sao để đưa IP của tôi vào danh sách trắng (Whitelist) không bao giờ bị chặn?

Dùng thông số ignoreip trong section [DEFAULT] của file jail.local. Thêm dòng sau, trong đó IP tĩnh văn phòng hoặc IP nhà bạn được liệt kê cách nhau bằng khoảng trắng:

[DEFAULT]
ignoreip = 127.0.0.1/8 ::1 203.0.113.10 10.0.0.0/8

Fail2ban sẽ bỏ qua hoàn toàn mọi hành vi từ các IP này dù gõ sai mật khẩu bao nhiêu lần. Phù hợp nếu bạn có IP tĩnh, nhưng với IP động (đổi mỗi ngày) thì không áp dụng được — phương án thay thế là tăng maxretry lên cao hơn (ví dụ 10).

Đổi port SSH rồi thì cấu hình Fail2ban như thế nào?

Sửa thông số port trong section [sshd] của jail.local cho khớp với port mới. Nếu SSH của bạn đang chạy trên port 2222:

[sshd]
enabled  = true
port     = 2222
filter   = sshd
logpath  = /var/log/auth.log
maxretry = 5

Sau khi sửa, reload lại cấu hình: sudo fail2ban-client reload. Nếu để nguyên port = ssh trong khi đã đổi port thực tế, Fail2ban vẫn phát hiện và đếm lần sai — nhưng rule block sẽ chặn nhầm port 22 thay vì port 2222, dẫn đến không có hiệu quả.

Tại sao Fail2ban cài xong mà không chặn được IP nào?

Nguyên nhân phổ biến nhất: tường lửa chưa được bật. Fail2ban không tự tạo firewall — nó chỉ ghi rule vào engine đang chạy (UFW, Firewalld, iptables). Kiểm tra lại bằng sudo ufw status (Ubuntu) hoặc sudo systemctl status firewalld (CentOS). Nguyên nhân thứ hai thường gặp: sai đường dẫn logpath — Ubuntu dùng /var/log/auth.log, CentOS dùng /var/log/secure. Dùng nhầm thì Fail2ban không đọc được log SSH, không bao giờ kích hoạt ban.

Fail2ban có hoạt động được nếu VPS dùng SSH Key thay vì mật khẩu không?

Có, nhưng mức độ ưu tiên khác nhau. Khi SSH Key đã bật và tắt xác thực mật khẩu (PasswordAuthentication no trong /etc/ssh/sshd_config), botnet vẫn cố kết nối nhưng bị từ chối ngay ở tầng xác thực — không tạo ra log “Failed password”. Fail2ban lúc này chặn ít hơn vì log ít hơn, song song đó SSH Key đã bảo vệ chủ động hơn. Kết hợp cả hai là cấu hình lý tưởng: SSH Key ngăn xác thực trái phép, Fail2ban chặn IP quét cổng liên tục làm tốn tài nguyên.

Kết luận

Fail2ban là lớp phòng thủ đầu tiên — dễ cài, ít tốn tài nguyên, và hiệu quả thực sự với tấn công brute-force SSH. Sau khi hoàn thành các bước trên, VPS của bạn đã có khả năng tự động phát hiện và khóa IP tấn công mà không cần can thiệp thủ công. File auth.log sẽ giảm rõ rệt số dòng lỗi đăng nhập, CPU không còn bị nuốt bởi hàng nghìn kết nối TCP rác mỗi giờ.

Fail2ban giải quyết tốt bài toán brute-force, nhưng đó chỉ là một lớp trong chiến lược bảo mật VPS hoàn chỉnh. Bên cạnh đó, bạn nên tham khảo thêm các phương pháp bảo mật VPS chống brute-force toàn diện — đặc biệt là việc chuyển sang xác thực SSH Key để loại bỏ hoàn toàn nguy cơ bị đoán mật khẩu. Tham khảo thêm hướng dẫn tạo SSH Key và cấu hình đăng nhập không mật khẩucách đổi port SSH để giảm exposure trên blog InterData.