Back to blog

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

linuxubuntusecurityvpsdevopsfirewall
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 ufw

Kiểm tra trạng thái:

sudo ufw status
# Status: inactive

Quy 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/tcp

Bật UFW

sudo ufw enable

Sẽ 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 verbose
Status: 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/tcp

Dù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/tcp

Reset Toàn Bộ

# Nút huỷ diệt — xoá TẤT CẢ rules và tắt UFW
sudo ufw reset

Cấ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 enable

Nguyê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 postgres

Cá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: bridge

Cá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 docker

Cả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 sshd

Cập nhật UFW:

sudo ufw allow 2222/tcp
sudo ufw delete allow 22/tcp
# hoặc: sudo ufw delete allow ssh

Quan 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-ip

Rồi trên server, tắt đăng nhập bằng password:

sudo nano /etc/ssh/sshd_config
PasswordAuthentication no
PubkeyAuthentication yes
PermitRootLogin no
sudo systemctl restart sshd

4. Bật Logging

# Đặt mức logging (low, medium, high, full)
sudo ufw logging medium

Xem 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 -20

5. 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 -tlnp

Nế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 fail2ban

Tạ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 = ufw
sudo systemctl enable fail2ban
sudo systemctl start fail2ban

Giờ 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 sshd

Checklist 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áisudo ufw status verbose
Bật UFWsudo ufw enable
Tắt UFWsudo ufw disable
Allow portsudo ufw allow 80/tcp
Deny portsudo ufw deny 3306/tcp
Allow từ IPsudo ufw allow from 1.2.3.4
Rate limitsudo ufw limit ssh
Xoá rulesudo ufw delete allow 8080/tcp
Liệt kê có sốsudo ufw status numbered
Reset tất cảsudo ufw reset
Xem logsudo 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.