Chống brute force SSH trên VPS: SSH key, Fail2ban và tường lửa
Cách chống brute force SSH trên VPS Ubuntu, Debian: dùng SSH key, tắt mật khẩu, Fail2ban, giới hạn kết nối bằng UFW, đổi cổng đúng cách và tránh tự khoá mình.

Ý chính
- Tắt đăng nhập SSH bằng mật khẩu và chỉ dùng SSH key là biện pháp chống brute force hiệu quả nhất.
- Fail2ban chặn IP sau vài lần đăng nhập sai, giảm nhiễu log và tải cho server.
- Đổi cổng SSH chỉ giảm bot quét, không thay được SSH key; trên Ubuntu 24.04 cần khởi động lại ssh.socket.
- Luôn giữ phiên SSH đang mở và thử đăng nhập ở phiên mới trước khi đóng.
Cách chống brute force SSH hiệu quả nhất là tắt hẳn đăng nhập bằng mật khẩu và chỉ cho phép SSH key: khi đó bot có thử hàng triệu mật khẩu cũng vô ích. Sau đó thêm Fail2ban để tự chặn IP đăng nhập sai nhiều lần, giới hạn tốc độ kết nối bằng tường lửa, và nếu được thì chỉ mở cổng SSH cho IP của bạn. Đổi cổng SSH giúp log sạch hơn nhưng không phải biện pháp bảo mật chính.
Bài viết hướng dẫn từng bước trên Ubuntu 24.04 và Debian 12/13, theo thứ tự để bạn không tự khoá mình khỏi server, kèm cách ZoPanel thiết lập và kiểm tra sẵn những lớp này.
VPS của bạn có đang bị brute force SSH không?
Gần như chắc chắn có. Mọi IP công khai đều bị bot quét cổng 22 liên tục, thường chỉ vài phút sau khi VPS được tạo. Xem nhanh:
# Ubuntu và Debian đều dùng unit ssh.service
sudo journalctl -u ssh --since "24 hours ago" | grep -cE "Failed password|Invalid user"
Con số hàng nghìn mỗi ngày là bình thường. Phần lớn là bot thử các tên đăng nhập phổ biến như root, admin, ubuntu, test với mật khẩu yếu. Chúng không nhắm riêng vào bạn, nhưng chỉ cần một mật khẩu yếu là đủ để server trở thành máy đào coin hay máy gửi spam.
Bước 1: đăng nhập bằng SSH key
Trên máy tính của bạn (Linux, macOS hoặc Windows có OpenSSH):
ssh-keygen -t ed25519 -C "ban@laptop"
ssh-copy-id root@203.0.113.10
Ed25519 là loại key ngắn, nhanh và được khuyên dùng cho key mới. Đặt passphrase cho private key: nếu laptop bị mất, key vẫn chưa dùng được ngay.
Nếu có khoá bảo mật phần cứng (YubiKey hoặc tương tự), bạn có thể tạo key ed25519-sk, khi đó đăng nhập cần chạm vào thiết bị:
ssh-keygen -t ed25519-sk
Thử đăng nhập lại bằng key trước khi sang bước 2. Nếu key không hoạt động, dừng lại và sửa: bước sau sẽ tắt mật khẩu.
Nên tạo thêm một user thường có quyền sudo thay vì làm việc trực tiếp bằng root:
adduser quantri
usermod -aG sudo quantri
mkdir -p /home/quantri/.ssh
cp /root/.ssh/authorized_keys /home/quantri/.ssh/
chown -R quantri:quantri /home/quantri/.ssh
chmod 700 /home/quantri/.ssh && chmod 600 /home/quantri/.ssh/authorized_keys
Bước 2: tắt đăng nhập bằng mật khẩu
Trên Ubuntu 24.04 và Debian 12/13, file /etc/ssh/sshd_config nạp các file trong /etc/ssh/sshd_config.d/ ngay từ đầu. Với sshd, giá trị đọc được trước sẽ thắng. Một số image cloud có sẵn file 50-cloud-init.conf bật PasswordAuthentication yes, nên hãy đặt file của bạn có tên đứng trước:
sudo nano /etc/ssh/sshd_config.d/00-hardening.conf
PasswordAuthentication no
KbdInteractiveAuthentication no
PermitRootLogin prohibit-password
MaxAuthTries 3
LoginGraceTime 30
PermitRootLogin prohibit-passwordcho root đăng nhập bằng key nhưng không bằng mật khẩu. Nếu đã có user sudo ở bước 1, dùngPermitRootLogin nocòn chặt hơn.MaxAuthTries 3cắt kết nối sau 3 lần xác thực sai.LoginGraceTime 30cho mỗi kết nối 30 giây để đăng nhập.
Kiểm tra cấu hình rồi mới nạp lại:
sudo sshd -t # không in gì là cú pháp đúng
sudo sshd -T | grep -E "passwordauthentication|permitrootlogin|maxauthtries"
sudo systemctl reload ssh
Giữ nguyên phiên SSH hiện tại. Mở một cửa sổ terminal mới, đăng nhập thử. Chỉ đóng phiên cũ khi phiên mới vào được. Nếu nhà cung cấp VPS có console web (VNC), hãy biết nó nằm ở đâu trước khi bắt đầu.
Bước 3: cài Fail2ban
Khi đã tắt mật khẩu, brute force không còn cơ hội thành công, nhưng bot vẫn chiếm kết nối và làm đầy log. Fail2ban đọc log, thấy một IP đăng nhập sai nhiều lần thì chặn IP đó bằng tường lửa trong một khoảng thời gian.
sudo apt install fail2ban
Không sửa jail.conf (file của gói, có thể bị ghi đè khi cập nhật). Tạo /etc/fail2ban/jail.local:
[DEFAULT]
bantime = 1h
findtime = 10m
maxretry = 5
bantime.increment = true
[sshd]
enabled = true
backend = systemd
backend = systemd quan trọng trên Debian 12 trở lên: Debian không còn ghi /var/log/auth.log mặc định, và jail sshd sẽ không khởi động nếu đi tìm file đó. bantime.increment tăng thời gian chặn cho IP tái phạm.
sudo systemctl restart fail2ban
sudo fail2ban-client status sshd # số IP đang bị chặn
sudo fail2ban-client set sshd unbanip 198.51.100.7 # bỏ chặn nếu chặn nhầm
Nếu bạn làm việc từ IP cố định, thêm ignoreip = 127.0.0.1/8 ::1 IP_CUA_BAN vào mục [DEFAULT] để không tự chặn mình khi gõ sai.
OpenSSH từ bản 9.8 có sẵn PerSourcePenalties, bật mặc định, tự phạt địa chỉ xác thực thất bại nhiều lần (ghi chú phát hành OpenSSH 9.8). Debian 13 có OpenSSH 10.0 nên có tính năng này; Ubuntu 24.04 (OpenSSH 9.6) và Debian 12 (9.2) thì chưa, nên Fail2ban vẫn cần thiết ở đây.
Bước 4: giới hạn kết nối bằng tường lửa
UFW có sẵn chế độ limit: từ chối IP mở 6 kết nối trở lên trong 30 giây.
sudo ufw limit 22/tcp
sudo ufw status
Mạnh hơn nữa là chỉ cho phép IP của bạn vào cổng SSH, ở tường lửa của nhà cung cấp VPS (cloud firewall, security group) hoặc trong UFW:
sudo ufw allow from 198.51.100.7 to any port 22 proto tcp
sudo ufw delete limit 22/tcp
Cách này loại bỏ gần như toàn bộ bot, nhưng chỉ phù hợp khi bạn có IP cố định hoặc dùng VPN (WireGuard chẳng hạn). Nếu IP nhà mạng của bạn thay đổi, bạn cần console của nhà cung cấp để vào lại.
Bước 5: có nên đổi cổng SSH không?
Đổi cổng 22 sang cổng khác giảm mạnh số bot quét, giúp log dễ đọc hơn. Nhưng nó không chặn được kẻ tấn công có chủ đích, vì quét toàn bộ cổng chỉ mất vài phút. Hãy coi đây là biện pháp giảm nhiễu, làm sau khi đã có SSH key và Fail2ban.
Thứ tự an toàn:
- Mở cổng mới trên tường lửa trước:
sudo ufw allow 2222/tcp(và trên cloud firewall nếu có). - Thêm
Port 2222vào file00-hardening.conf. - Áp dụng:
- Ubuntu 24.04: SSH dùng socket activation, cổng lắng nghe do
ssh.socketquyết định. Chạysudo systemctl daemon-reload && sudo systemctl restart ssh.socket. Chỉ khởi động lạissh.servicelà chưa đủ. - Debian 12/13:
sudo systemctl restart ssh.
- Ubuntu 24.04: SSH dùng socket activation, cổng lắng nghe do
- Kiểm tra
sudo ss -tlnp | grep ssh, đăng nhập ở phiên mới bằngssh -p 2222. - Khi đã chắc chắn, xoá rule cổng 22 trên tường lửa. Jail
sshdmặc định chặn trên cổngssh(22), nên khi đổi cổng hãy thêmport = 2222vào mục[sshd].
Bước 6: cập nhật OpenSSH đều đặn
Brute force không phải mối đe doạ duy nhất. Năm 2024, lỗ hổng regreSSHion (CVE-2024-6387) trong sshd ảnh hưởng OpenSSH portable từ 8.5p1 đến 9.7p1, có thể dẫn tới thực thi mã từ xa với quyền root. Ubuntu và Debian đã vá trong gói của mình, nên số phiên bản hiển thị có thể vẫn là bản cũ: hãy kiểm tra bằng cập nhật gói, không phải bằng số phiên bản.
sudo apt install unattended-upgrades
sudo dpkg-reconfigure -plow unattended-upgrades
Các bước bảo mật VPS khác (người dùng, cập nhật tự động, dịch vụ mở cổng) có trong bài bảo mật VPS Ubuntu.
Những lỗi khiến bạn tự khoá mình khỏi server
| Lỗi | Cách tránh |
|---|---|
| Tắt mật khẩu khi key chưa hoạt động | Thử đăng nhập bằng key trước, giữ phiên cũ mở |
| File cloud-init bật lại mật khẩu | Đặt tên file 00-...conf, kiểm tra bằng sshd -T |
| Đổi cổng nhưng chưa mở tường lửa | Mở cổng mới trước, xoá cổng cũ sau cùng |
| Ubuntu 24.04 vẫn nghe cổng 22 | Restart ssh.socket sau daemon-reload |
| Fail2ban chặn chính IP của bạn | Thêm ignoreip, biết lệnh unbanip |
| Chỉ cho phép một IP, rồi IP đổi | Dùng VPN hoặc biết cách vào console của nhà cung cấp |
Chống brute force SSH với ZoPanel
Khi cài ZoPanel, bộ cài đã làm sẵn một phần việc ở trên, theo tài liệu Bảo mật:
- UFW được bật, mở cổng SSH hiện tại của bạn cùng 80, 443 và 8888, và tự bật khi khởi động. Quản lý quy tắc ở Bảo mật → Tường lửa.
- Fail2ban có jail
sshd(sai 5 lần trong 10 phút thì chặn 1 giờ) và jailzopanelcho đăng nhập panel và mã 2FA (sai 8 lần trong 15 phút thì chặn 1 giờ). IP bị chặn hiện trên trang Bảo mật, nơi bạn bỏ chặn bằng một cú bấm. - Trung tâm bảo mật chấm điểm server, trong đó có root đăng nhập SSH bằng mật khẩu, SSH dùng mật khẩu, số lần thử SSH và Fail2ban. Nút Sửa ngay cho các mục SSH luôn kiểm tra trước là đã có SSH key, nên việc sửa không thể khoá bạn khỏi server.
Với khách hàng hosting, ZoPanel không cấp shell root. Khách dùng SFTP bị chroot trong thư mục home, có thể thêm SSH key ở Tài khoản của tôi → SFTP & SSH key và bật Chỉ dùng key để tắt mật khẩu cho tài khoản của mình (xem FTP và SFTP). Lý do panel không chạy bằng root và không mở shell root qua web được giải thích trong bài vì sao control panel hosting không nên chạy bằng root.
Kết luận
Thứ tự chống brute force SSH đúng là: SSH key trước, tắt mật khẩu, Fail2ban, giới hạn kết nối hoặc chỉ cho phép IP của bạn, rồi mới tính chuyện đổi cổng. Mỗi bước đều làm trong khi giữ một phiên SSH đang mở. Sau đó, cập nhật OpenSSH đều đặn quan trọng không kém.
ZoPanel thiết lập UFW, Fail2ban và các kiểm tra SSH ngay khi cài, trên cả gói Free. Cài bằng curl -fsSL https://get.zopanel.net | sudo bash trên Ubuntu 22.04/24.04 hoặc Debian 12/13, và xem bảng giá khi bạn cần nhiều website hơn.
Câu hỏi thường gặp
Tắt đăng nhập mật khẩu SSH rồi có cần Fail2ban nữa không?
Vẫn nên có. Khi chỉ dùng SSH key, brute force mật khẩu không thể thành công, nhưng bot vẫn mở hàng nghìn kết nối, tốn tài nguyên và làm log khó đọc. Fail2ban chặn các IP đó sớm, và cũng bảo vệ những dịch vụ khác như mail hay FTP nếu bạn bật jail cho chúng.
Đổi cổng SSH có giúp chống brute force không?
Có giảm số bot quét tự động, nên log sạch hơn, nhưng không chặn được người cố tình quét mọi cổng. Hãy dùng nó như lớp phụ sau SSH key và Fail2ban, không phải thay thế.
Lỡ bị Fail2ban chặn IP của mình thì làm sao?
Vào server từ IP khác hoặc qua console web của nhà cung cấp VPS, rồi chạy sudo fail2ban-client set sshd unbanip IP_CUA_BAN. Trên ZoPanel, bạn có thể bỏ chặn ngay trên trang Bảo mật nếu vẫn vào được panel từ IP khác.
SSH key loại nào nên dùng?
Ed25519 là lựa chọn tốt cho key mới: ngắn, nhanh và an toàn. Nếu có khoá bảo mật phần cứng, ed25519-sk buộc phải chạm thiết bị mỗi lần đăng nhập. RSA vẫn dùng được nếu dài ít nhất 3072 bit cho hệ thống cũ cần tương thích.
Ubuntu 24.04 đổi cổng SSH rồi mà vẫn nghe cổng 22 là sao?
Ubuntu 24.04 dùng socket activation cho SSH, nên cổng do ssh.socket quyết định. Sau khi sửa Port, chạy sudo systemctl daemon-reload rồi sudo systemctl restart ssh.socket, sau đó kiểm tra bằng ss -tlnp.
Đọc tiếp

Bảo mật VPS Ubuntu: 10 bước cần làm ngay sau khi cài đặt
Hướng dẫn bảo mật VPS Ubuntu 24.04 từng bước: SSH key, tắt đăng nhập mật khẩu, UFW, Fail2ban, cập nhật tự động và sao lưu, kèm lệnh chính xác và lỗi cần tránh.

Backup VPS lên S3: hướng dẫn sao lưu mã hoá, tự động, khôi phục được
Cách backup VPS lên S3 (AWS, Cloudflare R2, Backblaze B2, Wasabi) bằng restic - mã hoá, tăng dần, có lịch và thử khôi phục - hoặc chỉ vài cú bấm với ZoPanel.

VPS cho WordPress cấu hình bao nhiêu là đủ? Cách chọn CPU, RAM, ổ đĩa
VPS cho WordPress cấu hình bao nhiêu là đủ cho 1, 10 hay 100 website? Cách ước lượng CPU, RAM, ổ đĩa theo lưu lượng, kèm số liệu đo thực tế và lỗi cần tránh.