Cấu hình firewall UFW là cách đơn giản nhất để bảo vệ một VPS Ubuntu hoặc Debian. UFW (Uncomplicated Firewall) là lớp giao diện cho bộ lọc gói của kernel, biến những quy tắc như "cho SSH, cho HTTPS, chặn hết phần còn lại" thành các lệnh một dòng. Rủi ro thật sự duy nhất nằm ở thứ tự các bước: bật firewall trước khi mở SSH là bạn tự cắt kết nối của chính mình. Bài này đi theo thứ tự an toàn, sau đó là các rule mà hầu hết máy chủ cần, cách giới hạn tốc độ kết nối, và cái bẫy với Docker khiến nhiều người bất ngờ.
Cấu hình firewall UFW: nguyên tắc hoạt động
UFW áp dụng chính sách mặc định cho mọi kết nối không khớp rule nào, và xét các rule theo thứ tự đã thêm. Thiết lập thường dùng cho máy chủ là:
- Chiều vào: chặn mặc định. Chỉ những cổng bạn mở rõ ràng mới truy cập được.
- Chiều ra: cho phép mặc định. Máy chủ vẫn tải bản cập nhật, gọi API và gửi mail bình thường.
- Các rule cho phép cụ thể cho vài dịch vụ bạn chạy, như SSH, HTTP và HTTPS.
Chỉ vậy thôi. Phần lớn sai sót đến từ việc mở quá rộng ("cho mọi nơi truy cập database") chứ không phải mở quá ít.
Bước 1: cài đặt và kiểm tra trạng thái
UFW có sẵn trên Ubuntu nhưng mặc định chưa bật. Trên Debian, bạn cần cài trước.
sudo apt update
sudo apt install -y ufw
sudo ufw status
Kết quả sẽ là Status: inactive. Đừng bật vội.
Bước 2: đặt chính sách mặc định
sudo ufw default deny incoming
sudo ufw default allow outgoing
Các lệnh này chưa có hiệu lực cho tới khi firewall được bật, nên chạy qua SSH hoàn toàn an toàn.
Bước 3: mở SSH trước mọi thứ khác
Đây là bước giúp bạn không bị khoá ngoài. Dùng rule limit thay vì allow thông thường, vì nó có thêm khả năng chống dò mật khẩu cơ bản (xem phần dưới):
sudo ufw limit OpenSSH
OpenSSH là một application profile tương ứng cổng TCP 22. Nếu bạn đã chuyển SSH sang cổng khác, hãy dùng số cổng đó, ví dụ sudo ufw limit 2222/tcp. Xem danh sách profile bằng sudo ufw app list.
Nếu máy chủ quan trọng đến mức không thể mất quyền truy cập, hãy hẹn giờ tự tắt firewall trước khi bật, rồi huỷ hẹn giờ khi đã chắc chắn vào được:
sudo apt install -y at
echo "/usr/sbin/ufw disable" | sudo at now + 5 minutes
Bước 4: bật firewall và kiểm tra
sudo ufw enable
sudo ufw status verbose
UFW sẽ cảnh báo lệnh này có thể làm gián đoạn các kết nối SSH đang mở; trả lời y. Phiên hiện tại vẫn giữ nguyên. Giờ hãy mở một terminal thứ hai và kết nối lại. Nếu phiên SSH mới vào được, rule đã đúng. Nếu có hẹn giờ tự tắt, dùng sudo atq để xem số job rồi chạy sudo atrm kèm số đó để huỷ.
status verbose phải hiện Default: deny (incoming), allow (outgoing) cùng rule SSH cho cả IPv4 và IPv6. UFW quản lý cả rule IPv6, miễn là /etc/default/ufw có dòng IPV6=yes, vốn là mặc định trên Ubuntu.
Các rule thường dùng, chép là chạy
| Nhu cầu | Lệnh |
|---|---|
| Web server ở cổng 80 và 443 | sudo ufw allow 'Nginx Full' hoặc sudo ufw allow 80,443/tcp |
| Một cổng TCP | sudo ufw allow 8443/tcp |
| Một dải cổng | sudo ufw allow 6000:6010/tcp |
| Dịch vụ UDP như WireGuard | sudo ufw allow 51820/udp |
| Database chỉ cho một app server truy cập | sudo ufw allow from 203.0.113.20 to any port 5432 proto tcp |
| Quản trị chỉ từ IP văn phòng | sudo ufw allow from 203.0.113.50 to any port 22 proto tcp |
| Chặn một địa chỉ gây hại | sudo ufw insert 1 deny from 198.51.100.7 |
Hai thói quen giúp bộ rule luôn gọn gàng. Chỉ mở database, Redis và trang quản trị cho các địa chỉ cụ thể, không bao giờ mở cho mọi nơi. Và dùng insert 1 cho rule chặn, vì UFW dừng ở rule khớp đầu tiên, nếu không thì một rule cho phép phía trước sẽ thắng.
Lưu ý: rule giới hạn theo IP văn phòng chỉ hợp lý khi văn phòng có IP tĩnh. Nhiều gói Internet gia đình ở Việt Nam dùng IP động, đổi sau mỗi lần khởi động lại modem, nên đừng khoá SSH theo IP nhà nếu bạn không chắc.
Để xoá rule, liệt kê rule kèm số thứ tự rồi xoá theo số:
sudo ufw status numbered
sudo ufw delete 3
Số thứ tự thay đổi sau mỗi lần xoá, nên hãy liệt kê lại trước khi xoá rule tiếp theo.
Giới hạn tốc độ kết nối với ufw limit
Rule limit chặn kết nối từ một địa chỉ IP đã cố mở từ 6 kết nối trở lên trong 30 giây gần nhất. Đây là mặc định tốt cho SSH: người dùng thật hiếm khi chạm ngưỡng, còn bot dò mật khẩu thì có.
Nó không thay thế được việc bảo mật SSH đúng cách. Hãy tắt đăng nhập bằng mật khẩu và dùng key như hướng dẫn trong bài cài SSH key cho VPS, rồi làm tiếp phần còn lại của checklist bảo mật VPS mới. Đừng dùng limit cho HTTP, vì trình duyệt mở nhiều kết nối cùng lúc là chuyện bình thường.
Cái bẫy với Docker
Khi publish cổng container bằng docker run -p 8080:80 hoặc mục ports: trong Compose, Docker tự ghi rule lọc gói riêng và các rule này được xét trước rule của UFW. Cổng đó sẽ truy cập được từ Internet dù UFW không có rule cho phép, và ufw status cũng không hiển thị.
Cách sửa đơn giản nhất là chỉ publish cổng trên địa chỉ loopback và đặt reverse proxy phía trước:
services:
app:
image: myapp:latest
ports:
- "127.0.0.1:8080:80"
Khi đó Nginx gọi ứng dụng qua 127.0.0.1:8080, và chỉ có cổng 80, 443 hướng ra Internet. Bài cài Docker trên VPS và cấu hình Nginx reverse proxy SSL hướng dẫn đầy đủ cả hai phần.
Kiểm tra cổng nào thực sự đang mở
Rule chỉ thể hiện ý định; hãy kiểm tra thực tế từ cả hai phía.
sudo ss -tulpn
Lệnh này liệt kê mọi cổng đang lắng nghe và tiến trình tương ứng. Bất cứ thứ gì lắng nghe ở 0.0.0.0 hoặc [::] mà bạn không định mở ra ngoài thì nên chuyển sang 127.0.0.1 hoặc chặn lại. Sau đó kiểm tra từ máy tính của bạn, không phải từ máy chủ, bằng nc -vz 203.0.113.10 5432. Kết nối bị timeout nghĩa là cổng đã bị lọc, đúng như mong muốn với dịch vụ nội bộ.
Để xem các lần bị chặn, bật log ở mức thấp và đọc log kernel:
sudo ufw logging low
sudo journalctl -k -g UFW --since "1 hour ago"
Trên hệ thống có rsyslog, các dòng log này cũng được ghi vào /var/log/ufw.log.
Xử lý sự cố
- Bị khoá ngoài sau khi bật. Nếu đã hẹn giờ tự tắt, hãy chờ nó chạy rồi kết nối lại. Đây là lý do bạn nên giữ phiên đầu tiên cho tới khi phiên thứ hai vào được.
- Rule có vẻ không có tác dụng. Kiểm tra thứ tự bằng
sudo ufw status numbered; có thể một rule phía trước đã khớp trước. - Thay đổi không được áp dụng. Sau khi sửa tay các file trong
/etc/ufw/, chạysudo ufw reload. - Muốn làm lại từ đầu.
sudo ufw resettắt firewall và xoá toàn bộ rule. Nhớ mở lại SSH trước khi bật lần nữa.
Câu hỏi thường gặp
Ứng dụng chỉ lắng nghe ở localhost thì có cần UFW không?
Có. Firewall là lớp bảo vệ thứ hai, chặn những dịch vụ bạn quên mất, ví dụ một database cài với thiết lập mặc định đang lắng nghe trên mọi interface.
UFW có làm máy chủ chậm đi không?
Với một VPS thông thường chỉ có vài rule, mức ảnh hưởng không đáng kể.
AlmaLinux hay Rocky Linux có dùng UFW được không?
Các bản phân phối này mặc định dùng firewalld. UFW chủ yếu là công cụ của Ubuntu và Debian, và chạy hai trình quản lý firewall trên cùng máy chủ chỉ gây rối.
Có nên cho phép ping không?
UFW mặc định cho phép ICMP echo qua file before.rules. Giữ nguyên sẽ giúp bạn chẩn đoán mạng, ví dụ khi làm theo bài kiểm tra độ trễ VPS bằng ping và mtr.
Bắt đầu với một máy chủ sạch
Firewall dễ làm đúng nhất ngay từ ngày đầu, trước khi dịch vụ chồng chất lên nhau. Chọn vị trí theo hướng dẫn chọn vị trí VPS, tạo một cloud server Ubuntu hoặc Debian trong console Cloudj, và chạy bốn bước trên trước khi cài bất cứ thứ gì khác.