:::

用Cloudflare Tunnel的內網穿透來連接Home Assistant的Google助理 / Using Cloudflare Tunnel for Internal Network Penetration to Connect Home Assistant to Google Assistant

2025-1018-234306.png

如果要讓Google助理操作Home Assistant所連結的設備,那麼必須要有能夠連上Home Assistant的公開HTTPS網址才行。由於原本我用的Telebit發生問題,所以我花了一些時間找尋替代方案。這篇就做個記錄吧。

To allow Google Assistant to control devices connected to Home Assistant, a public HTTPS address that can connect to Home Assistant is required. Since my original Telebit had issues, I spent some time looking for alternatives. This is just a record of that.


網路架構 / Network Architecture

20251018_HA_.note.pptx_1_-cropped.png

在開始講解之前,我們要先釐清一下本篇文章所要著重的重點。

上圖的左半邊是Google助理連結Home Assistant操作智慧裝置的主要途徑。具體來說,我們在Android手機呼叫Google助理時,它背後會去操作Google Home應用程式裡面連結的裝置。Google Home的連結是透過我們在Google Cloud Platform (簡稱GCP)設定好Home Assistant的整合方式來連到我們區域網路裡面的Home Assistant,以此操作跟Home Assistant相連的智慧裝置,例如智慧燈泡。

如果設定完成的話,我們就能夠用語音指令來控制家裡的智慧燈泡。舉例來說,我們可以直接用語音控制來發送指令:「OK Google,關閉客廳燈光。」然後我們就能聽到Google助理回覆類似「好的,客廳燈光已關閉」的訊息,此時Home Assistant連接的智慧燈泡就會關閉。

20251018_HA_.note.pptx_2_-cropped.png

然而上述的操作是在已經設定完成的前提下才能進行。而這背後的設定才是真正複雜的地方,也是本篇文章所要講述的重點。

我所在的網路環境並沒有公開IP,甚至連DDNS都沒辦法設定。如果要在外面連線到本地網路,就必須仰賴內網穿透、虛擬區網等技術。而這次為了要讓外面的GCP連接到本地網路的Home Assistant,Cloudflare Tunnel方案就成了我這次的選擇。

2025-1018-221348.png

圖片來源:https://try.cloudflare.com/ 

Cloudflare為人知名的是它的試用方案:https://try.cloudflare.com/ 。不過試用方案trycloudflare.com 每次產生的網址都是隨機變化,這樣不能作為GCP的整合設定。所以我們這次用的是能夠固定網址的Cloudflare Tunnel方案

選擇Cloudflare Tunnel方案的話,就會連帶增加託管Domain Name、設定HA trusted_proxies等幾個步驟。我稍微整理一下,把這些必要步驟列成上圖右邊的6點:

  1. 申請Domain Name
  2. 託管Cloudflare
  3. 設定Cloudflare Tunnel
  4. 安裝Cloudflare Tunnel
  5. 設定HA trusted_proxies
  6. 設定GCP

以下我會概述這些步驟的設定。由於這些步驟所使用的服務實在是太常改變,過幾年來看,本篇可能就已經不能使用了。所以大家參考看看就好。


1. 域名申請 / Domain Name Registration

為了要使用固定網址的Cloudflare Tunnel,我們要給它一個可供管理的網域名稱(domain name)。我本來想要用之前在DigitalPlat FreeDomain申請的免費網域名稱,但現在似乎是無法使用的樣子。網路上是有些可以申請網域名稱的網站,例如freedomain.one,但它提供的網域名稱並非跟根網域(root domain),無法託管到Cloudflare上。

2025-10-18_22-25.png

找到最後,我選擇的是L53 Domain Name。只要使用它提供的兌換碼「newuser」,每個帳號所申請的網域名稱第一年就能免費。然而必須注意的是,你所使用的email最好先在Gravatar註冊並上傳大頭照,不然很容易被當成可疑帳號而被取消申請。

2025-1018-223643.png

確認我們可以修改網域的名稱伺服器,即可進行下一步。


2. 託管網域名稱到Cloudflare / Connect the Domain Name to Cloudflare

2025-1018-223828.png

接著我們來到Cloudflare,進入 https://dash.cloudflare.com/。如果你還沒有註冊Cloudflare的話,可以到 https://dash.cloudflare.com/sign-up 註冊。註冊可以用Google帳號即可。

讓我們在Cloudflare Dashboard右上角的「+ Add」裡面進入「Connect a domain」。

2025-1018-224207.png

1. 填入剛剛申請的網域名稱,然後 2. Continue 即可。

2025-1018-224344.png

選擇Free免費方案。

2025-1018-224454.png

在「Review your DNS records」裡面,跳到最下面,按「Continue to activation」。

2025-1018-224534.png

跳出警告訊息,按「Confirm」繼續。

2025-1018-224603.png

在 「Last step: Update your nameservers to activate Cloudflare」 裡面,我們可以看到Cloudflare提供的兩個名稱伺服器 (name server)。

2025-1018-224726.png

回到L53 Domain Name,把名稱伺服器替換成Cloudflare提供的設定。

2025-1018-224825.png

再到Cloudflare,按「Continue」繼續。

2025-1018-224856.png

接下來你需要等待一段時間。我自己的經驗是2小時左右。雖然Cloudflare提供了「Check nameservers now」的按鈕可以按,但這也不會讓它立即生效。

2025-1018-225019.png

如果生效的話,你的信箱會收到通知。這樣我們就可以繼續進行下一步了。


3&4. 設定並安裝Cloudflare Tunnel / Create and Install Cloudflare Tunnel

2025-1018-225258.png

回到Cloudflare Dashboard https://dash.cloudflare.com/。我們可以看到剛剛設定的網域名稱已經啟用。

2025-1018-225357.png

進入左邊導覽列的PROTECT & CONNECT > Zero Trust。

2025-1018-225443.png

再Zero Trust區域,進入左邊導覽列的Networks > Tunnels。

2025-1018-225526.png

按下「Create a tunnel」按鈕。

2025-1018-225554.png

選「Cloudflared」。

2025-1018-225715.png

設定Tunnel的名稱,然後Save tunnel。

2025-1018-225747.png

接下來會看到各種作業系統下Cloudflared的安裝方法,請根據你的Home Assistant安裝方式來選擇。由於我是在Kubuntu 上以Docker運作Home Assistant,所以Cloudflared應該會架設在相容於Ubuntu的Debian上。

2025-1018-230035.png

上圖的腳本中,1. 是安裝cloudflared所需要的指令,2. 是安裝目前設定的Cloudflare Tunnel的指令。依序在Home Assistant所在的作業系統裡面執行即可。

附帶一提,如果你要在Home Assistant的作業系統上移除原本安裝好的Cloudflare Tunnel,可以使用以下指令:

cloudflared service uninstall

2025-1018-230618.png

圖片來源:https://youtu.be/OJBHG9oJTDk?t=180 

如果順利安裝好的話,安裝腳本下面的「Connectors」會看到連接訊息。接著按「Next」繼續即可。

2025-1018-230855.png

接著在「Published application routes」裡面進行設定:

  1. Subdomain:自己命名即可,例如「ha」。
  2. Domain:選擇剛剛託管的網域名稱。
  3. Type:HTTP。選擇Home Assistant的預設連線HTTP。
  4. URL:localhost:8123。這是Home Assistant的預設連線網址跟連接埠。

再來按右下角的「Save」,Cloudflare Tunnel就設定完成了。

2025-1018-231437.png 

未來我們就可以用「[Subdomain].[Domain]」的組合來開啟Home Assistant。


5. 設定HA trusted_proxies / Set "trusted_proxies" in Home Assistant's Configuration

2025-1018-231808.png

然而,如果直接開啟Cloudflare Tunnel設定好的網址,我們卻會看到「400: Bad Request」的錯誤訊息畫面。別擔心,這不是Cloudflare Tunnel的問題,是Home Assistant的安全機制。

讓我們看看Home Assistant主控臺的訊息,它可能會出現以下內容:

ha  | 2025-10-18 20:45:46.002 ERROR (MainThread) [homeassistant.components.http.forwarded] A request from a reverse proxy was received from ::1, but your HTTP integration is not set-up for reverse proxies

這表示Home Assistant拒絕了來自「::1」的反向代理請求。

要解決這個問題,我們需要在Home Assistant的configuration.yaml裡面,加入以下內容:

http:
  use_x_forwarded_for: true
  trusted_proxies:
    - 127.0.0.1
    - ::1

然後重新啟動Home Assistant,讓設定檔生效。最後我們就能透過Cloudflare Tunnel來開啟Home Assistant了。


6. 設定GCP跟Android的Google Home

2025-1018-232455.png

最後要設定GCP的部分,請參考Home Assistant的Google Assistant中的「Google Cloud Platform configuration 」:

步驟非常多,而且常常會隨著GCP改版而有些許不同。遵循Home Assistant的步驟一步一步設定,大致上都能完成。祝好運。


結語 / Conclusion

本篇講述了如何使用Cloudflare Tunnel內網穿透來讓Home Assistant可以被GCP連接,進而實現能在手機的Google助理上操控智慧設備的目的。

這個目的到底是什麼呢?其實也只是能夠用語音操控「OK Google,關閉客廳燈光」而已。為了實現這個目的,背後需要仰賴非常多且不同的服務,而且設定的細節也會不斷改變。儘管我已經把整個設定建構完成,但考慮到所花費的時間、以及未來的可維護性,這讓我再次反思語音操控的必要性。


如果是你的話,你會怎麽選擇呢?

  • 1. 主要重點還是在能用Google助理來操控Home Assistant,這可以延伸出很多變化,因此很值得。
  • 2. 用Home Assistant Cloud,每年付65美金,就能省下這篇文章所要做的所有事情喔。
  • 3. 直接在手機上操控Home Assistant不是更快嗎?
  • 4. 我連出聲或動手都不想做,用感應器自動判斷吧。
  • 5. 其他:你有什麼其他想法,歡迎在下面留言分享喔!