使用Cloudflare Tunnel实现内网穿透
前置介绍
Cloudflare Tunnel 是将基础设施连接到 Cloudflare 最简单的方法,无论是本地 HTTP 服务器、Kubernetes 集群支持的 Web 服务,还是专用网络网段。
以前是 Argo Tunnel,而现在已经完全免费了。
简单来说,借助 Cloudflare Tunnel,我们就可以在任意一台设备与 Cloudflare 建立一条安全的网络隧道,由此一来,我们就可以很方便地让内网的 HTTP Web、SSH 服务和其他协议可以从外部访问。
为了使用这一功能,需要一个Cloudflare账号和托管在上面的一个域名,本文默认读者已具备一定配置DNS的能力。
客户端使用
我们首先需要下载一个官方的客户端程序:Github: cloudflare/cloudflared,含多平台版本。
登录
首次使用需要执行如下命令进行登录:
cloudflared tunnel login
登录成功后用户的.cloudflared
文件夹下会产生凭据文件,以后就无需再次登录了。
创建 tunnel
如果要创建一个隧道,我们可以执行如下命令(将<tunnel-name>
替换为 tunnel 的名称):
cloudflared tunnel create <tunnel-name>
这将同时生成一个.json
后缀的隧道的鉴权文件,后面会用到。
管理 tunnel
列出已有的 tunnel 信息:
cloudflared tunnel list
删除指定名称的 tunnel:
cloudflared tunnel delete <tunnel-name>
添加 DNS 记录
以下命令可以自动添加一条 DNS 记录,将你的域名指向这个 tunnel 服务,其实本质上和手动添加一条 CNAME
cloudflared tunnel route dns <tunnel-name> <domain>
添加 DNS 记录
以下命令可以自动添加一条 DNS 记录,将你的域名指向这个 tunnel 服务,其实本质上和手动添加一条 CNAME
cloudflared tunnel route dns <tunnel-name> <domain>
编写配置
在同一个隧道中,可以有多个服务,比如说如下的config.yaml
配置文件:
# Tunnel UUID
tunnel: xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx
# 隧道鉴权文件路径
credentials-file: /home/xxx/.cloudflared/xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx.json
protocol: h2mux
ingress:
# hostname要对应添加DNS CNAME记录
- hostname: web.example.com
# service是需要暴露的服务,比如说http 1234端口
service: http://127.0.0.1:1234
- hostname: ssh.example.com
# ssh服务22端口
service: tcp://localhost:22
# 最后一定要添加一个默认service否则报错,即之前的规则都没匹配上,比如说默认404页面
- sevice: http_status:404
配置文件保存后可以验证一下格式是否有误:
cloudflared tunnel ingress validate
隧道启动
cloudflared tunnel --config ~/.cloudflared/config.yml run <tunnel-uuid>
从输出信息里可以看到连接上的是 Cloudflare 就近选择的节点。
不出意外的话,访问我们配置的域名就可以正常使用了。
默认使用的是 quic 协议,如果不想要可以加上命令行参数--protocol http2
。
值得注意的是,如果要使用 ssh 服务的话,是不能直接访问的。比如说我在 Linux 系统上按照上述操作配置了一个含 ssh 服务的隧道,想要在一台 Windows 设备上连接,那么就需要在 Windows 上也下载一个 cloudflared 客户端,将服务端的服务映射到本机的端口,例如以下命令就将 ssh 服务映射到了本机的 2222 端口,那么我们连接 ssh 的时候就可以直接用 localhost:2222 作为地址连接。
cloudflared.exe access ssh --hostname ssh.example.com --url localhost:2222
注册服务
为了防止潜在的断连问题,保持隧道服务稳定运行,我们可以将其注册为系统服务。
sudo cloudflared service install
执行上述命令后可以注册一个名为 cloudflared 的 Linux 系统服务,可以用 systemctl 管理。
临时隧道
如果不想要用自己的域名,只是临时搭建一个隧道,那么可以直接:
cloudflared tunnel --url localhost:1234
这将创建一个 trycloudflare.com 域名的临时隧道,以便于短期测试。