UFW Firewall Ubuntu: Cài đặt nhanh và mẹo bảo vệ server thực chiến

Ubuntu tutorial - IT technology blog
Ubuntu tutorial - IT technology blog

Cài và bật UFW trong 5 phút

UFW (Uncomplicated Firewall) có sẵn trên Ubuntu 20.04/22.04/24.04, không cần cài thêm package nào. Nhưng trước khi bật, có một bước không được bỏ qua: allow SSH trước — không thì bạn sẽ tự khóa mình khỏi server, và phải nhờ provider console mới vào lại được.

Mình đã từng dính bẫy này hồi mới chuyển từ CentOS sang Ubuntu. Quen tay với firewalld nên chủ quan, bật UFW luôn mà không nhớ allow SSH trước. May cái server đó có KVM console nên vào khắc phục được — chứ VPS không có console thì chỉ còn nước rebuild. Từ đó, quy tắc số một là allow SSH trước, bật UFW sau.

# Kiểm tra trạng thái UFW
sudo ufw status

# Bước 1: Allow SSH TRƯỚC KHI enable (bắt buộc!)
sudo ufw allow ssh
# Hoặc chỉ định rõ port
sudo ufw allow 22/tcp

# Bước 2: Bật UFW
sudo ufw enable

# Bước 3: Xác nhận đã chạy
sudo ufw status verbose

Sau khi bật, output sẽ trông như này:

Status: active
Logging: on (low)
Default: deny (incoming), allow (outgoing)

To                         Action      From
--                         ------      ----
22/tcp                     ALLOW IN    Anywhere
22/tcp (v6)                ALLOW IN    Anywhere (v6)

Với server web, thêm HTTP/HTTPS vào ngay:

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

Hiểu rõ cách UFW hoạt động

Default policies — nền tảng của firewall

Cách UFW xử lý traffic khá trực quan: nếu không có rule nào khớp, nó fallback về default policy. Ubuntu đặt sẵn hai giá trị này:

  • Incoming: deny — chặn tất cả kết nối đến
  • Outgoing: allow — cho phép server kết nối ra ngoài tự do
# Đặt lại default (thường không cần thay)
sudo ufw default deny incoming
sudo ufw default allow outgoing

Cú pháp allow và deny

Cú pháp của UFW khá linh hoạt — bạn có thể viết theo service name, port số, hoặc kết hợp với IP nguồn tùy ý:

# Allow theo service name
sudo ufw allow http
sudo ufw allow https

# Allow theo port/protocol
sudo ufw allow 8080/tcp
sudo ufw allow 53/udp

# Chặn port không cho truy cập từ ngoài
sudo ufw deny 3306        # MySQL
sudo ufw deny 27017       # MongoDB

# Allow dải port
sudo ufw allow 6000:6007/tcp

# Allow theo IP nguồn cụ thể
sudo ufw allow from 203.0.113.10
sudo ufw allow from 203.0.113.0/24 to any port 22

Quản lý và xóa rules

# Xem rules kèm số thứ tự
sudo ufw status numbered

# Xóa rule theo cú pháp
sudo ufw delete allow 8080/tcp

# Xóa theo số thứ tự (tiện hơn khi nhiều rules)
sudo ufw delete 3

Nâng cao: Rate limiting và Application Profiles

Rate limiting — chặn brute force mà không cần cài thêm gì

Ít người để ý UFW có rate limiting sẵn: tự động block IP nếu cố kết nối quá 6 lần trong 30 giây. Không cần cài thêm gì, chỉ một lệnh là SSH có thêm lớp bảo vệ đáng kể:

# Bật rate limiting cho SSH
sudo ufw limit ssh
# Hoặc chỉ định port
sudo ufw limit 22/tcp

# Xác nhận rule đã được thêm
sudo ufw status

Nếu bạn đang dùng Fail2ban, không cần lo — hai thứ không xung đột. UFW chặn ở tầng packet kernel (phản ứng trong microseconds), còn Fail2ban phân tích log và block theo pattern phức tạp hơn. Dùng cả hai thì càng tốt.

Application Profiles — allow theo tên ứng dụng

Không muốn nhớ port number? UFW có sẵn profiles cho các ứng dụng thông dụng:

# Xem tất cả profiles có sẵn
sudo ufw app list
# Available applications:
#   Apache
#   Apache Full
#   Nginx Full
#   Nginx HTTP
#   Nginx HTTPS
#   OpenSSH

# Allow Nginx (cả HTTP lẫn HTTPS)
sudo ufw allow 'Nginx Full'

# Xem chi tiết một profile
sudo ufw app info 'Nginx Full'

Bật logging để debug

Khi traffic bị chặn mà không rõ lý do, log của UFW là thứ cần bật đầu tiên:

# Bật log (mức low đủ cho hầu hết trường hợp)
sudo ufw logging on
sudo ufw logging medium   # low | medium | high | full

# Xem log real-time
sudo tail -f /var/log/ufw.log

Tips thực tế từ kinh nghiệm

1. Đổi SSH port — cập nhật firewall trước khi restart sshd

Muốn đổi SSH sang port khác (ví dụ 2222)? Thứ tự thao tác là thứ quyết định bạn có bị khóa ra ngoài hay không:

# Bước 1: Allow port mới TRƯỚC
sudo ufw allow 2222/tcp

# Bước 2: Sửa /etc/ssh/sshd_config, restart sshd
# Bước 3: Mở terminal mới, test kết nối SSH qua port 2222
# Bước 4: Sau khi confirm OK, mới xóa rule port cũ
sudo ufw delete allow 22/tcp

2. Whitelist IP tin tưởng

# Cho phép IP nhà/văn phòng truy cập mọi port
sudo ufw allow from 203.0.113.10 to any

# Hoặc allow cả subnet
sudo ufw allow from 203.0.113.0/24 to any port 22

3. Reset hoàn toàn khi cấu hình sai

# Xóa tất cả rules, disable UFW
sudo ufw reset

# Cấu hình lại từ đầu
sudo ufw allow ssh
sudo ufw enable

4. Backup và restore cấu hình

Rules UFW lưu dưới dạng text thuần, backup chỉ mất vài giây:

# Vị trí file rules
# /etc/ufw/user.rules     — IPv4
# /etc/ufw/user6.rules    — IPv6

# Backup
sudo cp /etc/ufw/user.rules ~/ufw-backup-$(date +%Y%m%d).rules

5. Mở session SSH dự phòng khi chỉnh firewall

Cái này nghe đơn giản nhưng đã cứu mình ít nhất ba lần: khi đang chỉnh UFW, luôn giữ ít nhất hai session SSH mở cùng lúc. Lỡ tay xóa nhầm rule SSH, session kia vẫn còn sống — bạn sửa lại ngay mà không cần gọi support provider xin console access.

Sau vài năm dùng qua iptables, firewalld rồi UFW, mình vẫn chọn UFW cho các server Ubuntu cá nhân. Không phải nó mạnh nhất — mà vì lúc 2 giờ sáng cần open port gấp, ufw allow 8080/tcp nhanh hơn nhiều so với ngồi tra lại cú pháp iptables. Muốn bảo vệ chặt hơn, kết hợp thêm Fail2ban hoặc CrowdSec — nhưng đó là bài khác.

Share: