我继续维护我的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
共同學(xué)習(xí),寫下你的評論
評論加載中...
作者其他優(yōu)質(zhì)文章

