Skip to content

Cloudflare tunnel

Cloudflare Tunnel là một dịch vụ cho phép bạn expose các ứng dụng chạy trên máy local ra internet một cách an toàn mà không cần mở port trên router hay firewall. Tunnel tạo ra một kết nối outbound từ máy tính của bạn đến Cloudflare edge network, sau đó Cloudflare sẽ proxy traffic từ internet về ứng dụng local của bạn.

Tại sao nên dùng Cloudflare Tunnel cho development?

Section titled “Tại sao nên dùng Cloudflare Tunnel cho development?”

🎯 Vấn đề với localhost và free tunnel services

Section titled “🎯 Vấn đề với localhost và free tunnel services”
Vấn đềlocalhostfree tunnel serviceCloudflare Tunnel
Domain thay đổiKhông có domainDomain random mỗi lần chạyCustom domain cố định
Config phải updateKhông share đượcPhải update config liên tụcSet once, dùng mãi
HTTPS supportCần setup manualCó sẵn nhưng domain thay đổiHTTPS + custom domain
External webhooksKhông nhận đượcMỗi lần test phải update URLURL không đổi

💡 Core benefits của custom domain với Cloudflare Tunnel

Section titled “💡 Core benefits của custom domain với Cloudflare Tunnel”

1. Domain cố định - Config một lần

Section titled “1. Domain cố định - Config một lần”
Terminal window
# Thay vì mỗi lần chạy ngrok:
# https://abc123.ngrok.io (session 1)
# https://xyz789.ngrok.io (session 2)
# → Phải update config mỗi lần!
# Với Cloudflare Tunnel:
https://dev.yourdomain.com # LUÔN GIỐNG NHAU
Terminal window
# Shopify/GitHub/Stripe webhook URL:
https://webhook.yourdomain.com/api/webhooks
# ↑ Set một lần, không bao giờ thay đổi

Có nhiều cách để setup và quản lý Cloudflare Tunnel:

Phương phápMô tảUse case
Manual run (locally-managed)Quản lý tunnel qua CLI và config files localDevelopment, testing
Service modeTunnel chạy như system service, tự động startProduction, always-on
Zero Trust DashboardQuản lý tunnel qua web interfaceTeam collaboration

Trong docs này, chúng ta sẽ tập trung vào Manual run (locally-managed) vì đây là cách linh hoạt nhất cho development và cho phép bạn hiểu rõ cách hoạt động của tunnel.

:::note Platform Support Hướng dẫn này được thực hiện trên macOS. Các nền tảng khác (Linux, Windows) có workflow tương tự với một số điều chỉnh về installation và file paths.

Tham khảo Official Cloudflare Tunnel Documentation cho hướng dẫn chi tiết theo từng platform. :::


import Tabs from ‘@theme/Tabs’; import TabItem from ‘@theme/TabItem’;

Terminal window
brew install cloudflared
Terminal window
# Download from GitHub releases
wget https://github.com/cloudflare/cloudflared/releases/latest/download/cloudflared-darwin-amd64.tgz
tar -xzf cloudflared-darwin-amd64.tgz
sudo mv cloudflared /usr/local/bin/

:::warning Prerequisites Bạn cần có domain đã được add vào Cloudflare và nameservers đã pointing về Cloudflare. :::


Terminal window
cloudflared tunnel login

:::note Điều gì sẽ xảy ra? Lệnh này sẽ:

  • Mở browser để bạn login vào Cloudflare account
  • Chọn domain bạn muốn sử dụng
  • Download certificate vào ~/.cloudflared/cert.pem (macOS/Linux) hoặc %USERPROFILE%\.cloudflared\cert.pem (Windows) :::
Terminal window
# Tạo tunnel với tên tùy chọn
cloudflared tunnel create my-dev-tunnel
Expected output
Tunnel credentials written to ~/.cloudflared/[UUID].json (macOS/Linux)
Created tunnel my-dev-tunnel with id [UUID]

Tạo file ~/.cloudflared/config.yml:

~/.cloudflared/config.yml
tunnel: my-dev-tunnel
credentials-file: ~/.cloudflared/[UUID].json

:::info Config từ Dashboard File config.yml chỉ chứa basic tunnel settings. Ingress rules (hostname → service mapping) sẽ được config từ Zero Trust Dashboard thay vì file local. :::

Bước 4: Config ingress từ Zero Trust Dashboard

Section titled “Bước 4: Config ingress từ Zero Trust Dashboard”
  1. Vào Zero Trust Dashboard: https://one.dash.cloudflare.com
  2. AccessTunnelsmy-dev-tunnel
  3. Click “Add a public hostname”
  4. Thêm hostname và service:
    • Public hostname: app.yourdomain.com
    • Service: http://localhost:3000
  5. Save
Terminal window
cloudflared tunnel run my-dev-tunnel

:::tip Successful connection Khi thành công, bạn sẽ thấy log tương tự:

2024-06-19T10:30:00Z INF Connection established location=HAN
2024-06-19T10:30:00Z INF Registered tunnel connection

:::


Terminal window
cloudflared tunnel list
Example output
ID NAME CREATED
abc123-def456-ghi789 my-dev-tunnel 2024-06-19T10:00:00Z
Terminal window
# Test hostname sẽ route về service nào
cloudflared tunnel ingress url https://app.yourdomain.com
# Validate cấu hình ingress
cloudflared tunnel ingress validate
Terminal window
cloudflared tunnel --loglevel debug run my-dev-tunnel
Terminal window
nohup cloudflared tunnel run my-dev-tunnel > tunnel.log 2>&1 &

Nhấn Ctrl+C

Terminal window
# Tìm process
ps aux | grep cloudflared
# Kill specific process
kill [PID]
# Hoặc kill tất cả cloudflared processes
pkill cloudflared

Ví dụ 1: Thay thế ngrok cho webhook development

Section titled “Ví dụ 1: Thay thế ngrok cho webhook development”

Vấn đề với ngrok free:

Terminal window
# Mỗi lần restart ngrok:
ngrok http 3000
# → https://abc123.ngrok.io (khác mỗi lần)
# → Phải update webhook URL ở Shopify/GitHub/Stripe...

Giải pháp với Cloudflare Tunnel:

~/.cloudflared/config.yml
tunnel: my-webhook
credentials-file: ~/.cloudflared/abc123-def456-ghi789.json

Config từ Zero Trust Dashboard:

  • Public hostname: webhook.yourdomain.com
  • Service: http://localhost:3000
Terminal window
# Chạy tunnel
cloudflared tunnel run my-webhook
# Webhook URL LUÔN GIỐNG NHAU:
# https://webhook.yourdomain.com

:::success Lợi ích

  • URL không đổi - Set webhook một lần
  • Không cần update config mỗi khi dev restart :::

Ví dụ 2: Custom domain cho development app

Section titled “Ví dụ 2: Custom domain cho development app”

Vấn đề với localhost:

Terminal window
# Không share được:
http://localhost:3000 # Chỉ máy local access được
# Không test mobile được:
# Cần config network phức tạp

Giải pháp với Cloudflare Tunnel:

~/.cloudflared/config.yml
tunnel: dev-app
credentials-file: ~/.cloudflared/abc123-def456-ghi789.json

Config từ Zero Trust Dashboard:

  • Public hostname: dev.yourdomain.com
  • Service: http://localhost:3000
Terminal window
# Start app
npm run dev # localhost:3000
# Start tunnel
cloudflared tunnel run dev-app
# Access từ bất kỳ đâu:
# https://dev.yourdomain.com

:::


Manual run (locally-managed) tunnel mang lại stable custom domains thay thế hoàn hảo cho localhost và ngrok free:

  • Custom domain cố định - Không thay đổi mỗi session
  • Set once, use forever - Config một lần, dùng mãi mãi
  • Webhook development - External services không cần update URLs

:::info Perfect for Developers muốn stable development environment với custom domains thay vì depend vào random URLs từ free tunnel services. :::