想在出门时用手表控制家里的设备,Home Assistant 就必须能从公网访问。本指南告诉你怎样做才安全。
适用于腕上智家 1.4.3 · 面向 Home Assistant 2024 年及以后的版本 · Docker、HA OS 安装方式均适用
Home Assistant 控制的是真实世界里的东西:门锁、空调、热水器、摄像头。账号一旦被盗,对方可以开门、关掉安防、读取你的作息规律,后果远比一般网站账号泄露严重。
家里不开放任何入站端口,由家里主动向外建立一条加密隧道;手表只通过 HTTPS 域名访问。
手表上装不了 VPN 客户端(如 Tailscale、WireGuard),所以必须有一个公网可访问的 HTTPS 地址。三种常见做法对比:
| Cloudflare Tunnel | 云服务器 + frp + HTTPS | Home Assistant Cloud | |
|---|---|---|---|
| 家里开放端口 | 不需要 | 不需要 | 不需要 |
| HTTPS 证书 | 自动 | Caddy 自动申请 | 自动 |
| 国内访问速度 | 一般,偶尔不稳定 | 稳定(选国内或香港机房) | 一般 |
| 费用 | 免费(需自有域名) | 服务器 + 域名,按年付费 | 按月订阅 |
| 配置难度 | 中 | 较高 | 最低 |
| 备注 | 不要开启需要网页登录的 Access 门禁 | 国内机房使用 80/443 需要域名备案 | 官方服务,同时支持语音助手接入 |
家里有公网 IP 时,也可以用路由器端口转发到家里的反向代理(只开 443、只转发到代理),但暴露面比隧道大,不作为首选。
需要:一个已托管到 Cloudflare 的域名(以 example.com 为例),一台能常开、能访问 HA 的机器(可以就是运行 HA 的那台)。
home。--token 后面那一长串)。# docker-compose.yml
services:
cloudflared:
image: cloudflare/cloudflared:latest
restart: unless-stopped
network_mode: host # 直接访问本机的 8123
command: tunnel --no-autoupdate run
environment:
- TUNNEL_TOKEN=粘贴第 2 步的令牌
然后执行 docker compose up -d,回到网页确认连接器状态为 Healthy。ha,域名 example.com,服务类型 HTTP,地址 localhost:8123(cloudflared 不在 HA 那台机器上时填 HA 的局域网地址,如 192.168.1.10:8123)。configuration.yaml 并重启 HA。https://ha.example.com 能看到 HA 登录页,即可在手表上使用这个地址登录。/auth/ 路径做访问频率限制。
需要:一台有公网 IP 的云服务器、一个解析到这台服务器的域名(以 ha.example.com 为例)。服务器上运行 frps 和 Caddy(负责 HTTPS),家里运行 frpc。
# /etc/frp/frps.toml
bindPort = 7000 # frpc 连接用的端口,安全组只放行这个和 80/443
vhostHTTPPort = 8080 # 只给本机的 Caddy 用,不要对外放行
auth.method = "token"
auth.token = "换成至少 32 位的随机字符串"
# /etc/caddy/Caddyfile —— Caddy 会自动申请并续期 HTTPS 证书
ha.example.com {
reverse_proxy 127.0.0.1:8080
}
云服务器安全组只放行 80、443、7000,不要放行 8080。
# frpc.toml
serverAddr = "云服务器公网 IP"
serverPort = 7000
auth.method = "token"
auth.token = "与服务器端相同"
[[proxies]]
name = "home-assistant"
type = "http"
localIP = "192.168.1.10" # 换成你的 HA 局域网地址
localPort = 8123
customDomains = ["ha.example.com"]
启动后按 第 7 节 配置 HA,HA 看到的请求来源是运行 frpc 的那台机器。
https://xxxxxxxx.ui.nabu.casa 地址。configuration.yaml。这是 HA 官方提供的付费服务,配置最省事;服务器在境外,国内访问速度取决于网络环境。
使用隧道或反向代理后,所有请求在 HA 看来都来自代理。必须告诉 HA 哪些代理可信,HA 才会从 X-Forwarded-For 里读取真实的访问者 IP;否则 HA 会拒绝代理请求,或者把登录失败算在代理头上、把所有人一起封掉。
# configuration.yaml
http:
use_x_forwarded_for: true
trusted_proxies:
- 127.0.0.1 # 代理和 HA 在同一台机器(cloudflared 使用 host 网络时)
- ::1
# - 172.16.0.0/12 # 代理运行在 Docker 默认网桥里时
# - 192.168.1.20 # 代理 / frpc 在局域网另一台机器上时,填它的地址
ip_ban_enabled: true # 登录失败达到次数后封禁该 IP
login_attempts_threshold: 5
修改后到 开发者工具 → YAML → 检查配置,通过后重启 HA。被误封的 IP 记录在配置目录的 ip_bans.yaml 里,删掉对应条目并重启即可解封。
非管理员账号可以正常控制设备。如果使用后房间分组显示异常(设备都出现在「未分配」),请反馈给我们。
http:// 地址(腕上智家也会直接拒绝这类地址)。勾选状态只保存在你当前的浏览器里。