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 sshKiểm tra port SSH:
sudo ss -tulpn | grep sshThường là:
0.0.0.0:22Nế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_configNên chỉnh:
PermitRootLogin no
PasswordAuthentication no
PubkeyAuthentication yes
MaxAuthTries 3Nế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_ipSau khi chỉnh SSH:
sudo sshd -t
sudo systemctl reload sshsshd -t không lỗi → reload an toàn.
2. UFW là gì? Vì sao cần?
UFW = Uncomplicated Firewall, frontend đơn giản choiptables/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 -yKiểm tra trạng thái:
sudo ufw status verbose3. 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 OpenSSHHoặc:
sudo ufw allow 22/tcpNếu SSH port custom, ví dụ 2222:
sudo ufw allow 2222/tcpBật UFW
sudo ufw enableKiểm tra:
sudo ufw status numberedVí dụ:
[ 1] OpenSSH ALLOW IN AnywhereMở web server
Nếu chạy Nginx/Apache:
sudo ufw allow 80/tcp
sudo ufw allow 443/tcpHoặ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 OpenSSHHoặc:
sudo ufw limit 22/tcpRule 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 OpenSSHKế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/nftablesFail2ban 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 fail2banKhông nên sửa trực tiếp /etc/fail2ban/jail.conf. Tạo file riêng:
sudo nano /etc/fail2ban/jail.local6. 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 = 6hRestart:
sudo systemctl restart fail2banKiểm tra jail:
sudo fail2ban-client status
sudo fail2ban-client status sshd7. 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 = ufwFile đầ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 fail2banXem rule UFW:
sudo ufw status numberedNế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_ipSau 3 lần fail, kiểm tra trên server:
sudo fail2ban-client status sshdKết quả mẫu:
Currently banned: 1
Banned IP list: 198.51.100.20Unban IP:
sudo fail2ban-client set sshd unbanip 198.51.100.20Xem log:
sudo journalctl -u fail2ban -n 100 --no-pagerHoặc:
sudo tail -f /var/log/fail2ban.log9. 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.10Cẩ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 = 1hBả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 enableNế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 100Nguyê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_IPThêm whitelist:
ignoreip = 127.0.0.1/8 ::1 YOUR_IPRestart:
sudo systemctl restart fail2banKế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 -ySau đó 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.
Bình luận (0)
Chưa có bình luận. Hãy là người đầu tiên!