HomeAssistant从零开始折腾(三) - 出门在外也能访问

HA已经安装好了,在内网使用homeassistant.local域名已经可以愉快地玩耍了,接下来我们解决一个问题:如何搞定外网访问。

最终的效果:在任意可以访问互联网的地方,使用浏览器访问指定域名,即可访问到家里的HA实例。

目前家里环境没有公网 IPv4,仅有 IPv6,这估计也是现在大部分人的网络条件。

我采用的方案是,在公云服务器上部署 frp 进行穿透,并由 Traefik 作为统一入口处理所有入站流量,最终将请求转发至内网 HA 所在 IP。

我在介绍Homelab的时候有提过这个方案的细节,详见这里

总结成一个示意图,大概是这样子:


graph TD
%% 定义样式
classDef user fill:#7df,stroke:#333,stroke-width:2px,color:black;
classDef cloud fill:#e1f5fe,stroke:#01579b,stroke-width:2px,color:black;
classDef local fill:#e8f5e9,stroke:#2e7d32,stroke-width:2px,color:black;
classDef app fill:#fff9c4,stroke:#fbc02d,stroke-width:2px,color:black;
classDef borderless stroke-width:0,fill:none;

subgraph UserSide [ ]
    direction TB
    User[👤 用户<br/>浏览器]:::user
    Domain((inspoy.cc))
end

subgraph AliCloud [☁️ 公网环境: 阿里云 ECS]
    frps[frps 服务端]:::cloud
end

subgraph HomeLab [🏠 内网环境: Homelab]
    subgraph JumpHost [🖥️ 跳板机]
        frpc[frpc 客户端<br/>连接 frps]:::local
        traefik[Traefik 反向代理<br/>监听本地流量]:::app
    end

    HAOS[HAOS 虚拟机<br/>Home Assistant OS]:::local
end

%% 连接关系
User -->|1. HTTPS 请求| Domain
Domain -->|2. DNS 解析指向公网IP| frps

frps -->|3. Frp 隧道转发<br/>| frpc

frpc -->|4. 转发给本地端口<br/>| traefik
traefik -->|5. 根据 Host 路由规则| HAOS

%% 虚线区域示意
style UserSide fill:none,stroke:none
style AliCloud fill:#f0f7ff,stroke:#81d4fa,stroke-dasharray: 5 5
style HomeLab fill:#f1f8e9,stroke:#a5d6a7,stroke-dasharray: 5 5

然后就可以使用你的公网域名来访问HA了。然而如果不出意外,应该就会出意外了,你会遇到400错误,这是因为HA的反代需要设置白名单。在HA的configuration.yaml里添加如下内容并重启

1
2
3
4
http:
use_x_forwarded_for: true
trusted_proxies:
- 192.168.32.0/20 # 填写内网网段或跳板机IP

然后应该就没啥问题了

当然,跟其他所有服务一样,HA反代到公网之后,最好也再套一层WAF进行防护。