Home Assistant 通常放在家裡,出門在外要用 App 控制或看儀表板,最安全的做法不是開埠或買訂閱,而是把它接進 tailnet。Home Assistant 社群有現成的 Tailscale add-on(hassio-addons/app-tailscale),裝了之後 HA 就是 tailnet 上的一個節點,還能在 tailnet 內(Serve)或網際網路(Funnel)用 HTTPS 存取,全程不開任何對外埠。
本文依 2026 年 10 月的 Tailscale 官方文件、Home Assistant 官方文件與 add-on 原始 repo(
hassio-addons/app-tailscale的tailscale/DOCS.md、config.yaml)整理,以 Tailscale v1.104、Home Assistant 2026.8 以上為準。本文未在實機跑過 add-on 的整套設定,屬文件整理。
安裝 add-on
Home Assistant OS/Supervisor 使用者可以從社群 repo 安裝:
- 用 My 按鈕 直接開啟,或手動把 repo
https://github.com/hassio-addons/repository加進 Settings → Add-ons → Add-on Store → ⋮ → Repositories。 - 找到 Tailscale,安裝並啟動。
- 打開 add-on 的 Web UI 完成登入(官方建議用桌機的 Chrome 瀏覽器)。
- 到 Tailscale Machines 頁面確認 HA 已上線。
最關鍵的一步:關閉 key expiry
裝好之後第一件事,是到 Machines 頁面找到 Home Assistant 這台,點 ... → Disable key expiry。
原因很簡單:add-on 登入建立的那個節點有金鑰到期(key expiry),到期後 HA 就會從 tailnet 失聯,你得重新登入。add-on 文件開頭就提醒「Consider disabling key expiry to avoid losing connection」。HA 是要長期常開的裝置,把 key expiry 關掉才不會某天突然連不上。
用 Serve 給 HTTPS(share_homeassistant: serve)
預設你可以在 tailnet 內用 http://<ha 的 tailnet IP>:<HA 的 HTTP 埠> 或 MagicDNS 名稱直接連 HA,但那不是 HTTPS,瀏覽器會一直警告。HA 的 HTTP 埠依安裝方式而定:HAOS 自 Home Assistant 2026.8 起預設是 80,Container 版仍是 8123,以你實際的設定為準。add-on 的 share_homeassistant 選項可以讓它用 Tailscale Serve(或 Funnel)掛上有效的 TLS 憑證:
share_homeassistant: serve
share_on_port: 443serve:只對 tailnet 開放,網址是https://<主機名稱>.tailxxxxx.ts.net。funnel:連網際網路也能連(見下一節)。share_on_port只能是443、8443、10000(Funnel 的限制,Serve 本可任意埠但這裡一起套用)。
接著要在 Home Assistant 端做兩件事(add-on 文件與 HA 官方文件的共同要求):
- 關閉 HA 的 SSL/TLS(保持 HTTP,讓 Serve 在外面終止 TLS)。位置:Settings → System → Network → HTTP server → SSL/TLS。
- 讓 HA 信任 Serve 這個反向代理。位置:Settings → System → Network → HTTP server → Reverse proxy:
- 開啟 Trust X-Forwarded-For。
- 在 Trusted proxies 加上
127.0.0.1。
為什麼是 127.0.0.1:add-on 以 host 網路跑,Serve 在 add-on 內把流量轉到本機的 HA(127.0.0.1:<HA 的 HTTP 埠>,即 HA 當下的設定埠),所以 HA 看到的來源是 127.0.0.1。這兩項不設,HA 會擋掉來自反向代理的請求。
從 HA 2026.8 開始,HTTP 設定從
configuration.yaml的http:區塊移到 Settings → System → Network 的 UI(舊的 YAML 會在升級時自動匯入、並在 Repairs 提醒移除)。所以不要再跑去改 YAML 了。
什麼時候 trusted_proxies 要含 100.64.0.0/10
上面 127.0.0.1 是「經 add-on 自己的 Serve」的情境。如果你不走 Serve,而是讓 HA 被 tailnet 上的另一台反向代理轉發(例如一台跑 Caddy/nginx 的節點,或用 subnet router 連進來),那 HA 看到的來源就是 tailnet 的位址——屬於 100.64.0.0/10 這整段。這種情況 Trusted proxies 就該填 100.64.0.0/10(HA 官方文件提醒,用 CIDR 時要寫網路位址,例如 100.64.0.0/10,不是主機位址)。換句話說:代理是哪個來源,就信任哪個來源——add-on 的 Serve 是 127.0.0.1,tailnet 上的其他代理是 100.64.0.0/10。
什麼時候用 Funnel
share_homeassistant: funnel 會把 HA 經 Tailscale Funnel 公開到整個網際網路,網址一樣是 https://<主機名稱>.tailxxxxx.ts.net,但任何上得了網的人都能連。
要用的話,前提是:
- tailnet 啟用 MagicDNS 與 HTTPS 憑證。
- 在 tailnet policy 給這台裝置加 funnel node attribute(Funnel 需要這個屬性才開得起來)。
什麼時候才需要 Funnel?只有當你想從「沒裝 Tailscale 的裝置」連 HA(例如別人的手機、平板)。如果你所有會用 HA 的裝置都裝得了 Tailscale,用 serve 就好——Funnel 把整個 HA 登入頁暴露到公網,攻擊面大得多,等於把你上一節才收斂好的東西又打開。兩者的取捨見 Tailscale Funnel。
其他常用選項
| 選項 | 預設 | 說明 |
|---|---|---|
userspace_networking |
false |
設 true 時不建 tailscale0,只有單向(tailnet 連進 HA) |
accept_dns |
true |
接受 tailnet 的 DNS 設定 |
advertise_exit_node |
false |
把 HA 廣告成 exit node |
advertise_routes |
[] |
廣告 subnet routes(HA 兼 subnet router) |
advertise_tags |
[] |
指定 tag(例如 tag:homeassistant) |
taildrop |
false |
開啟後可從其他裝置用 Taildrop 丟檔案到 HA |
snat_subnet_routes |
true |
subnet router 的 SNAT |
userspace_networking: true 適用於「只想從外面連進 HA、不讓 HA 主動連 tailnet 上其他節點」的情境;預設的 false(kernel 模式)需要 /dev/net/tun,add-on 的 config.yaml 已經宣告好,不用另外管。
小結
| 步驟 | 做什麼 |
|---|---|
| 裝 add-on 並登入 | 從社群 repo 安裝,Web UI 登入 |
| Disable key expiry | 關掉金鑰到期,避免 HA 失聯 |
share_homeassistant: serve |
tailnet 內用 HTTPS 連 HA |
| HA reverse proxy 設定 | 開 Trust X-Forwarded-For、Trusted proxies 加 127.0.0.1 |
| 需要公網再開 Funnel | 加 funnel node attribute,只給裝不了 Tailscale 的裝置 |
核心概念就一句:用 Serve 把 HA 關在 tailnet 裡,Funnel 只在不得已時才開。這跟站內 Tailscale Serve 與 Tailscale Funnel 的原則完全一致。