好不容易建立起完整的智能家居系统,只能在局域网内使用,实在是太不给力了。本期教程将指导大家实现 HA 的外网安全访问。

Home Assistant 本身为外网访问提供完整的 Let's Encryption + Duck Dns 支持,但是基于国内的网络环境,个人不太推荐。一是前者的加密需要每 3 个月进行更新,虽然有自动更新脚本和组件,但心里始终挂着一件事不舒服;二是国内网络运营商基本上封闭了 80 端口,后者直接 NG。

因为众所周知的原因,国内进行端口转发、内网穿透、端口映射甚至是公网 IP 设置都障碍重重,所以很多外文教程并不适用于国内的网络环境。下面我就结合本人的实际用网情况介绍一下简单的外网访问,当然适用背景必须先声明一下。


背景

  • 家庭电信宽带,有公网 IP。公网 IP 的供应情况各地各运营商的操作不一样,我这里是直接去电 10000 号就马上开通了,每周更新一次 IP。固定公网 IP 基本上是商务账户才享有的,因此我们后面需要用到 DDNS 功能。当然,其他地方的小伙伴可能在获取公网 IP 上会比较波折,简单来说流程就是这么走的:去电运营商 —— 换高级客服 —— 换技术客服 —— 投诉 ——工信部 ——客户经理回访。最后的结果有可能就是撕逼成功,获得公网 IP,有时候会通过把你账户转成商务账户实现,最糟糕的就是撕逼失败。这种情况下,要么换运营商,要么只能内网穿透。

  • 80端口封闭,443 端口开放。目前基本上所有运营商都关闭了家庭宽带的 80 端口,443、8080等端口的开放情况各地各运营商操作不尽相同。如果像我这样能有 443 端口就非常完美了,因为 443 端口是 https 的默认端口,映射之后访问不需要在域名后面添加端口号,适合强迫症使用。如果几个端口都封了的话,老实说,除了内网穿透,我也没有办法了。

  • 无内网穿透。特别提出来这点是因为很多人小区宽带被层层捆绑。目前内网穿透没有什么好的免费方法,要么使用『花生壳』,但是给的域名超难记还要设置域名跳转,端口号也有限制,要么使用『frps』,但是你也得有个服务器。

  • 华硕路由器 + 改版梅林固件。选择 koolshare 梅林固件主要是有 『阿里云 DDNS 插件』,方便操作。当然,手动提交其实也是没有问题的。端口转发的话,基本上所有路由器固件都自带,无需担心。

  • HA 加密且无摄像头接入。我个人是绝对不会把摄像头暴露在公网中的,或者说,我至今不考虑购置家用监控摄像机。我相信看了几季的《犯罪心理》,大家也会和我有一样的看法。没有一个摄像头是安全的,而且犯罪成本低,犯罪收益相当大。你可以试想一下你的生活轨迹、家庭情况瞬间暴露在外。当然,室外监控和店铺使用的朋友可以忽略此项。

背景介绍完,就正式开始流程吧。


申请域名

首先登陆『阿里云』进入域名购买界面,在国内购买 cn/com 域名必须进行实名认证。当然不愿意的你也可以选择其他的域名供应商,例如 Godaddy 等,这里选择万网的原因是方便接下去 CA 证书的申请,一条龙服务舒心。这里强烈不推荐在诸如『花生壳』等其他国内域名交易商购买注册域名,各种限制,尽是坑货。


申请证书

阿里云的『云盾证书服务』对个人站提供免费的一年期 CA 证书,一个账户可以申请 5 份免费证书。

免费证书实际上是由『赛门铁克』颁发的,如果你使用万网的域名,只要在签发过程中选择自动认证即可。手动认证的方法也很简单,前往域名解析页添加一段 TXT 记录 即可。

证书签发后,我们就可以下载相关的证书了。如果你是使用 Nginx 或者 Apache 的话照指南下载调用即可,拿不准的话就选择『其他』下载。一般情况下可以下载到如下 3 个文件:

  • xxxx.pem 公钥文件
  • xxxx.key 私钥文件
  • xxxx.chain 证书链文件

前 2 者必须有,后者可有可无。到这里我们的前期准备就基本完成了,接下来是一系列的路由器操作。


DDNS

有了域名之后,我们就要将其解析到家中的公网 IP,才能实现外网访问。如背景中所述,目前大部分的家庭宽带用户只有动态的公网 IP,而我们不可能每次都手动修改解析,因此需要 DDNS 这一动态解析工具。

从插件中心下载安装 ALIDDNS 插件,填入以下设置:

null

app key 和 secret 从 阿里云账户详情里面获取,检查时间可以设置得大一些,毕竟 IP 更换得不是那么勤。

设置完毕后你就可以通过这个域名访问该 IP 下的服务了,如果你在路由器的『系统管理』中打开了『从互联网设置路由器』的话,那么现在你就可以通过访问 域名+端口号 进入路由器设置面板了。


SSL 证书验证

华硕路由器自带的 Ai Cloud 功能默认使用 https 服务,并支持上传证书,可以简便地帮助我们验证证书的有效性。 完成上述 DDNS 服务之后,点击进入 Ai Cloud 个人云面板,便会显示你的个人云访问地址:

null

当然最后的端口号是可以更改的。点击网址进入后,选择左下角的设定 - 证书 -汇入证书,依次上传下载的 3 个文件。之后保存退出,刷新网页,不出意外的话,你的地址左侧将会出现 绿钥匙图标。这说明你的证书是安全有效的。我们可以放心地将其用在 HA 中了。


端口转发

既然要做到外网访问,就必须把内网的服务映射到外网,在这里就是所谓的进行端口转发。我的 HA 使用的是默认端口 8123,我们前往 外部网络 - 端口转发 中添加如下规则:

null

你可以将『通信端口范围』更改成其他外网访问的端口,443 是 https 的默认访问端口。

至此,所有的铺垫工作都完成了,我们正式将 HA 映射到外网中。


HA https

打开 configuration.yaml 文件,配置 http 项:

http:
  api_password: !secret http_password //访问密码
  trusted_networks:     //免密登陆白名单,建议添加内网地址
    - 127.0.0.1
    - ::1
    - 192.168.50.0/24
  base_url: www.cxlwill.pub  //访问地址,填入  DDNS 中设置的网址
  ssl_certificate: /home/homeassistant/.homeassistant/cert.pem  //公钥文件地址,注意放在有读取权限的文件夹
  ssl_key: /home/homeassistant/.homeassistant/cert.key //私钥文件地址,注意放在有读取权限的文件夹

之后重启 HA,你会发现之前的 http://IP:8213 无法登陆了。请将访问地址更改为 https://域名:端口号,如果设置为 443 端口,则无需端口号。

现在你的 HA 已经可以完美进行外网的登陆了,并且在浏览的地址栏左侧你可以看到令人安心的绿钥匙图标。

null


HB、HADashboard 等相关服务

HA 进行全站 https 后,千万记得更改相关服务的访问地址。

HB 中的 config.json

"platforms": [
{
"platform": "HomeAssistant",
"name": "HomeAssistant",
"host": "https://", //修改为最新的域名,注意使用 https
•••
"verify_ssl": false //建议使用 false
}
],

之后重启 HB,无响应的状况应该就消失了。

HADashboard 中的 Appdaemon.yaml

HASS:
  ha_url: https://xxx.com      //这里也要更改为最新的地址
  ha_key:

其他使用 HA API 的服务,例如 IFTTT 中的调用地址也需要进行即使更新,具体就不展开了。

同样,iOS app 中的访问地址也需要一并进行更改。


后续注意事项

HA 全站 Https 之后,所有接入的服务都必须为 https,否则将会出现不安全的警示。请特别留意一些自定义组件的 API 和图标源,官方的组件一般情况下不会出现此类情况。RTSP 等协议不受影响。


作者的话

距离我发布本系列首篇文章至今已经快半年了,系列至今已有 10 篇教程。无独有偶,JailbreakHum在 《少数派季度作者颁奖礼开场发言》所阐述的『内容调整』的观点恰恰与我的初衷十分契合。可以说从一开始,我就在整个系列中尽量保证内容的入门性,也在现实中帮助了很多派友成功搭建系统。

在和派友的互动中我意识到碍于英文水平的局限,很多人无法进一步地享受 Home Assistant 带来的便利。鉴于此,我个人独立制作了一份更接地气的 中文文档 ,目前仍处于雏形阶段,还在快马加鞭中,希望可以帮助到更多的人,欢迎大家阅读+收藏。

良好的体验需要良性的互动维持,为了保持版面的整洁,请大家不要在系列所有文章下方评论区 PO 整段的错误代码。遇到问题请至『维护答疑篇』集中评论。