我对 Cloudflare 没有什么了解,这是既用 Cloudflare Worker 搭了图床反代之后时隔多年再次跟 Cloudflare 打交道。在看完 ChatGPT 写的教程后我还以为很简单,但是在最后一步被卡了几乎一整天。在经历了无数次失败即将放弃之际,我根据 Perplexity AI 的建议去试竟然成功了。
服务器端 #
- 注册 Cloudflare 账户
- 将域名导入 Cloudflare
- 在服务器端安装
cloudflared - 为
cloudflared登录 Cloudflare 账号
cloudflared login
- 使用
cloudflared创建 Tunnel
cloudflared tunnel creat <tunnel_name>
(创建 Cloudflare Tunnel 的方式有两种,一种是在网页上通过 Cloudflare Dashboard/API 部署,另一种是在本地部署。使用前者部署的 Tunnel 的配置文件是由 Cloudflare 管理的,用户无法直接修改,而且会默认开启 WARP,本地部署的 Tunnel 默认不开启 WARP。我最初以为用命令行关不掉的 WARP 是导致连接不成功的原因,加上 WARP 客户端的体积比较大让人忘之却步,我就删掉了网页部署的 Tunnel,换成本地手动部署)
cloudflared tunnel 会自动生成一个 <tunnel_id>
在 ~/.cloudflared 文件夹中创建 config.json 配置文件
tunnel: <tunnel_id>
credentials-file: /Users/<username>/.cloudflared/<tunnel_id>.json
ingress:
- hostname: <subdomain.yourdomain.com>
service: tcp://localhost:5900
- service: http_status:404
启动 Cloudflare Tunnel
cloudflared tunnel --config /Users/<username>/.cloudflared/config.yml <tunnel_name>
在 Cloudflare Zero Trust > Network > Tunnel 中检查 Tunnel 的状态是否健康。
前往 Cloudflare Dashboard,选中自己的域名,前往 DNS 中为用于 Cloudflare Tunnel 的子域名添加 CNAME 记录—<tunnel_id.cfargotunnel.com>
使用 dig 或 nslookup 检查用于 Cloudflare Tunnel 的子域名的 DNS 是否配置正确。
dig <subdomain.yourdomain.com>
dig <subdomain.yourdomain.com> @1.1.1.1
在没有为子域名开启代理的情况下,dig 会返回指向 Cloudflare Tunnel 的 CNAME 记录 <tunnel_id.cfargotunnel.com>。
如果之后开启了代理,dig 返回的结果是多个指向 Cloudflare IP 的 A 记录。
客户端 #
- 安装
cloudflared - 登录相同的 Cloudflare 账号
cloudflare login
cloudflared access tcp --hostname <subdomain.yourdomain.com> --url tcp://localhost:5900
前往 VNC 客户端,例外 macOS 自带的 Screen Sharing,输入 localhost:5900。建立连接后输入服务器端设置好的用户名和密码可以使用远程桌面了。(我之前就在这一步输入了 hostname (<subdomain.yourdomain.com>),结果死活连不上)