使用Cloudflare Tunnel实现内网穿透 | Hlwdy's blog
使用Cloudflare Tunnel实现内网穿透
发表于 2025-06-22 共 1236 字
分类于 记录

使用Cloudflare Tunnel实现内网穿透

前置介绍

Cloudflare Tunnel 是将基础设施连接到 Cloudflare 最简单的方法,无论是本地 HTTP 服务器、Kubernetes 集群支持的 Web 服务,还是专用网络网段。

以前是 Argo Tunnel,而现在已经完全免费了。

cloudflare 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 .cfargotunnel.com 记录是一样的,一定要开启 CF 代理模式,毕竟流量是经过 Cloudflare 中转的。

cloudflared tunnel route dns <tunnel-name> <domain>

添加 DNS 记录

以下命令可以自动添加一条 DNS 记录,将你的域名指向这个 tunnel 服务,其实本质上和手动添加一条 CNAME .cfargotunnel.com 记录是一样的,一定要开启 CF 代理模式,毕竟流量是经过 Cloudflare 中转的。

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 域名的临时隧道,以便于短期测试。

筛选文章
类别选择 (分类/标签)
全屏 关闭