Làm chủ tường lửa UFW trên Linux: Qui tắc, giới hạn kết nối và xử lí xung đột Docker
Hướng dẫn toàn diện làm chủ tường lửa UFW (Uncomplicated Firewall) trên Ubuntu: Thiết lập chính sách mặc định, mở cổng theo IP, giới hạn brute-force (Rate Limiting) và khắc phục lỗi Docker bypass tường lửa.

Giới thiệu về UFW: Tường lửa thân thiện của Linux
Trên hệ điều hành Linux, công cụ quản lý gói tin mạng gốc là iptables (hoặc nftables trong các bản phân phối mới). Mặc dù iptables cực kỳ mạnh mẽ và linh hoạt, cú pháp của nó lại vô cùng phức tạp và dễ gây nhầm lẫn dẫn đến việc người quản trị vô tình khóa chính mình ra khỏi máy chủ.
UFW (Uncomplicated Firewall) được phát triển bởi Canonical nhằm cung cấp một giao diện dòng lệnh đơn giản, trực quan và an toàn để quản lý iptables.
Trong bài viết này, chúng ta sẽ đi sâu vào cách làm chủ UFW từ các lệnh cơ bản nhất, cấu hình mở cổng theo IP nguồn, giới hạn tốc độ chống brute-force và giải quyết triệt để vấn đề nan giải: Docker tự động bypass tường lửa UFW.
1. Thiết lập Chính sách Tường lửa Mặc định (Default Policies)
Một quy tắc vàng trong an ninh mạng là áp dụng mô hình Zero Trust: Chặn toàn bộ lưu lượng truy cập từ ngoài vào (Incoming) và chỉ mở từng cổng cụ thể theo danh sách cho phép (Whitelist), trong khi cho phép toàn bộ lưu lượng từ trong máy chủ đi ra (Outgoing).
# Chặn toàn bộ kết nối đi vào
sudo ufw default deny incoming
# Cho phép toàn bộ kết nối đi ra
sudo ufw default allow outgoing
2. Mở cổng kết nối cơ bản & Hỗ trợ giao thức IPv6
Trước khi bật tường lửa, bạn BẮT BUỘC PHẢI MỞ CỔNG SSH để không bị ngắt kết nối:
# Cho phép cổng SSH mặc định (Port 22)
sudo ufw allow 22/tcp comment 'SSH standard'
# Nếu bạn đã đổi cổng SSH sang 2222:
sudo ufw allow 2222/tcp comment 'SSH custom'
# Cho phép dịch vụ Web (HTTP cổng 80 & HTTPS cổng 443)
sudo ufw allow 80/tcp comment 'HTTP Web'
sudo ufw allow 443/tcp comment 'HTTPS Web'
Đảm bảo UFW hỗ trợ cả IPv4 và IPv6
Mở file cấu hình /etc/default/ufw:
sudo nano /etc/default/ufw
Đảm bảo dòng IPV6=yes được kích hoạt:
IPV6=yes
3. Kích hoạt và Kiểm tra trạng thái Tường lửa
Bây giờ bạn có thể an tâm bật UFW:
sudo ufw enable
Nhấn y và Enter khi hệ thống cảnh báo lệnh có thể làm gián đoạn kết nối SSH.
Kiểm tra danh sách các quy tắc chi tiết:
sudo ufw status verbose
Kết quả hiển thị:
Status: active
Logging: on (low)
Default: deny (incoming), allow (outgoing), disabled (routed)
New profiles: skip
To Action From
-- ------ ----
22/tcp ALLOW IN Anywhere # SSH standard
80/tcp ALLOW IN Anywhere # HTTP Web
443/tcp ALLOW IN Anywhere # HTTPS Web
22/tcp (v6) ALLOW IN Anywhere (v6) # SSH standard
80/tcp (v6) ALLOW IN Anywhere (v6) # HTTP Web
443/tcp (v6) ALLOW IN Anywhere (v6) # HTTPS Web
4. Các quy tắc nâng cao: Giới hạn theo Địa chỉ IP và Dải mạng
Trong thực tế sản xuất, bạn thường cần giới hạn quyền truy cập database hoặc cổng quản trị chỉ cho các địa chỉ IP cố định của công ty hoặc máy chủ nội bộ.
A. Chỉ cho phép một địa chỉ IP cụ thể truy cập cổng Database (PostgreSQL 5432)
sudo ufw allow from 203.0.113.88 to any port 5432 proto tcp comment 'Allow office IP to DB'
B. Cho phép toàn bộ dải mạng con nội bộ (Subnet)
sudo ufw allow from 10.0.0.0/24 comment 'Allow all internal VPC traffic'
C. Mở một dải cổng liên tiếp (Port Range)
# Cho phép dải cổng từ 6000 đến 6010 cho giao thức UDP
sudo ufw allow 6000:6010/udp comment 'Media ports'
5. Giới hạn tần suất kết nối chống Brute-force (Rate Limiting)
UFW tích hợp sẵn tính năng limit rất hữu ích cho các dịch vụ nhạy cảm như SSH. Lệnh này sẽ tự động từ chối kết nối nếu một địa chỉ IP cố gắng kết nối từ 6 lần trở lên trong vòng 30 giây:
sudo ufw limit 22/tcp comment 'Rate limit SSH brute force'
6. Xóa và Chỉnh sửa các quy tắc Tường lửa
Để xóa một quy tắc mà không sợ nhầm lẫn, cách tốt nhất là hiển thị danh sách theo số thứ tự (Numbered rules):
sudo ufw status numbered
Kết quả:
[ 1] 22/tcp ALLOW IN Anywhere
[ 2] 80/tcp ALLOW IN Anywhere
[ 3] 443/tcp ALLOW IN Anywhere
[ 4] 5432/tcp ALLOW IN 203.0.113.88
Để xóa quy tắc số 4 (mở cổng 5432):
sudo ufw delete 4
7. Giải quyết triệt để vấn đề Docker vượt mặt UFW (Docker Bypass UFW)
Vấn đề:
Khi bạn chạy Docker với cờ -p 8080:8080, Docker tự động chèn các quy tắc vào bảng iptables (chuỗi PREROUTING và DOCKER), điều này khiến các gói tin mạng đi thẳng vào container mà hoàn toàn bỏ qua các quy tắc của UFW.
Giải pháp xử lý chuẩn mực:
Chúng ta sử dụng dự án mã nguồn mở chuẩn ufw-docker để điều chỉnh bảng định tuyến của UFW tương thích với Docker:
Tải và cài đặt script ufw-docker:
sudo wget -O /usr/local/bin/ufw-docker https://github.com/chaifeng/ufw-docker/raw/master/ufw-docker
sudo chmod +x /usr/local/bin/ufw-docker
Cài đặt cấu hình chuỗi UFW cho Docker:
sudo ufw-docker install
Khởi động lại UFW:
sudo systemctl restart ufw
Bây giờ, mọi cổng publish của Docker sẽ mặc định bị chặn bởi UFW. Khi muốn mở cổng container web_app ra ngoài, bạn dùng lệnh tường minh:
sudo ufw-docker allow web_app 80
8. Bảng tra cứu các lệnh UFW thiết yếu
| Lệnh | Mô tả |
|---|---|
sudo ufw enable | Bật tường lửa |
sudo ufw disable | Tắt tường lửa |
sudo ufw status verbose | Kiểm tra trạng thái và toàn bộ luật chi tiết |
sudo ufw status numbered | Liệt kê các luật kèm số thứ tự |
sudo ufw delete <số> | Xóa luật theo số thứ tự |
sudo ufw reload | Nạp lại các quy tắc sau khi chỉnh sửa |
sudo ufw reset | Đưa toàn bộ cấu hình về mặc định ban đầu |
Tổng kết
Tường lửa UFW là công cụ bảo vệ tuyến đầu không thể thiếu của bất kỳ máy chủ Linux nào. Kết hợp chính sách mặc định deny incoming, giới hạn IP cho các cổng nhạy cảm và xử lý chuỗi định tuyến với Docker sẽ giúp hệ thống của bạn luôn an toàn trước mọi hành vi dò quét trái phép từ Internet.



Đăng nhập bằng tài khoản GitHub để đặt câu hỏi hoặc đóng góp ý kiến cho bài viết.