Chặn Brute-Force Ubuntu với UFW và Fail2ban trong 10 phút

13/05/2026 · P T P · Chung

Cấu hình UFW và Fail2ban để secure Ubuntu server chống brute-force

Một VPS Ubuntu mới tinh thường “lên mạng” chỉ vài phút đã bị scan. Bot tự động thử SSH, dò port, spam login, brute-force user phổ biến như root, admin, ubuntu. Nếu server mở SSH công khai, không có firewall, không có cơ chế chặn IP lỗi nhiều lần → rủi ro rất thật.

Tin tốt: chỉ với UFW + Fail2ban, bạn đã có lớp phòng thủ nền tảng:
UFW → kiểm soát port nào được phép truy cập.
Fail2ban → đọc log, phát hiện login fail lặp lại, ban IP tự động.

Bài này → cấu hình thực chiến cho Ubuntu server, ưu tiên SSH, web, chống brute-force.


1. Chuẩn bị trước khi bật firewall

Trước khi cấu hình UFW, cần tránh tự khóa mình khỏi server.

Kiểm tra SSH hiện tại

whoami
hostname -I
sudo systemctl status ssh

Kiểm tra port SSH:

sudo ss -tulpn | grep ssh

Thường là:

0.0.0.0:22

Nếu bạn dùng cloud/VPS có firewall riêng như AWS Security Group, GCP Firewall, Cloudflare, Hetzner Firewall → đảm bảo rule ngoài cũng cho phép SSH.

Khuyến nghị bảo mật SSH

Mở file:

sudo nano /etc/ssh/sshd_config

Nên chỉnh:

PermitRootLogin no
PasswordAuthentication no
PubkeyAuthentication yes
MaxAuthTries 3

Nếu chưa cấu hình SSH key, đừng tắt password ngay. Test key trước:

ssh-copy-id user@server_ip
ssh user@server_ip

Sau khi chỉnh SSH:

sudo sshd -t
sudo systemctl reload ssh

sshd -t không lỗi → reload an toàn.


2. UFW là gì? Vì sao cần?

UFW = Uncomplicated Firewall, frontend đơn giản cho iptables/nftables. Mục tiêu: deny mặc định, chỉ mở port cần thiết.

Mô hình chuẩn:

– Deny inbound mặc định.
– Allow outbound mặc định.
– Chỉ mở SSH, HTTP, HTTPS hoặc app cụ thể.
– Hạn chế SSH theo IP nếu có thể.

Cài UFW:

sudo apt update
sudo apt install ufw -y

Kiểm tra trạng thái:

sudo ufw status verbose

3. Cấu hình UFW an toàn cho Ubuntu server

Thiết lập policy mặc định

sudo ufw default deny incoming
sudo ufw default allow outgoing

Ý nghĩa:

– Kết nối từ ngoài vào → chặn.
– Server đi ra ngoài → cho phép, để update package, gọi API, DNS.

Cho phép SSH

Nếu SSH port 22:

sudo ufw allow OpenSSH

Hoặc:

sudo ufw allow 22/tcp

Nếu SSH port custom, ví dụ 2222:

sudo ufw allow 2222/tcp

Quan trọng: mở đúng port SSH trước khi bật UFW.

Bật UFW

sudo ufw enable

Kiểm tra:

sudo ufw status numbered

Ví dụ:

[ 1] OpenSSH                    ALLOW IN    Anywhere

Mở web server

Nếu chạy Nginx/Apache:

sudo ufw allow 80/tcp
sudo ufw allow 443/tcp

Hoặc dùng profile app:

sudo ufw app list
sudo ufw allow "Nginx Full"

Giới hạn SSH bằng rate limit

UFW có rule limit cơ bản:

sudo ufw limit OpenSSH

Hoặc:

sudo ufw limit 22/tcp

Rule này giảm brute-force đơn giản, nhưng chưa đủ linh hoạt. Fail2ban xử lý tốt hơn.

Chỉ cho IP tin cậy SSH

Nếu bạn có IP cố định:

sudo ufw allow from 203.0.113.10 to any port 22 proto tcp
sudo ufw delete allow OpenSSH

Kết quả: chỉ IP bạn được SSH.

Nếu IP động → không nên khóa quá chặt, trừ khi có VPN/bastion.


4. Fail2ban là gì? Cơ chế hoạt động

Fail2ban theo dõi log service. Khi thấy IP fail quá nhiều lần trong khoảng thời gian ngắn → tạo rule firewall để ban IP.

Luồng:

/var/log/auth.log → Fail2ban filter sshd → vượt ngưỡng → jail sshd → ban IP qua UFW/iptables/nftables

Fail2ban hiệu quả với:

– SSH brute-force.
– Login web app.
– Nginx auth.
– WordPress XML-RPC.
– Postfix/Dovecot.
– Apache basic auth.


5. Cài Fail2ban trên Ubuntu

sudo apt install fail2ban -y
sudo systemctl enable fail2ban
sudo systemctl start fail2ban
sudo systemctl status fail2ban

Không nên sửa trực tiếp /etc/fail2ban/jail.conf. Tạo file riêng:

sudo nano /etc/fail2ban/jail.local

6. Cấu hình Fail2ban bảo vệ SSH

Nội dung mẫu:

[DEFAULT]
bantime = 1h
findtime = 10m
maxretry = 5
backend = systemd
ignoreip = 127.0.0.1/8 ::1

[sshd] enabled = true port = ssh filter = sshd logpath = %(sshd_log)s maxretry = 3 findtime = 10m bantime = 6h

Giải thích nhanh:

maxretry = 3 → sai 3 lần.
findtime = 10m → trong 10 phút.
bantime = 6h → ban 6 giờ.
ignoreip → IP không bao giờ bị ban.

Nếu SSH port custom:

[sshd]
enabled = true
port = 2222
filter = sshd
backend = systemd
maxretry = 3
findtime = 10m
bantime = 6h

Restart:

sudo systemctl restart fail2ban

Kiểm tra jail:

sudo fail2ban-client status
sudo fail2ban-client status sshd

7. Tích hợp Fail2ban với UFW

Mặc định Ubuntu có thể dùng iptables/nftables. Nếu muốn Fail2ban ban qua UFW, cấu hình action:

[DEFAULT]
banaction = ufw
banaction_allports = ufw

File đầy đủ:

[DEFAULT]
bantime = 1h
findtime = 10m
maxretry = 5
backend = systemd
banaction = ufw
ignoreip = 127.0.0.1/8 ::1

[sshd] enabled = true port = ssh filter = sshd maxretry = 3 findtime = 10m bantime = 6h

Restart:

sudo systemctl restart fail2ban

Xem rule UFW:

sudo ufw status numbered

Nếu Fail2ban đang ban IP, bạn sẽ thấy rule deny tương ứng.


8. Test Fail2ban đúng cách

Từ máy khác, thử login sai vài lần:

ssh wronguser@server_ip

Sau 3 lần fail, kiểm tra trên server:

sudo fail2ban-client status sshd

Kết quả mẫu:

Currently banned: 1
Banned IP list: 198.51.100.20

Unban IP:

sudo fail2ban-client set sshd unbanip 198.51.100.20

Xem log:

sudo journalctl -u fail2ban -n 100 --no-pager

Hoặc:

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

9. Cấu hình nâng cao chống brute-force mạnh hơn

Ban dài hơn cho attacker lặp lại

Fail2ban bản mới hỗ trợ incremental bantime:

[DEFAULT]
bantime = 1h
bantime.increment = true
bantime.factor = 2
bantime.maxtime = 1w

Ý nghĩa: tái phạm → ban lâu hơn, tối đa 1 tuần.

Whitelist IP quản trị

Nếu IP admin là 203.0.113.10:

ignoreip = 127.0.0.1/8 ::1 203.0.113.10

Cẩn thận: whitelist sai → attacker từ IP đó không bị chặn.

Bảo vệ Nginx basic auth

[nginx-http-auth]
enabled = true
port = http,https
logpath = /var/log/nginx/error.log
maxretry = 5
bantime = 1h

Bảo vệ endpoint nhạy cảm

Nếu app có login URL, nên log failed login rõ IP. Sau đó viết custom filter Fail2ban. Với WordPress, có thể chặn thêm XML-RPC ở Nginx:

location = /xmlrpc.php {
    deny all;
}

10. Checklist hardening thực tế

UFW

default deny incoming
– SSH allowed trước khi enable.
– Chỉ mở port cần: 22, 80, 443.
– SSH giới hạn theo IP nếu có thể.
– Xóa rule thừa:

sudo ufw status numbered
sudo ufw delete <number>

SSH

– Tắt root login.
– Dùng SSH key.
– Tắt password nếu chắc chắn key hoạt động.
– Giảm MaxAuthTries.
– Không dùng user dễ đoán.

Fail2ban

– Bật jail sshd.
– Dùng backend = systemd.
maxretry thấp cho SSH.
bantime.increment nếu server bị scan nhiều.
– Theo dõi log định kỳ.


11. Lỗi thường gặp

Tự khóa SSH

Nguyên nhân: bật UFW trước khi allow SSH.
Cách tránh:

sudo ufw allow OpenSSH
sudo ufw enable

Nếu đã khóa → dùng console từ nhà cung cấp VPS.

Fail2ban không ban

Kiểm tra:

sudo fail2ban-client status
sudo fail2ban-client status sshd
sudo journalctl -u fail2ban -n 100

Nguyên nhân hay gặp:

– Sai backend.
– Sai logpath.
– SSH dùng port custom nhưng jail vẫn port = ssh.
– Log không ghi failed attempt.

Ban nhầm IP admin

Unban:

sudo fail2ban-client set sshd unbanip YOUR_IP

Thêm whitelist:

ignoreip = 127.0.0.1/8 ::1 YOUR_IP

Restart:

sudo systemctl restart fail2ban

Kết luận

UFW và Fail2ban không biến Ubuntu server thành pháo đài tuyệt đối, nhưng là nền móng bắt buộc. UFW giảm bề mặt tấn công bằng cách chỉ mở port cần thiết. Fail2ban giảm brute-force bằng cách ban IP sai nhiều lần. Kết hợp thêm SSH key, tắt root login, tắt password login, whitelist IP quản trị → server an toàn hơn rõ rệt.

Cấu hình tối thiểu nên có:

sudo ufw default deny incoming
sudo ufw default allow outgoing
sudo ufw allow OpenSSH
sudo ufw allow 80/tcp
sudo ufw allow 443/tcp
sudo ufw enable
sudo apt install fail2ban -y

Sau đó bật jail sshd, theo dõi log, test ban/unban. Bảo mật tốt không phải một lần rồi quên; là quy trình: cấu hình đúng, kiểm tra định kỳ, cập nhật đều, giảm quyền, giảm port, giảm cơ hội cho attacker.

#brute #chan #fail2ban #force #ubuntu
Chia sẻ:
← Trước
Secure Ubuntu Server: SSH Key, Tắt Root, Đổi Port An Toàn

Bài viết tương tự

Bình luận

Chưa có bình luận. Hãy là người đầu tiên!