Chuyển đến nội dung chính

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.

Cấu hình Tường lửa UFW Linux

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).

bash
# 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:

bash
# 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:

bash
sudo nano /etc/default/ufw

Đảm bảo dòng IPV6=yes được kích hoạt:

text
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:

bash
sudo ufw enable

Nhấn yEnter 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:

bash
sudo ufw status verbose

Kết quả hiển thị:

text
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)

bash
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)

bash
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)

bash
# 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:

bash
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):

bash
sudo ufw status numbered

Kết quả:

text
[ 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):

bash
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 PREROUTINGDOCKER), đ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:

bash
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:

bash
sudo ufw-docker install

Khởi động lại UFW:

bash
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:

bash
sudo ufw-docker allow web_app 80

8. Bảng tra cứu các lệnh UFW thiết yếu

LệnhMô tả
sudo ufw enableBật tường lửa
sudo ufw disableTắt tường lửa
sudo ufw status verboseKiểm tra trạng thái và toàn bộ luật chi tiết
sudo ufw status numberedLiệ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 reloadNạ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.

💬

Thảo luận & Bình luận

Đă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.