远程访问安全指南

想在出门时用手表控制家里的设备,Home Assistant 就必须能从公网访问。本指南告诉你怎样做才安全。

适用于腕上智家 1.4.3 · 面向 Home Assistant 2024 年及以后的版本 · Docker、HA OS 安装方式均适用

先说结论:不要把 8123 端口直接映射到公网。 用加密隧道(Cloudflare Tunnel、frp + HTTPS)或 HA 官方云服务对外提供 HTTPS 地址,再加上专用账号、双重验证和登录失败封禁,风险才可控。

目录

  1. 为什么有风险
  2. 推荐的整体结构
  3. 选择远程访问方案
  4. 方案一:Cloudflare Tunnel
  5. 方案二:云服务器 + frp + HTTPS
  6. 方案三:Home Assistant Cloud
  7. 反向代理下的 HA 配置
  8. 账号安全
  9. HA 加固
  10. 不要这样做
  11. 腕上智家做了什么
  12. 发现异常时怎么办
  13. 安全检查清单

1. 为什么有风险

Home Assistant 控制的是真实世界里的东西:门锁、空调、热水器、摄像头。账号一旦被盗,对方可以开门、关掉安防、读取你的作息规律,后果远比一般网站账号泄露严重。

2. 推荐的整体结构

家里不开放任何入站端口,由家里主动向外建立一条加密隧道;手表只通过 HTTPS 域名访问。

推荐的远程访问结构 手表通过 HTTPS 连接隧道入口,隧道入口经由家里主动建立的加密隧道连到家中的 Home Assistant,家中路由器不开放任何端口。 手表 4G / 任意 Wi‑Fi HTTPS 隧道入口 Cloudflare / 云服务器 ha.example.com 家里主动连出 家庭网络 · 不开放端口 隧道客户端 Home Assistant

3. 选择远程访问方案

手表上装不了 VPN 客户端(如 Tailscale、WireGuard),所以必须有一个公网可访问的 HTTPS 地址。三种常见做法对比:

Cloudflare Tunnel云服务器 + frp + HTTPSHome Assistant Cloud
家里开放端口不需要不需要不需要
HTTPS 证书自动Caddy 自动申请自动
国内访问速度一般,偶尔不稳定稳定(选国内或香港机房)一般
费用免费(需自有域名)服务器 + 域名,按年付费按月订阅
配置难度中较高最低
备注不要开启需要网页登录的 Access 门禁国内机房使用 80/443 需要域名备案官方服务,同时支持语音助手接入

家里有公网 IP 时,也可以用路由器端口转发到家里的反向代理(只开 443、只转发到代理),但暴露面比隧道大,不作为首选。

4. 方案一:Cloudflare Tunnel

需要:一个已托管到 Cloudflare 的域名(以 example.com 为例),一台能常开、能访问 HA 的机器(可以就是运行 HA 的那台)。

  1. 登录 Cloudflare,进入 Zero Trust → Networks → Tunnels,点 Create a tunnel,类型选 Cloudflared,起名如 home。
  2. 在「安装连接器」一步选择 Docker,复制页面给出的令牌(--token 后面那一长串)。
  3. 在家里的机器上用 Docker 运行连接器:
    # 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。
  4. 在隧道的 Public Hostname 里添加:子域名 ha,域名 example.com,服务类型 HTTP,地址 localhost:8123(cloudflared 不在 HA 那台机器上时填 HA 的局域网地址,如 192.168.1.10:8123)。
  5. 在域名的 SSL/TLS 设置里打开 Always Use HTTPS。
  6. 按 第 7 节 修改 HA 的 configuration.yaml 并重启 HA。
  7. 在手机浏览器打开 https://ha.example.com 能看到 HA 登录页,即可在手表上使用这个地址登录。
不要给这个域名加 Cloudflare Access(需要网页登录的零信任门禁) 手表应用无法完成网页登录,会直接连不上。需要额外防护时,用 Security → WAF 的规则代替:例如只允许中国大陆访问,或对 /auth/ 路径做访问频率限制。

5. 方案二:云服务器 + frp + HTTPS

需要:一台有公网 IP 的云服务器、一个解析到这台服务器的域名(以 ha.example.com 为例)。服务器上运行 frps 和 Caddy(负责 HTTPS),家里运行 frpc。

国内机房需要备案 中国大陆的云服务器用域名对外提供网页服务(80/443 端口),域名需要先完成 ICP 备案;不想备案可以选香港等境外机房。

服务器端

# /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 的那台机器。

6. 方案三:Home Assistant Cloud

  1. 在 HA 中打开 设置 → Home Assistant Cloud,注册并订阅。
  2. 打开 远程控制,HA 会给出一个 https://xxxxxxxx.ui.nabu.casa 地址。
  3. 在手表上用这个地址登录即可,不需要修改 configuration.yaml。

这是 HA 官方提供的付费服务,配置最省事;服务器在境外,国内访问速度取决于网络环境。

7. 反向代理下的 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 里,删掉对应条目并重启即可解封。

8. 账号安全

给手表建一个专用账号

  1. 进入 设置 → 人员 → 添加人员,起名如「手表」,打开 允许登录,设置用户名和密码。
  2. 不要打开 管理员。万一手表或密码泄露,对方也无法修改 HA 的配置、安装集成或查看全部令牌。
  3. 不要打开 只能从本地网络登录,否则在外面无法使用。

非管理员账号可以正常控制设备。如果使用后房间分组显示异常(设备都出现在「未分配」),请反馈给我们。

开启双重验证

  1. 用手表专用账号登录 HA 网页,点左下角用户名进入 个人资料 → 安全。
  2. 在 多因素身份验证模块 里启用 身份验证器应用,用手机上的验证器 App 扫码。
  3. 以后在手表登录时,按提示输入验证器里的 6 位数字即可。

密码

9. HA 加固

10. 不要这样做

常见的危险做法

11. 腕上智家做了什么

应用侧的安全设计

12. 发现异常时怎么办

  1. 立即修改相关账号的密码。
  2. 在 个人资料 → 安全 里删除全部可疑的刷新令牌和长期访问令牌;手表需要重新登录。
  3. 检查 设置 → 系统 → 日志 和通知中心的登录记录,确认来源 IP。
  4. 暂时关闭隧道(停止 cloudflared / frpc 容器),排查完成后再恢复。
  5. 检查自动化、脚本、集成有没有被改动或新增;必要时从备份恢复。

13. 安全检查清单

勾选状态只保存在你当前的浏览器里。

0 / 0