﻿# 使用 Cloudflare Tunnel 需要建立跨帳號通道時該如何正確設定

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

![representing a secure and complex connection setup between two different accounts in a cloud-based environment](https://stwillblogassets.blob.core.windows.net/files/images/external/stwillblogassets.blob.core.windows.net/ca09f2810da6caa0e216-739e81b0-c6d0-471b-bdf9-17955a721992.webp)

### 前置條件

這邊我們假設你已經安裝好 `cloudflared` 命令列工具：

```powershell
choco install cloudflared -y
```

並且假設你已經有一個 `~/.cloudflared` 資料夾，這個資料夾是用來存放 `cloudflared` 的設定檔。

### 建立帳號憑證

首先我們要先建立一個帳號憑證，這個憑證是用來證明你有權限可以使用 Cloudflare Tunnel 服務的，這個憑證是跟你的帳號有關的，所以你必須要使用你的帳號登入，這邊我們使用 `cloudflared tunnel login` 來登入，保存兩個帳號憑證的方法如下：

1.  首先，先登入第一個帳號
    
    ```powershell
    cloudflared tunnel login
    ```
    
    執行完後會開啟一個網頁，請登入你的 Cloudflare 帳號，然後選一個要授權的域名。
    
    預設登入並授權成功後會在 `~/.cloudflared` 資料夾下產生一個 `cert.pem` 檔案，這個檔案就是你的帳號憑證。
    
2.  接著，將這個憑證檔案移到其他地方或變更檔名
    
    ```powershell
    move ~/.cloudflared/cert.pem ~/.cloudflared/account1-angular.tw.pem
    ```
    
3.  接著，再登入第二個帳號
    
    ```powershell
    cloudflared tunnel login
    ```
    
    執行完後會開啟一個網頁，請登入你的 Cloudflare 帳號，然後選一個要授權的域名。
    
    預設登入並授權成功後會在 `~/.cloudflared` 資料夾下產生一個 `cert.pem` 檔案，這個檔案就是你的帳號憑證。
    
4.  接著，將這個憑證檔案移到其他地方或變更檔名
    
    ```powershell
    move ~/.cloudflared/cert.pem ~/.cloudflared/account2-playwright.tw.pem
    ```
    
5.  當有了兩個帳號的憑證檔，我們就可以順利連接兩個帳號的服務了。
    
    列出所有通道清單：
    
    ```powershell
    cloudflared `
      --origincert "~/.cloudflared/account1-angular.tw.pem" `
      tunnel list
    
    cloudflared `
      --origincert "~/.cloudflared/account2-playwright.tw.pem" `
      tunnel list
    ```
    

等確定都可以連線後，我們就可以開始建立通道了。

### 建立通道

1.  先準備一個 `cloudflared` 所需的設定檔，這個設定檔是用來告訴 `cloudflared` 要如何建立通道的
    
    假設檔名為 `~/.cloudflared/account1-angular.tw.yml`，內容如下：
    
    ```yaml
    tunnel: site1-tunnel
    
    ingress:
      - hostname: site1.angular.tw
        service: http://localhost:4200
      - service: http_status:404
    ```
    
    其中 `http://localhost:4200` 是你在本機要連接的服務，而 `site1.angular.tw` 是你要掛載到 Cloudflare Tunnel 讓用戶連接的域名。
    
2.  接著就是直接建立通道
    
    ```powershell
    cloudflared `
      --origincert "~/.cloudflared/account1-angular.tw.pem" `
      --config "~/.cloudflared/account1-angular.tw.yml" `
      tunnel create "site1-tunnel"
    ```
    
    建立好通道後，會在 `~/.cloudflared` 資料夾下產生一個 `[GUID].json` 檔案，裡面包含帳號與通道的金鑰設定，應妥善保管。
    
3.  啟動通道
    
    ```powershell
    cloudflared `
      --origincert "~/.cloudflared/account1-angular.tw.pem" `
      --config "~/.cloudflared/account1-angular.tw.yml" `
      tunnel run "site1-tunnel"
    ```
    
4.  建立 DNS 的 CNAME 記錄
    
    由於我的域名是由 Cloudflare 所管理的，所以我可以直接在 Cloudflare 的 DNS 設定中建立一個 CNAME 記錄，執行以下命令即可：
    
    ```powershell
    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
    -   [Cloudflare Tunnel](https://developers.cloudflare.com/cloudflare-one/connections/connect-networks/)
    -   [Downloads](https://developers.cloudflare.com/cloudflare-one/connections/connect-networks/downloads/)
