我今天被要求要設定一個臨時的網站讓客戶測試,但我的電腦已經設定好了一個通道,當時建立時是使用我在 Cloudflare 的 A 帳號,然而客戶想要連接的域名在我的另一個 Cloudflare 帳號下,設定的過程就卡關了,突然 cloudflared 變的沒有那麼方便。今天我就來記錄一下我如何解決這個問題。

前置條件
這邊我們假設你已經安裝好 cloudflared 命令列工具:
choco install cloudflared -y
並且假設你已經有一個 ~/.cloudflared 資料夾,這個資料夾是用來存放 cloudflared 的設定檔。
建立帳號憑證
首先我們要先建立一個帳號憑證,這個憑證是用來證明你有權限可以使用 Cloudflare Tunnel 服務的,這個憑證是跟你的帳號有關的,所以你必須要使用你的帳號登入,這邊我們使用 cloudflared tunnel login 來登入,保存兩個帳號憑證的方法如下:
- 
首先,先登入第一個帳號 cloudflared tunnel login
 執行完後會開啟一個網頁,請登入你的 Cloudflare 帳號,然後選一個要授權的域名。 預設登入並授權成功後會在 ~/.cloudflared資料夾下產生一個cert.pem檔案,這個檔案就是你的帳號憑證。
 
- 
接著,將這個憑證檔案移到其他地方或變更檔名 move ~/.cloudflared/cert.pem ~/.cloudflared/account1-angular.tw.pem
 
- 
接著,再登入第二個帳號 cloudflared tunnel login
 執行完後會開啟一個網頁,請登入你的 Cloudflare 帳號,然後選一個要授權的域名。 預設登入並授權成功後會在 ~/.cloudflared資料夾下產生一個cert.pem檔案,這個檔案就是你的帳號憑證。
 
- 
接著,將這個憑證檔案移到其他地方或變更檔名 move ~/.cloudflared/cert.pem ~/.cloudflared/account2-playwright.tw.pem
 
- 
當有了兩個帳號的憑證檔,我們就可以順利連接兩個帳號的服務了。 列出所有通道清單: cloudflared `
  --origincert "~/.cloudflared/account1-angular.tw.pem" `
  tunnel list
cloudflared `
  --origincert "~/.cloudflared/account2-playwright.tw.pem" `
  tunnel list
 
等確定都可以連線後,我們就可以開始建立通道了。
建立通道
- 
先準備一個 cloudflared所需的設定檔,這個設定檔是用來告訴cloudflared要如何建立通道的
 假設檔名為 ~/.cloudflared/account1-angular.tw.yml,內容如下:
 tunnel: site1-tunnel
ingress:
  - hostname: site1.angular.tw
    service: http://localhost:4200
  - service: http_status:404
 其中 http://localhost:4200是你在本機要連接的服務,而site1.angular.tw是你要掛載到 Cloudflare Tunnel 讓用戶連接的域名。
 
- 
接著就是直接建立通道 cloudflared `
  --origincert "~/.cloudflared/account1-angular.tw.pem" `
  --config "~/.cloudflared/account1-angular.tw.yml" `
  tunnel create "site1-tunnel"
 建立好通道後,會在 ~/.cloudflared資料夾下產生一個[GUID].json檔案,裡面包含帳號與通道的金鑰設定,應妥善保管。
 
- 
啟動通道 cloudflared `
  --origincert "~/.cloudflared/account1-angular.tw.pem" `
  --config "~/.cloudflared/account1-angular.tw.yml" `
  tunnel run "site1-tunnel"
 
- 
建立 DNS 的 CNAME 記錄 由於我的域名是由 Cloudflare 所管理的,所以我可以直接在 Cloudflare 的 DNS 設定中建立一個 CNAME 記錄,執行以下命令即可: cloudflared `
  --origincert "~/.cloudflared/account1-angular.tw.pem" `
  --config "~/.cloudflared/account1-angular.tw.yml" `
  tunnel route dns "site1-tunnel" "site1.angular.tw"
 
接著你可以用相同的用法,使用不同的憑證去建立另一個通道,這樣就可以在不同的帳號之間建立通道了。
相關連結
- Cloudflare Zero Trust docs