UFW trên Linux: Bảo Vệ VPS Như Dân Pro

Bạn vừa thuê một con VPS mới tinh. SSH vào, deploy app, mọi thứ chạy ngon lành. Cuộc đời thật đẹp — cho đến khi bạn check log và thấy hàng ngàn lần brute-force vào port 22, đám bot quét từng port một, và đủ thứ traffic lạ hoắc từ những IP chưa bao giờ thấy.
Chào mừng bạn đến với internet. Server của bạn bị tấn công từ giây phút nó lên mạng.
Tuyến phòng thủ đầu tiên? Firewall. Và trên Ubuntu, cách đơn giản nhất để dựng firewall là UFW — Uncomplicated Firewall.
UFW là gì?
UFW là giao diện thân thiện cho iptables, hệ thống firewall mạnh mẽ nhưng khét tiếng phức tạp trên Linux. Ubuntu cài sẵn UFW (nhưng tắt mặc định).
Hiểu đơn giản thế này:
- iptables = động cơ (mạnh, low-level, cấu hình muốn khóc)
- UFW = vô-lăng (câu lệnh đơn giản, mặc định hợp lý)
UFW không thay thế iptables — nó sinh ra các iptables rules cho bạn, nên bạn vẫn có cùng mức bảo mật mà đỡ phức tạp hơn rất nhiều.
Bắt Đầu Thôi
Cài đặt
UFW được cài sẵn trên Ubuntu. Nếu vì lý do nào đó chưa có:
sudo apt update
sudo apt install ufwKiểm tra trạng thái:
sudo ufw status
# Status: inactiveQuy Tắc Vàng: Cho Phép SSH Trước Khi Bật
Đây là bước quan trọng nhất. Nếu bạn bật UFW mà chưa allow SSH, bạn sẽ tự khóa mình ra khỏi server luôn.
# LUÔN LUÔN làm bước này trước
sudo ufw allow ssh
# hoặc tương đương
sudo ufw allow 22/tcpBật UFW
sudo ufw enableSẽ có cảnh báo: "Command may disrupt existing ssh connections." Gõ y — rule SSH đã có sẵn rồi, yên tâm.
Kiểm tra lại:
sudo ufw status verboseStatus: active
Logging: on (low)
Default: deny (incoming), allow (outgoing), disabled (routed)
New profiles: skip
To Action From
-- ------ ----
22/tcp ALLOW IN Anywhere
22/tcp (v6) ALLOW IN Anywhere (v6)Các Lệnh Cần Biết
Rules Allow và Deny
# Cho phép port cụ thể
sudo ufw allow 80/tcp
sudo ufw allow 443/tcp
# Cho phép dải port
sudo ufw allow 8000:8100/tcp
# Cho phép từ IP cụ thể
sudo ufw allow from 203.0.113.50
# Cho phép từ IP cụ thể đến port cụ thể
sudo ufw allow from 203.0.113.50 to any port 5432
# Cho phép cả subnet
sudo ufw allow from 10.0.0.0/24
# Chặn IP (block kẻ tấn công)
sudo ufw deny from 23.94.168.0/24
# Chặn port cụ thể
sudo ufw deny 3306/tcpDùng Application Profiles
UFW có sẵn các profile cho ứng dụng phổ biến:
# Liệt kê các profile có sẵn
sudo ufw app list
# Allow theo tên profile
sudo ufw allow 'Nginx Full' # port 80 + 443
sudo ufw allow 'Nginx HTTP' # chỉ port 80
sudo ufw allow 'Nginx HTTPS' # chỉ port 443
sudo ufw allow 'OpenSSH' # port 22
# Xem chi tiết profile
sudo ufw app info 'Nginx Full'Xoá Rules
# Liệt kê rules kèm số thứ tự
sudo ufw status numbered
# Xoá theo số thứ tự
sudo ufw delete 3
# Xoá theo rule cụ thể
sudo ufw delete allow 8080/tcpReset Toàn Bộ
# Nút huỷ diệt — xoá TẤT CẢ rules và tắt UFW
sudo ufw resetCấu Hình VPS Thực Tế
Đây là setup hoàn chỉnh cho web server điển hình chạy Nginx + app backend + PostgreSQL:
# 1. Thiết lập policy mặc định
sudo ufw default deny incoming
sudo ufw default allow outgoing
# 2. Cho phép SSH (LUÔN LUÔN đầu tiên)
sudo ufw allow ssh
# 3. Cho phép traffic web
sudo ufw allow 80/tcp
sudo ufw allow 443/tcp
# 4. Cho phép app backend (vd: port 3000) chỉ từ localhost
# Nghĩa là Nginx reverse-proxy đến nó — không cho truy cập trực tiếp từ ngoài
sudo ufw allow from 127.0.0.1 to any port 3000
# 5. Cho phép PostgreSQL chỉ từ IP server app
sudo ufw allow from 10.0.0.5 to any port 5432
# 6. Bật UFW
sudo ufw enableNguyên tắc cốt lõi: chặn hết mặc định, chỉ mở những gì cần thiết.
Docker và UFW — Cái Bẫy Kinh Điển
Nếu bạn chạy Docker trên VPS, có một vấn đề cực kỳ quan trọng cần biết:
Docker bypass UFW hoàn toàn. Khi Docker publish port (
-p 5432:5432), nó tự viết iptables rules riêng mà UFW không kiểm soát được. Policy "deny all" của bạn sẽ không chặn được traffic đến port Docker expose.
Các giải pháp:
Cách 1: Bind port Docker chỉ vào localhost
# docker-compose.yml
services:
postgres:
ports:
- "127.0.0.1:5432:5432" # Chỉ truy cập được từ host# Hoặc với docker run
docker run -p 127.0.0.1:5432:5432 postgresCách 2: Dùng Docker networks thay vì publish ports
# docker-compose.yml
services:
app:
networks:
- internal
postgres:
networks:
- internal
# Không có 'ports' — chỉ truy cập được trong Docker network
networks:
internal:
driver: bridgeCách 3: Cấu hình Docker tôn trọng UFW
Sửa /etc/docker/daemon.json:
{
"iptables": false
}Rồi restart Docker:
sudo systemctl restart dockerCảnh báo: Khi set
"iptables": false, Docker không thể tự quản lý networking rules. Bạn phải tự cấu hình iptables cho container giao tiếp với nhau. Cách này đòi hỏi kinh nghiệm hơn.
Khuyến nghị: Dùng Cách 1 (bind vào localhost) cho database và internal services, để Nginx xử lý traffic từ ngoài. Đây là cách đơn giản và đáng tin cậy nhất.
Best Practices Bảo Mật VPS
1. Đổi Port SSH Mặc Định
Chuyển SSH khỏi port 22 không ngăn được hacker chuyên nghiệp, nhưng loại bỏ 99% bot brute-force tự động:
# Sửa config SSH
sudo nano /etc/ssh/sshd_config
# Đổi dòng này:
# Port 22
Port 2222
# Restart SSH
sudo systemctl restart sshdCập nhật UFW:
sudo ufw allow 2222/tcp
sudo ufw delete allow 22/tcp
# hoặc: sudo ufw delete allow sshQuan trọng: Mở một SSH session MỚI trên port 2222 trước khi đóng session hiện tại. Nếu có gì sai, bạn vẫn còn kết nối cũ để cứu vãn.
2. Giới Hạn Tốc Độ Kết Nối SSH
UFW có thể rate-limit — nếu một IP thử kết nối quá 6 lần trong 30 giây, nó bị chặn:
sudo ufw limit ssh
# hoặc nếu dùng port tuỳ chỉnh:
sudo ufw limit 2222/tcpĐơn giản mà hiệu quả chống brute-force.
3. Tắt Đăng Nhập Bằng Password
Dùng SSH key thay vì password. Chỉ riêng bước này đã loại bỏ gần hết rủi ro brute-force:
# Trên máy local — tạo cặp key nếu chưa có
ssh-keygen -t ed25519 -C "[email protected]"
# Copy public key lên server
ssh-copy-id -p 2222 user@your-server-ipRồi trên server, tắt đăng nhập bằng password:
sudo nano /etc/ssh/sshd_configPasswordAuthentication no
PubkeyAuthentication yes
PermitRootLogin nosudo systemctl restart sshd4. Bật Logging
# Đặt mức logging (low, medium, high, full)
sudo ufw logging mediumXem log:
# UFW log nằm trong syslog
sudo grep UFW /var/log/syslog | tail -20
# Hoặc trên Ubuntu mới hơn
sudo journalctl | grep UFW | tail -205. Chỉ Mở Port Thật Sự Cần
Kiểm tra port thường xuyên:
# Xem UFW đang allow gì
sudo ufw status numbered
# Xem thực tế đang listen port nào
sudo ss -tlnpNếu ss cho thấy service listen trên port mà UFW không allow, thì tốt — UFW đang chặn truy cập từ ngoài. Nếu UFW allow port mà không service nào listen, xoá rule đi — mở vô ích.
6. Dùng Fail2Ban Song Song Với UFW
UFW lo rules tĩnh. Fail2Ban theo dõi log và tự động ban IP có hành vi khả nghi:
sudo apt install fail2banTạo config local:
sudo cp /etc/fail2ban/jail.conf /etc/fail2ban/jail.local
sudo nano /etc/fail2ban/jail.local[sshd]
enabled = true
port = 2222
filter = sshd
logpath = /var/log/auth.log
maxretry = 3
bantime = 3600
findtime = 600
banaction = ufwsudo systemctl enable fail2ban
sudo systemctl start fail2banGiờ Fail2Ban sẽ tự động thêm UFW deny rule cho IP nào đăng nhập SSH thất bại 3 lần trong 10 phút.
Kiểm tra IP bị ban:
sudo fail2ban-client status sshdChecklist Bảo Mật VPS Hoàn Chỉnh
Đây là danh sách nhanh để bảo mật VPS Ubuntu mới:
Thiết lập Firewall:
✅ Set default deny incoming, allow outgoing
✅ Allow SSH (trên port tuỳ chỉnh)
✅ Chỉ mở port 80 và 443 cho web
✅ Bind port Docker vào 127.0.0.1
✅ Bật UFW logging
Bảo mật SSH:
✅ Đổi port SSH khỏi 22
✅ Tắt đăng nhập bằng password
✅ Tắt root login
✅ Dùng SSH key Ed25519
✅ Bật rate limiting cho port SSH
Bảo vệ bổ sung:
✅ Cài và cấu hình Fail2Ban
✅ Cập nhật hệ thống thường xuyên (sudo apt update && sudo apt upgrade)
✅ Kiểm tra port mở định kỳ bằng ss -tlnp
✅ Dọn dẹp rules UFW không cần thiết
✅ Cài automatic security updates (unattended-upgrades)
Những Sai Lầm Hay Gặp
Bật UFW trước khi allow SSH — Tự khoá mình ra khỏi server. Luôn sudo ufw allow ssh trước tiên.
Expose port database ra internet — PostgreSQL (5432), MySQL (3306), Redis (6379) không bao giờ nên public. Bind vào localhost hoặc dùng firewall rule giới hạn truy cập.
Tin tưởng Docker + UFW chạy chung — Docker bypass UFW mặc định. Luôn bind Docker ports vào 127.0.0.1 cho internal services.
Dùng ufw allow mà không chỉ rõ protocol — sudo ufw allow 3000 allow cả TCP lẫn UDP. Hãy rõ ràng: sudo ufw allow 3000/tcp.
Quên IPv6 — UFW xử lý IPv6 mặc định (kiểm tra /etc/default/ufw xem IPV6=yes), nhưng hãy chắc chắn rules hoạt động cho cả hai protocol.
Bảng Tham Chiếu Nhanh
| Tác vụ | Lệnh |
|---|---|
| Kiểm tra trạng thái | sudo ufw status verbose |
| Bật UFW | sudo ufw enable |
| Tắt UFW | sudo ufw disable |
| Allow port | sudo ufw allow 80/tcp |
| Deny port | sudo ufw deny 3306/tcp |
| Allow từ IP | sudo ufw allow from 1.2.3.4 |
| Rate limit | sudo ufw limit ssh |
| Xoá rule | sudo ufw delete allow 8080/tcp |
| Liệt kê có số | sudo ufw status numbered |
| Reset tất cả | sudo ufw reset |
| Xem log | sudo grep UFW /var/log/syslog |
Tổng Kết
UFW là loại tool mà chỉ mất 5 phút setup nhưng cứu bạn khỏi vô số rắc rối. Mặc định hợp lý, câu lệnh dễ đọc, kết hợp với Fail2Ban và SSH hardening là bạn đã có nền tảng bảo mật vững chắc cho VPS.
Bài học chính: chặn hết mặc định, chỉ mở những gì cần, và luôn kiểm tra lại. Server chỉ an toàn bằng chính rules bạn đặt ra — nên hãy đặt cẩn thận, kiểm tra thường xuyên, và ngủ ngon hơn khi biết VPS không nằm phơi sương giữa internet.
📬 Đăng ký nhận bản tin
Nhận những bài viết mới nhất qua email mỗi tuần. Không spam, hủy đăng ký bất cứ lúc nào.
Chúng tôi tôn trọng quyền riêng tư của bạn. Hủy đăng ký bất cứ lúc nào.
💬 Comments
Đăng nhập để bình luận
Chúng tôi sẽ không đăng bất cứ điều gì mà không có sự cho phép của bạn.