Skip to content

使用 Cloudflare Tunnel 进行内网穿透

Published: at 00:00

说明

记得上学的时候使用过一段时间的内网穿透,当时好像用的是叫花生壳的软件来的,主要是因为要让其他地方的机器访问到我在家里那台机器上部署的网站之类的。目前仍然有很多这样场景,比如我要在家里访问到公司内网的东西,比如我要用域名访问到内网某台服务器上的系统。本文举的例子是使用一个域名从外部访问到我本地部署的服务。

前期准备

  1. 注册一个 Cloudflare 账号
  2. 注册个人域名
  3. 新增域名网站,并将域名添加到 Cloudflare 的 DNS 服务
  4. 开通 Cloudflare Zero Trust 服务,选择免费的即可,详细步骤也可查看:官方文档

安装

$ brew install cloudflared

使用

登录

$ cloudflared tunnel login

如果登录成功,将在用户家目录的 .cloudflared 目录下生成 cert.pem 文件

创建Tunnel

# 创建
$ cloudflared tunnel create <tunnel-name>

# 列出所有的 tunnel
$ cloudflared tunnel list

# 删除指定的 tunnel
$ cloudflared tunnel delete <tunnel-name>

# 这里假设创建个 tunnel-test
$ cloudflared tunnel create tunnel-test

配置 DNS 记录

# 配置 DNS
$ cloudflared tunnel route dns <tunnel-name> <domain>

# 为 tunnel-test 配置域名
$ cloudflared tunnel route dns tunnel-test a.yhz.me

编写配置文件

配置文件

vim ~/.cloudflared/config.yml 编写 config.yml 配置文件,具体可参考官方文档

tunnel: <Tunnel-UUID>
credentials-file: /root/.cloudflared/<Tunnel-UUID>.json

ingress:
  - hostname: a.yhz.me
    service: http://localhost:5173
  - service: http_status:404

<Tunnel-UUID>: 为 tunnel 的 id,执行cloudflared tunnel list可查看到。 credentials-file: 这里要使用绝对路径,相对路径可能会出现找不到相关 json 文件的错误。

验证配置文件
$ cloudflared tunnel ingress validate

测试运行

$ cloudflared tunnel --config ~/.cloudflared/config.yml run <Tunnel-UUID>

# 由于默认走的是 quic 协议,quic 协议是建立在 UDP 协议之上,目前国内运营商对 UDP 协议支持并不友好,会阻断 UDP 协议的连接,因此这里要指定使用 http 协议。
# --protocol http2 强制指定协议为`http2`
# --protocol auto 开启自动切换,默认依然是`quic`

$ cloudflared tunnel --no-autoupdate --protocol http2 --config ~/.cloudflared/config.yml run <Tunnel-UUID>

查看信息

$ cloudflared tunnel info <Tunnel-Name>

总结

完成实施这个技术方案,就可以通过 a.yhz.me 从外部网络访问到我本地的 http://localhost:5173 对应的服务,达到内网穿透的效果。当然,除了 web 服务,其它的服务也是可以进行穿透的,具体可见官方说明。