利用Cloudflare Tunnel实现NAS外网访问

2024 / 6 / 5

什么是Cloudflare Tunnel?

图片来源:https://blog.cloudflare.com/zh-cn/post-quantum-tunnel-zh-cn

Cloudflare Tunnel的原理如图,在需要被访问的源服务器(Origin Server)上运行cloudflared服务,该服务与Cloudflare的边缘节点保持长连接,当外部用户访问对应域名时,请求到达Cloudflare边缘节点,通过cloudflared访问到源服务器对应的端口上。

NAS使用Cloudflare Tunnel的好处

  • 不需要家庭宽带具有公网IP,且能曲线救国让移动宽带用上IPV4访问

  • 不需要路由器开启端口,更安全不会被运营商扫描到web服务导致宽带封停

  • 目前通过Tunnel访问家庭内网相对来说速度还能接受

如何启用Cloudflare Tunnel?

  • 将域名解析到Cloudflare

    该步骤网络上教程较多,新注册Cloudflare也会有添加域名的引导页,按步骤将域名购买处服务商NS(nameserver)修改为Cloudflare提供的即可。

    注意:预先添加一条A类型(IPV4)或者AAAA类型(IPV6)的根域名解析,例如: 1.2.3.4 <-> yourdomain.com

  • 在个人中心,左侧选择进入Zerotrust页面

  • 在Network菜单下找到Tunnel

  • 点击Create Tunnel创建一个新的隧道

  • 这里我们选择cloudflared方式创建,选next

  • 给隧道起一个名字

  • 保存后会出现安装部署命令,这里选择docker部署的方式

    这里命令复制出来,把后面一长串token(xxxxxxxxxxxx)单独复制下来:

    docker run cloudflare/cloudflared:latest tunnel --no-autoupdate run --token xxxxxxxxxxx
  • 登陆群晖NAS后台,进入Container Manager,搜索下载cloudflared的映像(下图中第一个)

  • 使用该镜像运行容器,勾选“自动重新启动”

  • 设置网络类型为Host,命令填入:tunnel --no-autoupdate run --token <从CF创建Tunnel页面复制的token>

    之后点击下一步启动容器即可。

  • 回到Cloudflare界面显示Status:Healthy即为连接成功

  • 随后进行Public Hostname公共域名的创建,这个公共域名也就是你之后需要用来访问内网NAS等服务所使用的域名地址:

    subdomain写你所需要的前缀,domain选择你的根域名,type根据你的需要选择,这里群晖网页选择了http类型,url填写你内网所需要访问的地址,因为我们部署在群晖上,直接输入localhost:5000即可访问到NAS的管理后台。

  • 保存以上设置后即可用 test.yourdomain.com 访问你的NAS了!

  • 如果出现证书/SSL问题:

    • 检查域名的SSL设置是否选择了“完全”

    • 群晖上的证书设置成Cloudflare Origin CA:

      在SSL/TLS目录下“源服务器”一栏点击“创建证书”,将证书内容保存为pem文件,密钥保存为key文件,导入到群晖内设为默认证书即可。

One more thing

如果在国内网络环境觉得使用Tunnel访问速度不理想,可以考虑以下几种方式改善:

  • 优化阶段一:使用CloudflareST,测试出最合适自己的CF节点,将其修改到本地电脑Hosts中加速访问:

    https://github.com/XIU2/CloudflareSpeedTest

  • 优化阶段二:更进一步,将优选的CF节点IP使用另一个域名做DNS解析,这样可以方便你的朋友未做任何优化也能更快访问

  • 优化阶段三:在优化二的基础上,使用支持国内外分流解析的DNS服务商(如:DNSPod),把国内访问CNAME解析到一个使用了CF优化的网站(如: csgo.com / visa.com),国外CNAME解析到 1.0.0.5 ,并在CF配置自定义回源域名,利用现成的网站优化国内外线路。

    原理是通过另一个域名CNAME访问这些CF优化过的网站时,流量到达CF的边缘节点,回源找到你的源服务器进行访问,注意到这里Cloudflare Tunnel不支持把另一个非CF解析的域名添加进Public Hostname内,可以通过构造curl命令的方式强行添加进去,具体方法:CloudFlare Saas 回源到 tunnel 的办法