Vì sao mình chia tay Port Forwarding để đến với Cloudflare Tunnel?
Bạn đang chạy Home Lab hoặc VPS nhưng ngại mở port 80/443 vì sợ hacker “dòm ngó”? Cloudflare Tunnel chính là giải pháp giúp bạn đưa ứng dụng lên mạng mà vẫn đóng kín cửa nhà. Trước đây, mỗi lần muốn public một service, mình phải cấu hình Port Forwarding trên modem rất phiền phức. Chưa kể, IP nhà mạng thay đổi liên tục khiến DDNS đôi khi hoạt động không ổn định.
Sau hơn 6 tháng chuyển toàn bộ hệ thống sang Cloudflare Tunnel, mình rút ra 3 ưu điểm đáng giá nhất:
- Vượt rào CGNAT: Bạn vẫn có thể public website dù đang dùng mạng 4G hoặc mạng chung cư không có quyền truy cập modem.
- Ẩn danh hoàn toàn: Hacker không thể scan ra IP thật của bạn. Mọi traffic đều được lọc qua tường lửa của Cloudflare trước khi tới server.
- SSL “tận răng”: Bạn không cần cài thêm Certbot hay lo gia hạn chứng chỉ Let’s Encrypt mỗi 3 tháng.
Quick Start: Public ứng dụng Docker trong 5 phút
Để bắt đầu, bạn cần một tài khoản Cloudflare và một tên miền đã trỏ Nameserver về đây.
Bước 1: Tạo Tunnel trên Dashboard
Bạn truy cập Zero Trust Dashboard -> Networks -> Tunnels. Hãy chọn Create a Tunnel, đặt tên gợi nhớ như home-server và nhấn Save.
Bước 2: Chạy Connector bằng Docker
Cloudflare sẽ cấp cho bạn một mã token. Hãy chạy lệnh dưới đây trên server của bạn (nhớ thay YOUR_TOKEN_HERE bằng mã thật):
docker run -d --name cloudflared cloudflare/cloudflared:latest tunnel --no-autoupdate run --token YOUR_TOKEN_HERE
Ngay khi chạy, container này sẽ thiết lập một kết nối outbound đến Cloudflare. Bạn không cần mở bất kỳ port nào trên Router hay Firewall của VPS nữa.
Bước 3: Cấu hình Public Hostname
Quay lại giao diện web, tại tab Public Hostname, bạn nhấn Add a public hostname và điền thông tin:
- Subdomain:
app - Domain: chọn domain của bạn
- Service Type: HTTP
- URL:
localhost:8080(Port ứng dụng của bạn)
Thử truy cập https://app.yourdomain.com xem. Ổ khóa xanh đã xuất hiện, ứng dụng đã online!
Triển khai chuyên nghiệp với Docker Compose
Trong thực tế, mình luôn dùng docker-compose.yml để quản lý. Cách này giúp các container kết nối với nhau qua mạng nội bộ Docker. Bạn thậm chí không cần expose port ra ngoài host (không cần dòng ports:).
version: "3.9"
services:
my-app:
image: nginx:alpine
container_name: web_app
networks:
- internal_network
tunnel:
image: cloudflare/cloudflared:latest
restart: always
command: tunnel run --token ${CF_TUNNEL_TOKEN}
networks:
- internal_network
networks:
internal_network:
driver: bridge
Mẹo nhỏ: Trong phần cấu hình trên Dashboard, thay vì điền localhost:80, hãy điền http://web_app:80. Cloudflare Tunnel sẽ tìm thẳng đến container web_app trong cùng network.
Bảo mật lớp 2 với Cloudflare Access
Với các công cụ quản lý như Portainer hoặc Adminer, mình thường dùng thêm Cloudflare Access. Thay vì để trang login lộ thiên, bạn có thể thiết lập chính sách chỉ cho phép email của chính mình truy cập. Khi đó, Cloudflare sẽ gửi mã OTP qua email để xác minh danh tính. Cách này chặn đứng 100% các cuộc tấn công brute-force vào mật khẩu ứng dụng.
Vài lưu ý “xương máu” để tránh ăn hành
Dù rất ngon, nhưng Cloudflare Tunnel không phải là vạn năng. Dưới đây là những gì mình rút ra sau thời gian dài sử dụng:
1. Giới hạn dung lượng upload
Gói Free của Cloudflare mặc định giới hạn file upload khoảng 100MB. Nếu bạn dùng Nextcloud để backup video 4K, bạn sẽ gặp lỗi 413. Hãy cân nhắc kỹ nếu ứng dụng của bạn cần truyền tải file dung lượng lớn thường xuyên.
2. Độ trễ (Latency)
Traffic phải đi vòng qua hạ tầng Cloudflare nên ping sẽ tăng thêm khoảng 20ms – 50ms. Với web app thông thường thì không sao, nhưng nếu bạn chạy game server yêu cầu độ trễ thấp, đây có thể là vấn đề.
3. Bảo mật Token
Mã CF_TUNNEL_TOKEN cực kỳ quan trọng. Ai có nó đều có thể “chọc” vào hệ thống của bạn. Hãy lưu nó vào file .env và tuyệt đối không đẩy lên GitHub công khai.
Tóm lại, Cloudflare Tunnel là bước tiến lớn so với cách NAT port truyền thống. Nó vừa nhanh, vừa bảo mật lại cực kỳ dễ triển khai. Nếu bạn đang xây dựng Home Lab, hãy thử chuyển sang Tunnel ngay hôm nay.

