先说结论:使用 Cloudflare Tunnel 实现内网穿透是目前花费最低(一年 5 元人民币)且网速最好、最安全也是最简单的。
前期准备 #
- 一台群晖或者任何你想要内网穿透的 Windows、Mac、Linux
- 一个 Cloudflare 的账号,直接注册即可,要添加支付方式,可以是信用卡
- 一个域名,如果你手头上有闲置的就直接用,如果没有就买一个 6 位纯数字的 xyz 域名,我直接在 Cloudflare 里买的,一年 0.85$
网络架构 #
假设我现在要访问群晖的网页(Synology DSM),我的操作流程是这样的:
浏览器访问 你的域名
↓
Cloudflare Access 页面
↓
输入邮箱
↓
邮箱收到验证码(只有提前设置好权限的邮箱才会收到验证码)
↓
输入验证码
↓
进入 DSM
可以看到,整个流程中,我并不需要在当前设备安装任何网络工具,也不需要做什么设置,非常简单
此时的网络架构是这样的:
浏览器
↓
https://nas.example.com(假设这是你访问的域名)
↓
Cloudflare Edge
↓
Tunnel
↓
cloudflared
↓
https://192.168.1.100:5001(假设这是你家里群晖的网页地址)
↓
DSM
得益于 Cloudflare 全球的网络基础设施,我们实际访问的速度还是很快的,不愧为赛博活菩萨
搭建 Tunnel #
在 https://dash.cloudflare.com/ 中搜索 Tunnels 快速到达
点击 创建隧道 -> 输入隧道名称->点击创建 -> 选择对应的平台,复制下方的命令行
我使用的是 Docker,其他平台安装也是相同的道理,然后 SSH 进入群晖的后台,粘贴刚刚复制的命令行就可,过一会就可以看到成功链接
点击刚刚链接的隧道,然后点击Add route->选择Published application
Subdomain:子域名,随意填写,例如`dsm`
Domain:选择你的主域名,这里我直接用 xyz 域名
Service URL:填写你群晖的端口,假设 DSM 端口为 5001,就写:https://localhost:5001
点击添加即可,添加后,访问dsm.域名正常情况下会显示Bad gateway错误,Error code 502。
这是因为 群晖默认 DSM 证书是自签名证书,所以 cloudflared 默认会 验证失败,需要特别处理。但是此时 Tunnel 是已经创建成功了。
添加访问规则 #
解决 502 错误 #
解决这个错误的方式有很多,这里只讲最简单的一种: 进入 Cloudflare Zero Trust -> 网络 -> 连接器 -> 编辑 -> 已发布应用程序路由 -> 编辑 -> 其他应用程序设置 -> TLS -> 无 TLS 验证开启 -> 保存
此时再次访问dsm.域名,即可正常访问群晖 DSM 页面
防止暴露在公网中 #
经过上面的配置,我们已经可以正常通过浏览器随时随地访问我们家里的群晖了,但是这样有个安全性的问题就是,内网设备一直处于暴露在公网上的状态,我们可以通过添加Cloudflare Access来增加安全性
在 Cloudflare Zero Trust -> 访问控制 -> 策略 -> 可重用策略 -> 添加策略 -> 策略名称叫做:Allow Login,操作选择:Allow,添加允许登录的邮箱地址
然后再次添加策略 -> 策略名称叫做:Block Other,操作选择 Block,选择器为 Everyone
现在我们已经创建好了两条策略,只有你允许的邮箱才可以登录,现在我们将这两条策略应用到我们的 Tunnel 中即可。
点击 Cloudflare Zero Trust -> 访问控制 -> 应用程序 -> 添加应用程序 -> 选择自托管 -> 在基本信息中添加公共主机名,子域为 Tunnel 使用的子域名dsm,域为 Tunnel 使用的域名 -> Access 策略选择现有策略,需要注意的是,Allow Login 在前,Block Other 在后 -> 保存
现在,当你访问域名时,就被Cloudflare Access拦住,只有允许的邮箱才可以进入啦