ポート開放なしで自宅のHome Assistantに外出先からアクセスできるようにした

はじめに

自宅のProxmox上でHome Assistantを動かしているのですが、外出先からも操作したいなぁとずっと思っていました。とはいえ、自宅のルーターのポートを開放して外に公開するのはセキュリティ的に怖いので避けたいところです。

そこで今回はルーターのポート開放なしで、外部アクセスできるようにしてみました。使ったのはHome Assistantでよく利用されるのを目にする Tailscale というVPNです。VPN経由なのでHTTPS化は必須ではないのですが、証明書の警告が出るのが気になったので、あわせて正式なHTTPS証明書付きでHTTPS接続できるようにもしておきました。

TailscaleはWireGuardベースのVPNで、手持ちの端末を仮想的な同じネットワーク(tailnet)に入れてくれます。接続の中継はTailscale側がやってくれるので、ルーターのポート開放が要らないのが一番のメリットです。外出先からでも、まるで自宅のLAN内にいるかのようにHome Assistantへアクセスできます。

構成はシンプルで、次のようになっています。

  • 自宅サーバーのProxmox上で Home Assistant OS が稼働
  • Tailscaleは HAのAdd-onとして導入。HA自身がtailnetのノード(xxxx.ts.net / 100.x.x.x)になる
  • スマホのAndroidにもTailscaleを入れる

この「HA自身がtailnetのノードになる」構成のおかげで、Subnet routerもExit Nodeも要らず、設定がとても楽になりました。

ただ、実際にやってみると途中で2回ほどハマったので、その切り分けも含めて記録しておきます。

ハマりポイント① Android常時VPNでネットが「死んだ」ように見える

まず最初のハマりどころです。

症状

Androidで常時VPN(Tailscale)をONにすると、「プライベートDNSサーバーにアクセスできません/インターネット未接続」と表示され、家のWi-Fiまで使えなくなってしまいました。

原因

原因はAndroidの「プライベートDNS」(DNS over TLS)設定

プライベートDNSを特定ホスト名の厳格モードにしていると、Androidは常にそのホストへDoT(暗号化DNS)で問い合わせようとします。Tailscale接続中はDNSがMagicDNS(100.100.100.100)に向けられるため、指定したDoTホストに到達できず名前解決が失敗していた、というのが原因だと思われます(パケットまでは確認していません)。

解決

Androidの設定 → ネットワークとインターネット → プライベートDNSを「自動」 に変更したら直りました。

ハマりポイント② HTTPSアクセスで ERR_CONNECTION_REFUSED

VPNが繋がったので、次はHTTPS化です。ここでもう一度ハマりました。

症状

https://<ホスト名> にアクセスすると ERR_CONNECTION_REFUSED がでてしまいました。

原因

単純にポート違い

Home Assistantはデフォルトで http / ポート 8123 で待ち受けています。URLでポートを省略すると、https:// は443、http:// は80へ繋ぎに行ってしまいます。

http://<ホスト名>:8123 で試すとログイン画面が表示され、HAが平文HTTP・8123で動いていると確定できました。

HTTPS化の最終構成

最終的には、HA本体にはSSLを入れず、Tailscale Serveに443を終端させてHAの8123へ中継する方式にしました。これで自己署名警告の出ないHTTPS接続が可能となります。

手順

  1. Tailscale管理コンソール(/admin/dns)で MagicDNS を ON、さらに HTTPS Certificates を Enable にする
  2. HAの configuration.yaml に以下を追加する。Tailscale Serveが同一ホストのリバースプロキシとして中継するため、これが無いとHAが400を返します。
http:
  use_x_forwarded_for: true
  trusted_proxies:
    - 127.0.0.1
  1. Tailscale Add-onの設定で Share Home Assistant with Serve or Funnelserve(tailnet内のみ公開・正式証明書付き)に、Share on port443 にする
    • funnelインターネット全体に公開されてしまうらしいので注意。
  2. HAコアを再起動 → その後Tailscale Add-onを再起動
  3. https://<ホスト名>.ts.net(443・ポート省略)でアクセスすると、証明書警告なしでログイン画面が表示されます

動作確認

  • 外出先(モバイル回線・Wi-Fi OFF)からアクセスできることを確認しました
  • Companion Appのサーバーアドレスに上記のHTTPS URLを設定すれば、外からでもそのまま使えます

まとめ

今回やったことと、ハマらないためのポイントをまとめておきます。

  • 自宅Home Assistantに、ポート開放なし・正式HTTPS証明書付きで外部アクセスできるようにした
  • 手順としては、HTTPS化より先にVPN接続(+DNS問題)を片付けると切り分けが楽でした
  • HTTPS化はHA本体でやらず、Tailscale Serveに任せるのが楽で、正式証明書もそのまま手に入ります

ポート開放せずにここまでできるのは地味に便利で、外から家電の状態を確認できるようになりました。今後はオートメーションの通知なども外出先で受け取れるように広げていければと思っています。

参考

コメントを残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です

このサイトは reCAPTCHA によって保護されており、Google のプライバシーポリシー および 利用規約 に適用されます。

reCaptcha の認証期間が終了しました。ページを再読み込みしてください。