我继续维护我的Home Assistant。本周,我用Cloudflare Tunnel换成了新的配置。这变化挺不错的。
刚开始的设置我使用 Home Assistant,从一开始就需要外部访问。
我分两步做到了这一点。
- 我为
frankel.ch
创建了一个子域,指向了路由器的公网IP。 - 在我的路由器上,我开放了一个专用端口,再将请求转发至我的HA。
(注:此处“HA”根据上下文可考虑明确为“家庭自动化”或“家庭助手”等,以确保术语的一致性。)
接下来的动作是通过SSL证书来保障连接的安全。我一开始就想实现mTLS,但由于iPhone HA应用不支持mTLS,我没能做到。而与我的服务器进行加密通信是必不可少的。
好消息是,SSL证书不再是奢侈品的时代已经过去了。Let's Encrypt免费提供SSL证。
Let's Encrypt 通过基于 ACME 协议的自动化 API 来颁发证书。
为了与 Let's Encrypt API 进行交互并获取证书,你需要一个叫做 "ACME 客户端" 的软件。获取证书的过程不会在这个网站上进行,这个网站仅提供相关信息。
-- 入门指南
HA 提供了一个丰富的附加组件生态系统:其中一个 集成了 Let's Encrypt。该附加组件运行良好,但它的方法较为特殊:HA 的附加组件通常会持续运行,而这个则不同。你需要通过启动该附加组件来生成证书。
Let's Encrypt 对证书的有效期有自己的立场。有效期是90天,不允许有任何例外。此外,Let's Encrypt 官方网站建议每60天轮换一次证书。
当安装的证书过期时,会非常不方便——别问我怎么知道。直到今年,Let's Encrypt 以前会在证书到期前几天发送提醒邮件,但今年他们不这么做了。为了避免这种情况再次发生,我设置了一个 HA 自动化来帮我启动这个附加组件。有趣的是,当我用 CloudFlare Tunnel 实现自动化时,我发现我之前的设置有误!
虽然这个设置在大多数时候都挺管用,但还是有两件事让我有点儿不爽。
- 我已经在我的路由器的 HTTPS 端口上为另一个域名使用了。我的路由器在同一端口上无法同时管理两个子域名,因此我不得不开启另一个端口。记住一个端口号比记住一个域名要难得多。
- 自动化是一个额外的组成部分,如前所述,它可能会出错。我更倾向于将自动化集中在家庭方面,而不是底层基础设施上。
我在一天早晨浏览/r/homeassistant时无意中发现了Cloudflare Tunnel(Cloudflare隧道),并意识到它能解决我的问题。随后,我想到几个令人信服的理由:
- 我已经是开心的Cloudflare用户了
- 使用Cloudflare Tunnel,你不必在路由器上开启端口
- 这个HA插件用起来非常简单
- 我从未试过Cloudflare Tunnel,它对我来说是个新鲜玩意儿,很想试试看!
Cloudflare Tunnel 为您的资源提供了一种安全的连接方式,让您的资源可以安全地连接到 Cloudflare,即使没有公共路由 IP 地址也无妨。使用 Tunnel,而是由一个轻量级的
cloudflared
守护程序在您的基础设施中创建出站连接到 Cloudflare 的全球网络。Cloudflare Tunnel 可以将 HTTP 网络服务器、SSH 服务器、远程桌面和其他协议安全地连接到 Cloudflare。这样,您的源可以将流量通过 Cloudflare 传递,从而避免被绕过 Cloudflare 的攻击。请参阅我们关于将 Cloudflare Tunnel 集成到现有基础设施中的参考架构以获取更多信息现有基础设施。
cloudflared
建立了您资源与 Cloudflare 全球网络之间的出站连接(隧道)。隧道是持久的连接,将流量路由到 DNS 记录。在同一个隧道中,您可以同时运行任意数量的cloudflared
进程(即连接器)。这些进程将连接到 Cloudflare 并将流量发送至最近的 Cloudflare 数据中心。
社区中有一个附加组件用于管理Cloudflare Tunnel与HA的集成,该组件为Cloudflared。添加到您的HA中后,您可以配置它,有以下两种方式:
- 最简单的方式:你设置子域名,然后让助理搞定剩下的。它会生成一个链接带你进入 Cloudflare,然后你完成身份验证后,助理会自动搞定一切,包括下载和运行代理。
- 稍微复杂一点的方式:你直接在 Cloudflare 上创建通道,获取 token,并手动配置插件程序。
我选择了前者,它按预期工作了。然而,我犯了个大错:我设置的子域名与当前的一样,它在没有警告的情况下覆盖了现有设置。我吸取了教训——一定要用新的子域名。
下一步是在 HA 中配置代理,如果你之前没有做过这一步。默认情况下,HA 会丢弃来自代理的请求,这意味着。为了让 cloudflared
(这个进程,而不是 Cloudflare 本身)代理请求,我们需要明确允许 cloudflared
,并指定允许的 IP 地址。
http:
server_port: 443 #1 服务器端口为443,这是标准的HTTPS端口。SSL证书和密钥分别指向全链证书文件和私钥文件。
ssl_certificate: /ssl/fullchain.pem #1
ssl_key: /ssl/privkey.pem #1
use_x_forwarded_for: true
trusted_proxies:
- 172.30.33.0/24 #2 这是被信任的代理的IP地址段。
进入全屏模式,退出全屏
- 旧的 Let's Encrypt 插件配置
- 允许本地
cloudflared
进程发出的请求
到这一步,配置已经可以正常工作了。向新域名发出的请求将通过Cloudflare Tunnel传递到HA。我可以在这里结束,不过细心的读者可能已经发现,我只完成了部分工作:Let's Encrypt插件还没有移除。在隧道内部使用SSL是没有意义的。
卸载 Let's Encrypt (免费证书服务) 扩展我们的目标是移除 Let's Encrypt 插件(或附件),并清理与 SSL 相关的配置。简单来说,后者不能被移除,因为这是它的设置方式。
我建议你先关闭远程访问,然后去掉SSL设置,然后再装Cloudflare的。我没有这么做,因为我还想留个后路,以防万一出错。如果你对我的经历感兴趣,不妨接着看。
先启用SSH!:如果你开始修改HTTP访问设置,有很大可能你会被锁在UI外面。一旦失去访问权限,你唯一的选择就是恢复出厂设置。在做任何重要设置更改之前,确保你有备用方案。这可以是通过本地网络访问UI界面,但使用SSH更保险。Home Assistant提供了一个SSH插件。在做任何事情之前,先安装这个插件。
The Cloudflared 插件在启动时利用现有的环境来创建其配置,比如 SSL 和端口。并且它在远程 Cloudflare Tunnel 上设置了同样的参数。你不能更改任何一个。在 Cloudflare 方面,它被标记为本地管理。在 HA 方面,你无法访问这些配置参数,至少是那些与隧道相关的配置参数。
我将配置从本地迁移到了Cloudflare远程控制台。请记住,一旦切换到远程管理,就无法再切换回本地配置。转到 Public Hostname 选项卡,找到 homeassistant
隧道的那一行,然后点击 Edit。下面是配置:
homeassistant
域是 HA 内部的:它是固定的。因为 cloudflared
在 HA 上运行,你必须保持它原样。另外,默认的 HA 端口是 8123。
要使用新配置,请转到隧道的_概览_部分。在_安装并运行连接器_部分,找到命令行语句,复制并粘贴install
后面的token值。将其粘贴到插件中的Cloudflare Tunnel Token字段。文档说明,当该字段有值时,插件会忽略所有其他配置参数。
你现在可以将 server_port 以及与 SSL 相关的参数从上面的配置中移除。然后重启 HA。
此时,你应该能够通过隧道访问HA的子域名。现在可以移除Let's Encrypt证书插件、旧的SSH配置文件以及续签脚本了。
结论在这篇文章里,我们安装了 Cloudflare Tunnel 以允许您安全访问 Home Assistant 的 UI。
如果您是在全新的 Home Assistant 实例上安装它,过程很简单。
如果您替换现有的设置,例如 Let's Encrypt 的 SSL,过程会稍微复杂些,但并非不可能完成。
在这两种情况下,我们不仅可以从 Cloudflare 提供的 SSL 证书中受益,还可以从其证书自动更新的功能中受益。
更多内容:
——
_原发表于A Java Geek,2025年5月11日发布*
注:HA:Home Assistant
共同學習,寫下你的評論
評論加載中...
作者其他優(yōu)質(zhì)文章