Contents

使用 Caddy 和 devtunnel 實現內網穿透

在開發和測試過程中,我們經常需要讓外部網路能夠訪問內部網路的服務。本文介紹如何使用 Caddy 反向代理和 Microsoft devtunnel 來實現內網穿透,讓外部網路可以安全地連接到內部網路服務。

使用場景

實際案例分享
最近 PM 去公司外面開會,臨時需要讓客戶測試內網的開發環境,叫我幫忙他操作內網系統,我突然想起一招,利用 Caddy 和 devtunnel 快速架設一個通道,讓客戶能夠透過公開網址訪問內網服務。

這個方案適用於以下場景:

  • 需要讓客戶或同事測試內部開發環境
  • 在本地開發環境進行 webhook 測試
  • 遠端存取家裡或辦公室的內部服務
  • 臨時分享本地開發的網站給其他人查看

什麼是 Caddy?

Caddy 是一個功能強大、使用簡單的開源網頁伺服器,內建自動 HTTPS 功能。它可以作為反向代理,將請求轉發到指定的後端服務。

什麼是 devtunnel?

Microsoft devtunnel 是微軟推出的開發工具,可以將本地端口暴露到公網,類似於 ngrok。它特別適合需要臨時測試的場景。

步驟一:安裝 Caddy

Windows 安裝

1
2
3
4
5
# 使用 winget 安裝
winget install Caddy.Caddy

# 或者從官網下載
# https://caddyserver.com/download

Linux 安裝

1
2
3
4
5
6
# Ubuntu/Debian
sudo apt install -y debian-keyring debian-archive-keyring apt-transport-https
curl -1sLf 'https://dl.cloudsmith.io/public/caddy/stable/gpg.key' | sudo gpg --dearmor -o /usr/share/keyrings/caddy-stable-archive-keyring.gpg
curl -1sLf 'https://dl.cloudsmith.io/public/caddy/stable/debian.deb.txt' | sudo tee /etc/apt/sources.list.d/caddy-stable.list
sudo apt update
sudo apt install caddy

macOS 安裝

1
brew install caddy

步驟二:設定 Caddy 反向代理

建立一個 Caddyfile 設定檔:

1
2
3
4
5
6
:3000 {
    # 把所有請求代理到目標網站
    reverse_proxy https://stage.com.tw {
        header_up Host stage.com.tw
    }
}

這個設定的意思是:

  • 在本機的 3000 端口監聽請求
  • 將所有請求轉發到 https://stage.com.tw
  • 設定 Host header 為 stage.com.tw,確保目標伺服器能正確處理請求

步驟三:啟動 Caddy

Caddyfile 所在目錄執行:

1
2
3
4
5
# Windows
caddy.exe run

# Linux/macOS
caddy run

你應該會看到類似這樣的輸出:

1
2
2025/12/17 04:56:00.000 INFO    using provided configuration    {"config_file": "Caddyfile"}
2025/12/17 04:56:00.000 INFO    http    server is listening only on the HTTP port, so no automatic HTTPS will be applied to this server        {"server_name": "srv0", "http_port": 3000}

這表示 Caddy 已經成功在 3000 端口啟動。你可以透過 http://localhost:3000 測試是否正常運作。

步驟四:安裝 devtunnel

Microsoft devtunnel 是命令列工具,可以透過多種方式安裝。

Windows 安裝

1
winget install Microsoft.devtunnel

Linux/macOS 安裝

1
2
# 下載並安裝
curl -sL https://aka.ms/DevTunnelCliInstall | bash

或者手動下載:

步驟五:使用 devtunnel 建立通道

首次使用需要登入:

1
devtunnel user login

建立並啟動通道:

1
2
# 將本地 3000 端口暴露到公網,允許匿名訪問
devtunnel host -p 3000 --allow-anonymous

執行後,devtunnel 會產生一個公開網址,類似:

1
2
Hosting port: 3000
Connect via browser: https://abc123xyz.devtunnels.ms

現在,任何人都可以透過這個網址訪問你的內部服務了!

devtunnel 常用參數

1
2
# 指定通道名稱(方便管理)
devtunnel host -p 3000 --allow-anonymous 

完整流程圖

1
2
3
4
5
6
7
外部使用者
devtunnel 公開網址 (https://abc123xyz.devtunnels.ms)
本機 Caddy (localhost:3000)
目標服務 (https://stage.com.tw 或 localhost:8080)

注意事項

  1. 安全性考量

    • 使用 --allow-anonymous 時,任何人都可以訪問你的服務,請確保不要暴露敏感資訊
    • 生產環境建議使用身份驗證
    • 定期更換或關閉不使用的通道
  2. 效能限制

    • devtunnel 免費版本有流量和連接數限制
    • 不建議用於生產環境
  3. 替代方案

    • ngrok: 功能更豐富,但免費版有限制
    • frp: 需要自己架設伺服器
    • Cloudflare Tunnel: 整合 Cloudflare CDN
  4. 防火牆設定

    • 確保本機防火牆允許 Caddy 監聽的端口
    • 如果無法連接,檢查防火牆規則

常見問題

Q: devtunnel 連接失敗怎麼辦?

A: 檢查以下幾點:

  • 確認 devtunnel 是否正常登入
  • 檢查本機端口 3000 是否被其他程式佔用
  • 確認 Caddy 是否正常運行

Q: 如何停止服務?

A:

  • Caddy: 在終端機按 Ctrl+C 即可停止
  • devtunnel: 按 Ctrl+C 會關閉通道

Q: 可以同時開多個端口嗎?

A: 可以,使用多個 devtunnel 實例:

1
2
3
4
5
# 終端機 1
devtunnel host -p 3000 --allow-anonymous

# 終端機 2
devtunnel host -p 4000 --allow-anonymous

總結

透過 Caddy 和 devtunnel 的組合,我們可以快速建立一個從外部網路連接到內部網路的通道。這個方案特別適合:

  • 快速展示開發成果
  • 進行 webhook 測試
  • 遠端除錯
  • 臨時分享本地服務

記得在不需要時關閉通道,以確保安全性。如果需要長期使用,建議考慮更專業的解決方案如 VPN 或正式的反向代理架構。

相關資源