基于 Cloudflare Zero Trust 实现 self-hosted 服务内网穿透与安全防护

date
Feb 15, 2023
slug
secure-homelab-with-cloudflare-zero-trust
status
Published
tags
HomeLab
summary
使用 Cloudflare Zero Trust 提供的 Cloudflare Tunnel 服务实现内网穿透将服务暴露到公网上并绑定对应的域名,并使用 Cloudflare Access 服务限制服务的访问,提高安全性。
type
Post

简介

相信有不少朋友和我一样,买了群晖 NAS,但是一直没有开公网访问。一方面是因为公网 IP 不好申请,另一方面是安全原因,担心暴露到公网之后被人爆破。公网 IP 的问题尚好解决,大多一通电话的事儿,实在不行市面上也有不少内网穿透的方案可供选择。安全问题就比较棘手了,一旦暴露到公网,被人扫端口几乎是不可能避免的。通过使用强密码和开启两步验证等手段可以提高群晖自身的安全性,但对于通过 Docker 等运行的自定义服务(如 Jellyfin、Plex等)就束手无策了。这个时候就轮到 Cloudflare 家的 Zero Trust 服务登场了。
 
Cloudflare 是一家知名的 CDN 服务商,很多同学应该或多或少都听说过。除了 CDN 以为,Cloudflare 还提供其他网络服务,比如我们即将用到的 Zero Trust。
 
更具体一点,我们将使用包含在 Zero Trust Platform 内的 Cloudflare Tunnel 服务实现内网穿透将服务暴露到公网上并绑定对应的域名,使用 Cloudflare Access 服务限制服务的访问,提高安全性。刚好可以完美解决上面提到的两个问题。更棒的是,Cloudflare 提供了非常慷慨的免费额度,个人使用绰绰有余。
 

配置内网穿透

在开始之前,你需要先准备一个 Cloudflare 账号和一个域名,并按照操作指引将你的域名绑定到 Cloudflare。
 
一切准备好后,点击 Dashboard 侧栏的 Zero Trust 或者访问 https://one.dash.cloudflare.com/ 进入配置页面。点击 Create tunnel,跟随指引创建即可。
值得一提的是,安装 Connector 的机器只要能够访问到需要暴露的服务即可,不一定要安装在群晖上,但是需要尽量保证安装 Connector 的机器能够 24H 运行,例如同一个局域网下的另一台的小主机。
notion image
notion image
至此,内网穿透就设置好了。现在可以尝试通过设定的域名来访问对应的服务了。
 

配置安全策略

现在我们来解决第二个问题:安全问题。
 
还是这个 Dashboard,选择 Access → Applications→Create Application。类型选择 Self-hosted。下一步如下图填写即可。
notion image
 
填写完成后,下一步添加安全策略。通过添加安全策略,我们可以控制哪些人可以访问我们的服务。
 
规则可以分为主要三种类型:
  • Include:满足其中任一条件即可访问,一般选择这个。
  • Required:满足其中所有条件才能访问。
  • Exclude:满足其中任一条件就不能访问。
 
在下图中,我们选择 Include 类型规则,使用 Email 匹配,如果登陆邮箱为 [email protected] 则可以访问,否则不能。通过这个策略,我们就可以把服务的访问权限只给到自己。大家可以根据自己的需求自由设定适合自己的安全策略。
notion image
完成后点击下一步,可以进一步设定其他配置。如果不太清楚这些设置什么意思的话,直接跳过就好。
推荐在 Cookie Settings 里面讲 Same Site Attribute 设为 Lax 或者 Strict,开启 Http Only 来进一步提高安全性。
 
至此,服务的安全策略也设置好了。已经完成了 90%,剩下还需要为我们之前设定的 Tunnel 绑定策略。
 
回到我们刚刚设置的 Tunnel → Public Hostname → Configure. 点击 Additional application settings 展开菜单,在 Access 这一栏选中我们刚刚添加的 Application 并确认 Protect with Access 处于 Enabled 状态。
 
notion image
 
此时访问我们设置的服务域名,可以看到 Cloudflare 提供的登录页面,默认支持邮箱验证码登录,可以尝试用之前设好的邮箱登录试试。大功告成!🎉🎉🎉
notion image
 

进阶设置

 
支持更多登录方式
除了默认的邮箱验证码登录(OneLogin)以外,Cloudflare Access 还支持集成其它第三方的 Identity Provider 例如 Github 登录、Google 登录等等。详情可以前往 Zero Trust → Settings → Authentication → Add login method 查看。
 
一个 Tunnel 配置多个服务
同一个 Tunnel 可以支持配置多个服务,只需要在 Tunnel → Public Hostname 里面配置多个 Hostname 即可。此外,因为 Access Policy 是与域名绑定的,所以需要对应去 Application 页面创建一个对应域名的 Application。
 

总结

Cloudflare Zero Trust 服务解决了暴露私有服务到公网过程中的两个关键问题:内网穿透(Cloudflare Tunnel)和服务安全(Cloudflare Access)。自此,咱们就可以在外舒服地访问家中 NAS / HomeLab 上的服务,还不用担心安全问题啦!

© Hopsken 2021 - 2024