Хочется открыть дашборд Home Assistant из электрички, а роутер против: провайдер держит вас за CGNAT, или проброс технически возможен, но вешать всю домашнюю сеть на интернет ради одной лампочки не хочется. Маленький VPS решает обе проблемы. Дом сам подключается наружу к VPS по WireGuard, а публичное лицо — только этот сервер: с настоящим доменом, настоящим сертификатом и без единого домашнего порта, открытого миру.
Как это устроено
phone ──HTTPS──> VPS (Caddy :443) ──WireGuard──> Home Assistant :8123 at home
▲
home box dials out on UDP 51820
На VPS работают две вещи: сервер WireGuard и Caddy как reverse proxy. Дома клиент WireGuard (на хосте Home Assistant, на Raspberry Pi или на роутере) держит туннель открытым. Когда вы заходите на https://ha.example.com, Caddy отправляет запрос через туннель на 10.8.0.2:8123.
Что понадобится
- Тариф с выделенным IP. VPS должен принимать входящие 443 и UDP 51820. Nano-IP за $8/мес — с большим запасом: он гоняет килобайты трафика дашборда и даже не замечает нагрузки. NAT-тарифы не принимают входящие соединения, кроме персонального SSH-порта (как устроен NAT).
- Домен с A-записью на IP сервера.
- Клиент WireGuard дома, который видит Home Assistant в локальной сети.
1. Сервер WireGuard на VPS
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-машине дома (или в аддоне-клиенте WireGuard для Home Assistant) создайте пир. 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 на хост HA в локальной сети — или проще: поставьте клиент прямо на хост HA.
3. HTTPS через Caddy
cat > /etc/caddy/Caddyfile <<'EOF'
ha.example.com {
reverse_proxy 10.8.0.2:8123
}
EOF
systemctl reload caddy
Caddy сам получит сертификат и обработает WebSocket-соединение, на котором держится мобильное приложение Home Assistant.
4. Разрешите Home Assistant доверять прокси
Без этого HA отклоняет запросы через прокси. В configuration.yaml:
http:
use_x_forwarded_for: true
trusted_proxies:
- 10.8.0.1
Перезапустите Home Assistant, откройте https://ha.example.com и укажите этот адрес как внешний в мобильном приложении.
Честно о компромиссах
HTTPS заканчивается на VPS, так что этот сервер видит трафик дашборда в открытом виде, прежде чем тот уйдёт в туннель. Сервер ваш — в этом и смысл, — но относитесь к нему как к части домашней сети: только SSH-ключи, автообновления, больше ничего на нём не запускать. Пароль и двухфакторный вход самого Home Assistant оставьте включёнными: прокси — не слой аутентификации.
Платный официальный облачный сервис от команды Home Assistant делает то же самое без всякого обслуживания и заодно финансирует проект. Если сервер вам не нужен вовсе — это вполне достойный вариант. Путь через VPS выигрывает, когда вы уже держите свои сервисы, хотите свой домен или планируете позже спрятать за тем же туннелем и другие домашние сервисы.
Полезные инструкции
- Настройка WireGuard VPN на VPS — полный разбор WireGuard
- Nginx reverse proxy с HTTPS — если Nginx вам ближе Caddy
- Безопасность нового VPS — сделайте это первым делом на любом сервере, смотрящем в интернет
Комментарии
Пока нет комментариев. Будьте первым.