使用 Cloudflare Tunnels 进行内网穿透

前言

Cloudflare Tunnel 是一款隧道软件,可以快速安全地加密应用程序到任何类型基础设施的流量,让您能够隐藏你的web 服务器IP 地址,阻止直接攻击,从而专注于提供出色的应用程序。

相比于 frp 等做内网穿透,Cloudflare Tunnels 的优势是不需要一台额外的公网服务器转发,并且可以享受到 Cloudflare CDN 带来的便利。

使用 frp 做内网穿透的流程如下:

flowchart LR
  server[Frp Server]
  clients[Frp Clients]

User -->|http/https| server -->|http/https| clients

使用 Cloudflare Tunnels 做内网穿透的流程如下:

flowchart LR
  tunnels[Cloudflare CDN]
  clients[Original Clients]

User -->|http/https| tunnels -->|Cloudflare Tunnels|clients

前置条件

需要有一个由 Cloudflare 管理的域名

配置

  1. 安装 cloudflared

    debian:

    apt install cloudflared

    或者下载最新版

    wget -q https://github.com/cloudflare/cloudflared/releases/latest/download/cloudflared-linux-amd64.deb -O cloudflared.deb && dpkg -i cloudflared.deb && rm cloudflared.deb
  2. 登录 cloudflared

    cloudflared tunnel login

    随后会生成一个 ~/.cloudflared/cert.pem 文件用于后续授权

  3. 创建一个隧道 tunnel

    cloudflared tunnel create <名字>

    随后会在 ~/.cloudflared/ 目录下出现一个 json 文件 [Tunnel-UUID].json,里面保存着运行这条隧道所需要的授权信息。

  4. 创建一个配置文件,~/.cloudflared/tunnels/名字.yaml,并添加

    # 反代的源站地址
    url: http://localhost:8080
    tunnel: <Tunnel-UUID>
    credentials-file: /root/.cloudflared/<Tunnel-UUID>.json

    如果在上一步没有保存 UUID 信息,可以通过 cloudflared tunnel info 获取

  5. 配置路由

    cloudflared tunnel route dns [名字或者 Tunnel-UUID] [想要绑定到的域名或其二级域名]
  6. 启动 cloudflared

    cloudflared tunnel --config ~/.cloudflared/tunnels/名字.yaml run

之后就可以通过在第 5 步 设置的域名进行访问

范例

例如,创建一条隧道从公网访问家里的 clash dashboard(地址为 192.168.1.1:9090),设置隧道名字为 clash,并将其绑定到 clash.example.com:

  1. cloudflared tunnel login 授权

  2. cloudflared tunnel create clash,假设输出 Tunnel-UUID 为 c91c37a3-3efd-47fb-af0d-e5676ac122b9

  3. 将下面配置添加到 ~/.cloudflared/tunnels/clash.yaml

    url: http://192.168.1.1:9090
    tunnel: c91c37a3-3efd-47fb-af0d-e5676ac122b9
    credentials-file: /root/.cloudflared/c91c37a3-3efd-47fb-af0d-e5676ac122b9.json
  4. cloudflared tunnel route dns clash clash.example.com 创建路由

  5. cloudflared tunnel --config ~/.cloudflared/tunnels/clash.yaml run 启动隧道

此时,访问 clash.example.com 等同于内网访问 192.168.1.1:9090

配置 systemd service 自动启动

  1. /etc/systemd/system 目录下创建 service 配置文件 EXAMPLE.service

    [Unit]
    Description=Cloudflare Tunnel
    After=network.target
    StartLimitIntervalSec=0
    
    [Service]
    Type=simple
    Restart=always
    RestartSec=1
    User=root
    ExecStart=cloudflared tunnel --config /root/.cloudflared/tunnels/名字.yaml run
    
    [Install]
    WantedBy=multi-user.target
  2. 启动服务

    systemctl enable EXAMPLE
    systemctl start EXAMPLE