我今天被要求要設定一個臨時的網站讓客戶測試,但我的電腦已經設定好了一個通道,當時建立時是使用我在 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