概述

将本地网络服务暴露到公网是一个常见需求。比如,你可能希望访问 qBittorrent 的管理界面,以便随时添加新的下载任务。为实现这一目标,你可以使用 Cloudflare Tunnel,这是一种几乎免费的安全解决方案(但是还是需要买域名)!本文将提供设置 Cloudflare Tunnel 的手把手教程。

前置条件

  1. 已注册一个域名(例如 nicklin.work)。
  2. 拥有一个 Cloudflare 账户。
  3. 域名已通过 Cloudflare 管理。
  4. 本地服务器已安装 docker

指南

  1. 创建一个目录来存储 cloudflared 所需的所有文件。cloudflared 是一个用于管理部分 Cloudflare 资源的命令行工具。我们将使用它来创建和设置隧道。将 /somewhere/to/place/your/files 替换为你本地服务器上的实际路径。

    bash
    mkdir -p /somewhere/to/place/your/files
    chmod 777 /somewhere/to/place/your/files
  2. 接下来,使用 Docker 容器运行 cloudflared。小技巧:将 cloudflared 设置为 Docker 命令的别名。这非常方便,因为我们会多次使用该命令。我使用的是撰写本文时的最新版本。你可以在 这里 找到你需要的镜像。

    bash
    docker pull cloudflare/cloudflared:1759-f9c2bd51ae24
    alias cloudflared="docker run --rm -it -v /somewhere/to/place/your/files:/home/nonroot/.cloudflared cloudflare/cloudflared:1759-f9c2bd51ae24"
  3. 登录到你的 Cloudflare 账户:

    bash
    cloudflared login

    你的终端可能会显示如下内容: cloudflared-login 在浏览器中打开链接并登录。之后,你应该会在 cloudflared 文件夹中看到一个 cert.pem 文件。

  4. 使用以下命令创建一个隧道:

    bash
    cloudflared tunnel create YourTunnelName

    你应该会看到如下结果。复制 ID:

    Created tunnel YourTunnelName with id some-random-id-xxxxxxxxxxxx-xxxxx

  5. 要从公网访问你的本地网络,你需要一个域名,并将其配置为解析到你的隧道。例如,使用 tunnel.test.com。运行以下命令,让 Cloudflare 将域名解析到特定隧道。确保你已拥有 test.com 的管理权限!

    bash
    cloudflared tunnel route dns YourTunnelName tunnel.test.com

    此命令会创建一个 CNAME 记录,将 tunnel.test.com 指向隧道的域名,通常是:some-random-id-xxxxxxxxxxxx-xxxxx.cfargotunnel.com

  6. 现在隧道和 DNS 已设置完成,配置隧道。创建一个 config.yml 文件到你的 cloudflared 文件夹,并复制以下内容:

    yaml
    tunnel: some-random-id-xxxxxxxxxxxx-xxxxx
    credentials-file: ~/.cloudflared/some-random-id-xxxxxxxxxxxx-xxxxx.json
    
    ingress:
    - hostname: tunnel.test.com
      service: http://192.168.1.100:8080
    - service: http_status:404

    此配置告诉 Cloudflare,当访问 tunnel.test.com 时,将请求重定向到 http://192.168.1.100:8080。确保你在最后一行包含 http_status:404,这是必须的。

  7. 通过运行以下命令测试你的隧道。访问 tunnel.test.com 以验证你是否可以访问本地 Web 服务:

    bash
    cloudflared tunnel run YourTunnelName

    cloudflared-tunnel-running

  8. 最后,为了更方便地管理隧道,创建一个 Docker Compose 文件。以下是一个示例:

    yaml
    services:
      cloudflared:
        container_name: cloudflare-tunnel
        image: cloudflare/cloudflared:1759-f9c2bd51ae24
        restart: unless-stopped
        command: tunnel --no-autoupdate run
        volumes:
          - /host_data/cloudflared:/home/nonroot/.cloudflared
        networks:
          - web

    如果你希望暴露运行在容器中的 Web 服务,确保你的隧道和容器处于同一网络。

参考

  1. Cloudflare 文档:创建本地管理的隧道
  2. Cloudflare 文档:Cloudflared 配置文件