❤️ AZDIGI chính thức cập nhật hệ thống blog mới hoàn chỉnh. Tuy nhiên có thể một số bài viết bị sai lệch hình ảnh, hãy ấn nút Báo cáo bài viết ở cuối bài để AZDIGI cập nhật trong thời gian nhanh nhất. Chân thành cám ơn.
Bạn có máy tính ở nhà chạy Plex, Nextcloud, hay một con Raspberry Pi làm home server. Bạn muốn truy cập từ bên ngoài nhưng nhà mạng không cho mở port, modem nằm sau NAT, hoặc đơn giản là bạn không có IP tĩnh. Cloudflare Tunnel giải quyết đúng vấn đề này. Thay vì mở port cho bên ngoài kết nối vào, tunnel tạo một kết nối đi ra (outbound) từ máy bạn đến Cloudflare, rồi Cloudflare lo phần còn lại.
Cách này đặc biệt hữu ích cho máy cá nhân, homelab, NAS, máy ở công ty, hay bất kỳ thiết bị nào nằm sau NAT mà bạn không kiểm soát được router. VPS thì cũng dùng được, nhưng VPS vốn đã có IP public và mở port thoải mái rồi, nên tunnel ít cần thiết hơn.
Cloudflare Tunnel là gì?
Cloudflare Tunnel (tên cũ là Argo Tunnel) cho phép bạn kết nối máy tính với mạng lưới Cloudflare mà không cần mở port nào ra internet. Cách nó hoạt động:
- Bạn cài
cloudflaredtrên máy. cloudflaredtạo kết nối outbound (từ máy bạn ra ngoài) đến Cloudflare edge.- Khi có request đến domain của bạn, Cloudflare chuyển traffic qua tunnel đó về máy bạn.
- Máy bạn xử lý request và trả response ngược lại qua tunnel.
Máy không cần lắng nghe trên port public nào cả. Toàn bộ kết nối đều là outbound, nên firewall có thể block hết inbound traffic mà mọi thứ vẫn chạy bình thường.
Tại sao nên dùng Cloudflare Tunnel?
Câu hỏi hay nhất là: “mở port rồi dùng Nginx reverse proxy cũng được mà, sao phải dùng tunnel?” Với VPS thì đúng, mở port không có gì khó. Nhưng với máy ở nhà hay homelab thì khác.
- Nhà mạng chặn port hoặc NAT nhiều lớp. Đa số gói internet gia đình ở Việt Nam không cho bạn mở port 80/443. Có khi modem của nhà mạng nằm sau CGNAT, bạn không thể port forward dù muốn. Tunnel bỏ qua hết mấy rào cản này vì kết nối đi ra, không cần ai kết nối vào.
- Không cần IP tĩnh, không cần public IP. Máy ở nhà chỉ cần có internet là đủ. Không cần xin IP tĩnh từ nhà mạng, không cần dùng DDNS.
- Bảo mật hơn hẳn. Máy bạn không mở port nào ra internet. Không ai scan được, không ai brute force được. Máy như “tàng hình” trên internet.
- SSL tự động. Cloudflare lo hết phần SSL certificate. Bạn không cần cài Let’s Encrypt hay renew cert thủ công.
- Miễn phí. Cloudflare Tunnel hoàn toàn miễn phí, kể cả trên Free plan.
Dùng tunnel cho việc gì?
Mấy trường hợp phổ biến nhất:
- Truy cập NAS ở nhà (Synology, QNAP) từ bên ngoài mà không cần QuickConnect hay mở port trên modem.
- Chia sẻ app đang dev cho khách hàng hoặc team xem, thay vì deploy lên server chỉ để demo. Chạy
localhost:3000rồi tunnel ra là xong. - Homelab: expose Plex, Jellyfin, Home Assistant, Nextcloud, Grafana, hay bất kỳ service nào chạy trên máy ở nhà.
- Máy ở công ty nằm sau firewall công ty mà bạn không kiểm soát được.
- Raspberry Pi chạy web app, IoT dashboard, hay bất kỳ thứ gì có HTTP interface.
Cài đặt cloudflared
Bạn cần cài cloudflared lên máy muốn expose. Đây là daemon duy trì kết nối tunnel với Cloudflare. Tuỳ hệ điều hành, chọn cách cài phù hợp bên dưới.
Windows
Cách nhanh nhất là dùng winget (có sẵn trên Windows 10/11):
winget install --id Cloudflare.cloudflared
Hoặc tải trực tiếp file .exe:
- 64-bit: cloudflared-windows-amd64.exe
- 32-bit: cloudflared-windows-386.exe
Sau khi tải, bạn có thể chạy trực tiếp từ thư mục download hoặc thêm vào PATH để gọi được ở mọi nơi. Để cài như Windows service:
cloudflared.exe service install eyJhIjoixxxxxxxxx...
⚠️ cloudflared trên Windows không tự cập nhật. Bạn cần tải lại bản mới thủ công khi có phiên bản mới.
macOS
Dùng Homebrew:
brew install cloudflared
Hoặc tải file nén:
- Apple Silicon (M1/M2/M3/M4): cloudflared-darwin-arm64.tgz
- Intel Mac: cloudflared-darwin-amd64.tgz
Linux
Ubuntu/Debian:
curl -L --output cloudflared.deb https://github.com/cloudflare/cloudflared/releases/latest/download/cloudflared-linux-amd64.deb
sudo dpkg -i cloudflared.deb
RHEL/Rocky/AlmaLinux/CentOS:
sudo rpm -i https://github.com/cloudflare/cloudflared/releases/latest/download/cloudflared-linux-x86_64.rpm
Máy chạy ARM64 (Raspberry Pi, Oracle Cloud Free Tier) thì dùng bản cloudflared-linux-arm64.deb hoặc cloudflared-linux-aarch64.rpm tương ứng.
Docker
Nếu máy đã có Docker, bạn không cần cài gì thêm — chạy tunnel bằng container:
docker run cloudflare/cloudflared:latest tunnel --no-autoupdate run --token eyJhIjoixxxxxxxxx...
Cách này tiện cho NAS (Synology, QNAP) hoặc máy bạn không muốn cài thêm package.
Kiểm tra cài đặt
Sau khi cài xong, kiểm tra bằng:
cloudflared --version
Xem danh sách đầy đủ các bản tải tại trang downloads chính thức của Cloudflare.
Tạo Tunnel qua Dashboard
Có hai cách tạo tunnel: qua CLI (locally-managed) và qua Dashboard (remotely-managed). Mình khuyên dùng Dashboard vì dễ quản lý hơn, mọi cấu hình lưu trên Cloudflare, và bạn không cần giữ file config trên máy.
Bước 1: Đăng nhập vào Cloudflare Zero Trust Dashboard.
Bước 2: Vào Networks → Tunnels → Create a tunnel.

Bước 3: Chọn Cloudflared làm connector type, đặt tên cho tunnel (ví dụ: home-tunnel), rồi nhấn Save tunnel.

Bước 4: Cloudflare sẽ hiển thị một install command. Copy lệnh này và chạy trên máy. Lệnh sẽ có dạng:
sudo cloudflared service install eyJhIjoixxxxxxxxxxxxxxxxx...
Lệnh này tự cài cloudflared như một systemd service và kết nối tunnel về Cloudflare. Chạy xong, bạn sẽ thấy trạng thái tunnel chuyển sang Connected trên Dashboard.
⚠️ Token trong install command chứa thông tin xác thực tunnel. Không chia sẻ token này với ai.
Thêm Public Hostname
Tunnel đã connected, giờ bạn cần thêm public hostname để route traffic từ domain/subdomain về service trên máy.
Trong phần cấu hình tunnel, chọn tab Public Hostname → Add a public hostname.

Điền các thông tin:
- Subdomain: Phần subdomain bạn muốn dùng (ví dụ:
nas,plex, hoặc để trống nếu dùng root domain). - Domain: Chọn domain đã thêm vào Cloudflare.
- Type: Chọn
HTTPhoặcHTTPStùy service. - URL: Địa chỉ service trên máy, ví dụ
localhost:3000hoặclocalhost:8080.

Nhấn Save hostname. Cloudflare sẽ tự tạo DNS record (CNAME) trỏ về tunnel. Sau vài giây, bạn có thể truy cập service qua domain đã cấu hình.
Ví dụ thực tế
Truy cập NAS Synology từ bên ngoài
Synology DSM mặc định chạy trên port 5000 (HTTP) hoặc 5001 (HTTPS). Cài cloudflared trên NAS (Synology hỗ trợ Docker, dùng container cloudflare/cloudflared), rồi trỏ hostname nas.example.com → http://localhost:5000. Xong, truy cập từ bất kỳ đâu mà không cần QuickConnect.
Chia sẻ app đang dev cho khách xem
Đang code một app React chạy trên localhost:3000? Thay vì deploy lên Vercel chỉ để demo, bạn tạo tunnel trỏ demo.example.com → http://localhost:3000. Khách nhấn link là xem được luôn, còn bạn vẫn code trên máy bình thường.
Home Assistant / Plex / Jellyfin
Mấy service homelab này thường chạy trên Raspberry Pi hoặc mini PC ở nhà. Tunnel cho phép bạn truy cập Home Assistant (localhost:8123), Plex (localhost:32400), hay Jellyfin (localhost:8096) từ bên ngoài mà modem nhà mạng không cần đụng gì.
Chạy cloudflared như systemd service
Nếu bạn tạo tunnel qua Dashboard và chạy install command ở trên, cloudflared đã tự được cài như systemd service. Kiểm tra trạng thái:
sudo systemctl status cloudflared
Service sẽ tự start khi máy khởi động lại. Một số lệnh quản lý:
# Restart service
sudo systemctl restart cloudflared
# Xem logs
sudo journalctl -u cloudflared -f
# Dừng service
sudo systemctl stop cloudflared
Nếu bạn tạo tunnel bằng CLI (locally-managed), bạn cần chạy cloudflared service install thủ công để đăng ký systemd service.
Nhiều hostname trên 1 tunnel
Một tunnel phục vụ được nhiều hostname cùng lúc. Không cần tạo tunnel riêng cho mỗi service. Ví dụ, trên cùng một máy bạn có thể cấu hình:
nas.example.com→http://localhost:5000(Synology DSM)plex.example.com→http://localhost:32400(Plex)ha.example.com→http://localhost:8123(Home Assistant)cloud.example.com→http://localhost:8080(Nextcloud)
Tất cả đi qua cùng một tunnel, cùng một kết nối cloudflared. Thêm hostname mới thì vào Dashboard → chọn tunnel → Add a public hostname.
Access control với Zero Trust policies
Mặc định, ai có link cũng truy cập được service qua tunnel. Nếu bạn muốn giới hạn ai được vào, kết hợp thêm Cloudflare Access.
Ví dụ, bạn muốn chỉ mình bạn (hoặc vài người trong gia đình) truy cập được NAS:
- Vào Zero Trust Dashboard → Access → Applications → Add an application.
- Chọn Self-hosted, nhập domain (ví dụ:
nas.example.com). - Tạo policy: cho phép email cụ thể, ví dụ
ten.ban@gmail.com. - Khi truy cập
nas.example.com, Cloudflare sẽ yêu cầu xác thực qua email OTP hoặc Google/GitHub trước khi cho vào.
Rất hữu ích cho mấy thứ không nên public: admin panel, monitoring dashboard, database GUI, hay NAS cá nhân.
So sánh: Tunnel vs mở port truyền thống
| Tiêu chí | Mở port + Reverse Proxy | Cloudflare Tunnel |
|---|---|---|
| Port mở ra internet | 80, 443 (tối thiểu) | Không cần mở port nào |
| Public IP | Bắt buộc | Không cần |
| SSL certificate | Tự cài (Let’s Encrypt) | Cloudflare lo |
| Firewall config | Phải allow inbound | Chỉ cần outbound |
| DDoS protection | Tự lo hoặc thêm CDN | Có sẵn qua Cloudflare |
| Access control | Tự implement | Zero Trust policies |
| Setup phức tạp | Trung bình | Đơn giản |
| NAT/Firewall bypass | Không | Có |
| Phụ thuộc bên thứ 3 | Không | Có (Cloudflare) |
Tunnel phù hợp nhất khi: máy ở nhà không có public IP, nằm sau NAT, nhà mạng chặn port, hoặc bạn muốn expose service mà không đụng đến modem/router.
Mở port vẫn hợp lý khi: bạn cần full control, không muốn phụ thuộc Cloudflare, hoặc chạy protocol mà tunnel không hỗ trợ tốt (game server UDP, SSH trực tiếp).
Troubleshooting
Một số lỗi hay gặp:
Tunnel không kết nối (status: Inactive)
Kiểm tra service đang chạy chưa:
sudo systemctl status cloudflared
Nếu service lỗi, xem log chi tiết:
sudo journalctl -u cloudflared --no-pager -n 50
Nguyên nhân phổ biến:
- Token sai hoặc hết hạn: Xóa tunnel cũ, tạo mới, chạy lại install command.
- Firewall block outbound:
cloudflaredcần kết nối đến port 7844 (QUIC) hoặc 443 (HTTP/2) của Cloudflare. Đảm bảo outbound traffic không bị chặn. - DNS resolve lỗi: Kiểm tra máy có resolve được DNS không bằng
nslookup cloudflare.com.
Hostname không truy cập được (502/504 error)
Tunnel connected nhưng truy cập domain báo lỗi 502 hoặc 504? Vấn đề thường nằm ở phía service trên máy:
- Service chưa chạy: Kiểm tra service có đang listen trên port đã cấu hình không. Ví dụ:
curl http://localhost:3000trên máy. - Sai port hoặc protocol: Nếu service dùng HTTPS nội bộ, bạn cần chọn Type là
HTTPStrong hostname config, và có thể cần bật No TLS Verify nếu dùng self-signed cert. - Service chỉ bind 127.0.0.1: Đây không phải vấn đề vì
cloudflaredchạy trên cùng máy. Nhưng nếu service bind trên IP khác, hãy điều chỉnh URL cho đúng.
DNS record conflict
Nếu subdomain đã có DNS record (A hoặc CNAME) trước khi bạn thêm hostname vào tunnel, có thể bị conflict. Vào Cloudflare DNS dashboard, xóa record cũ, rồi thêm lại hostname trong tunnel config. Cloudflare sẽ tự tạo CNAME record mới trỏ về tunnel.
Tổng kết
Cloudflare Tunnel miễn phí và setup nhanh. Chỗ nó tỏa sáng nhất là máy cá nhân, homelab, NAS, Raspberry Pi, hay bất kỳ máy nào nằm sau NAT mà bạn muốn truy cập từ bên ngoài. VPS thì dùng cũng được, nhưng VPS vốn đã có IP public rồi nên lợi ích ít hơn.
Nếu bạn đang chạy homelab hay có máy ở nhà muốn truy cập từ xa, tunnel là cách đơn giản nhất mà mình biết. Cài cloudflared, tạo tunnel trên Dashboard, thêm hostname, xong.
Có thể bạn cần xem thêm
- Tailscale là gì? Hướng dẫn chi tiết từ A-Z
- CloudFlare là gì? Cách kết nối CloudFlare với Website
- SSH an toàn qua Tailscale: Bảo vệ VPS không cần mở port 22
- Domain, DNS và SSL trên Coolify — Cấu hình tên miền và HTTPS tự động
- Hướng dẫn Tailscale trên VPS: Tạo mạng riêng ảo an toàn từ A-Z
- Firewall trên Linux VPS - UFW và firewalld từ cơ bản đến thực tế
Về tác giả
Trần Thắng
Chuyên gia tại AZDIGI với nhiều năm kinh nghiệm trong lĩnh vực web hosting và quản trị hệ thống.