電車の中から Home Assistant のダッシュボードを開きたい。ところがルーターが許してくれません。プロバイダーにキャリアグレード NAT の内側に置かれているか、ポートフォワーディングはできても電気を一つつけるために家のネットワーク全体をインターネットにさらしたくない、という状況です。小さな VPS なら両方を解決できます。自宅は WireGuard で VPS へ外向きに接続し、公開される顔は VPS だけ。本物のドメインと本物の証明書があり、自宅側には外の世界を待ち受けるものが何もありません。
構成の仕組み
phone ──HTTPS──> VPS (Caddy :443) ──WireGuard──> Home Assistant :8123 at home
▲
home box dials out on UDP 51820
VPS では 2 つのものを動かします。WireGuard サーバーと、リバースプロキシとしての Caddy です。自宅では WireGuard クライアント(Home Assistant のホスト、Raspberry Pi、またはルーター上)がトンネルを張り続けます。https://ha.example.com にアクセスすると、Caddy がリクエストをトンネル経由で 10.8.0.2:8123 に渡します。
必要なもの
- 専用 IP 付きのプラン。 VPS は 443 番と UDP 51820 番の受信を受け付ける必要があります。月額 $8 の Nano-IP で十分すぎるほどです。ダッシュボードの数キロバイトのトラフィックを楽に運びます。NAT プランは個人用 SSH ポート以外の受信接続を受け付けません(当社の NAT の仕組み)。
- VPS の IP を指す A レコードを持つドメイン。
- LAN 上の Home Assistant に到達できる自宅側の WireGuard クライアント。
1. VPS 上の WireGuard サーバー
apt update && apt install -y wireguard caddy
wg genkey | tee /etc/wireguard/server.key | wg pubkey > /etc/wireguard/server.pub
chmod 600 /etc/wireguard/server.key
cat > /etc/wireguard/wg0.conf <<EOF
[Interface]
Address = 10.8.0.1/24
ListenPort = 51820
PrivateKey = $(cat /etc/wireguard/server.key)
[Peer]
# the home side
PublicKey = HOME_PUBLIC_KEY
AllowedIPs = 10.8.0.2/32
EOF
systemctl enable --now wg-quick@wg0
ufw allow 51820/udp && ufw allow 80,443/tcp
2. 自宅側
自宅の任意の Linux マシン(または Home Assistant の WireGuard クライアントアドオン)でピアを作成します。keepalive が重要で、自宅ルーターの NAT を越えてトンネルを開いたままにしてくれます。
[Interface]
Address = 10.8.0.2/24
PrivateKey = HOME_PRIVATE_KEY
[Peer]
PublicKey = SERVER_PUBLIC_KEY
Endpoint = ha-vps.example.com:51820
AllowedIPs = 10.8.0.1/32
PersistentKeepalive = 25
WireGuard クライアントが Home Assistant とは別のマシンで動いている場合は、10.8.0.2:8123 を LAN 上の HA ホストに転送してください。もっと簡単なのは、クライアントを HA ホスト上で直接動かすことです。
3. Caddy で HTTPS
cat > /etc/caddy/Caddyfile <<'EOF'
ha.example.com {
reverse_proxy 10.8.0.2:8123
}
EOF
systemctl reload caddy
Caddy は証明書を自動で取得し、Home Assistant アプリが頼りにしている WebSocket 接続も処理します。
4. Home Assistant にプロキシを信頼させる
これがないと HA はプロキシ経由のリクエストを拒否します。configuration.yaml に次を追加します。
http:
use_x_forwarded_for: true
trusted_proxies:
- 10.8.0.1
Home Assistant を再起動し、https://ha.example.com を開いて、その URL をモバイルアプリの外部アドレスに設定します。
正直なトレードオフ
HTTPS は VPS で終端するので、そのサーバーはトンネルに入る前のダッシュボード通信を平文で見ることになります。サーバーはあなたのものであり、それこそが狙いですが、自宅ネットワークの一部として扱ってください。SSH は鍵認証のみ、アップデートは有効、ほかには何も動かさない。Home Assistant のパスワードと二要素ログインは有効のままにしておきましょう。プロキシは認証レイヤーではありません。
Home Assistant チームの公式有料クラウドサービスは、同じことを保守なしで実現し、プロジェクトの資金にもなります。サーバーをまったく運用したくないなら、それは十分に良い答えです。VPS の道が勝るのは、すでにセルフホストしている、独自ドメインを使いたい、あるいは将来ほかの自宅サービスも同じトンネルの後ろに置きたい場合です。
関連ガイド
- VPS に WireGuard VPN を構築する:WireGuard の完全な手順
- HTTPS 付きの Nginx リバースプロキシ:Caddy より Nginx を使いたい場合
- 新しい VPS を安全にする:インターネットに面するマシンではまずこれを
コメント
まだコメントはありません。最初になりましょう。