Cloudflare tunnel 内网穿透

Cloudflare 实现内网穿透主要通过其 Cloudflare Tunnel(也叫 Argo Tunnel)功能来实现。它允许你在不暴露公共 IP 的情况下,将本地服务器或应用暴露到互联网上,从而实现内网穿透。以下是 Cloudflare Tunnel 的基本工作原理和步骤:

工作原理:

  1. Cloudflare Tunnel 创建了一个从本地服务器到 Cloudflare 的加密隧道。你的应用或服务运行在内网中,但它通过这个隧道连接到 Cloudflare 的网络。
  2. Cloudflare 网络 接收到来自用户请求的流量,然后转发到本地服务器。
  3. 用户与本地服务进行交互时,数据流经过加密隧道传输,从而避免了暴露内网 IP 地址和端口。

实现步骤:

  1. 注册 Cloudflare 账户并添加域名:

    • 如果还没有 Cloudflare 账户,首先去 Cloudflare 官网 注册一个。
    • 在 Cloudflare 控制面板中点击”添加站点”,输入你的域名。
    • 选择计划(Free 即可),Cloudflare 会自动扫描现有 DNS 记录。
    • 到你的域名注册商处,将域名的 nameserver 修改为 Cloudflare 提供的两个 nameserver 地址。
    • 等待 DNS 生效(通常几分钟到数小时),Cloudflare 控制面板中站点状态变为”Active”即表示域名已成功接入。
    • 这一步是后续所有操作的前提,必须先完成。
  2. 安装 Cloudflare Tunnel 客户端:

    • 在你的本地服务器上安装 cloudflared 客户端。你可以通过 Cloudflare 的官方文档 了解详细的安装过程。大致步骤:
      • 在 Linux 上,你可以使用以下命令:
        1
        2
        wget https://github.com/cloudflare/cloudflared/releases/latest/download/cloudflared-linux-amd64.deb
        sudo dpkg -i cloudflared-linux-amd64.deb
        对于没有sudo权限的普通用户
        1
        wget https://github.com/cloudflare/cloudflared/releases/latest/download/cloudflared-linux-amd64
      • 也可以在 macOS、Windows 等其他平台上进行类似安装。
  3. 认证 Cloudflare Tunnel:

    • 在服务器上运行以下命令,进行认证:
      1
      cloudflared tunnel login
    • 该命令会打开一个浏览器窗口,要求你登录到 Cloudflare 账户并授权。
  4. 创建 Tunnel:

    • 创建一个新的 Tunnel:
      1
      cloudflared tunnel create <tunnel-name>
    • 这会生成一个隧道 ID 和证书文件。
  5. 配置 DNS 路由:

    • 需要将你的域名指向刚创建的 Tunnel,有两种方式:
    • 方式一:通过 cloudflared 命令自动添加 CNAME 记录(推荐)
      1
      cloudflared tunnel route dns <tunnel-name> example.com
      这会自动在 Cloudflare DNS 中添加一条 CNAME 记录,将 example.com 指向你的 Tunnel。
    • 方式二:在 Cloudflare 控制面板手动添加 CNAME 记录
      • 登录 Cloudflare 控制面板,进入域名的 DNS 设置页面。
      • 添加一条 CNAME 记录:Name 填 tunnel(或子域名),Target 填 <tunnel-id>.cfargotunnel.com
      • 保存后等待 DNS 记录生效。
  6. 配置 Tunnel 代理并启动:

    • 设置隧道代理,通常是在本地应用监听的端口上。例如,如果你的服务在 localhost:8080 上运行,可以使用以下命令将流量通过隧道转发:
      1
      cloudflared tunnel --url http://localhost:8080
    • 或者也可以直接更改配置文件 ~/.cloudflared/config.yml
      1
      2
      3
      4
      5
      6
      7
      tunnel: 6bc4c976-1c0c-45a4-bab0-93b7eed4e1d1 # 你的 Tunnel ID
      credentials-file: $HOME/.cloudflared/6bc4c976-1c0c-45a4-bab0-93b7eed4e1d1.json

      ingress:
      - hostname: example.com
      service: http://localhost:8080 # 你的 Web 服务监听端口
      - service: http_status:404
    • 然后运行:
      1
      cloudflared tunnel run <tunnel-name>
    • 此时,你的本地服务就已经通过 Cloudflare Tunnel 暴露到互联网上了。
  7. 持久化服务(使用 systemd)

    • 以上步骤中运行 cloudflared tunnel run 的方式在终端退出后就会停止,为了让服务在后台持续运行,可以使用 systemd 来管理。

      方法一:使用 systemd 用户级服务(无需 sudo)

      如果你没有 sudo 权限,可以使用 systemd 的用户级服务来管理 cloudflared。

    1. 创建用户级服务目录和服务文件

      1
      2
      mkdir -p ~/.config/systemd/user
      nano ~/.config/systemd/user/cloudflared-tunnel.service
    2. 服务文件内容
      将以下内容复制到文件中,注意替换 <tunnel-name> 为你的隧道名称,<your-username> 为你的用户名:

      1
      2
      3
      4
      5
      6
      7
      8
      9
      10
      11
      12
      13
      14
      [Unit]
      Description=Cloudflare Tunnel
      After=network.target

      [Service]
      Type=simple
      ExecStart=/home/<your-username>/cloudflared tunnel run <tunnel-name>
      Restart=always
      RestartSec=5
      # 可选:指定配置文件
      Environment=CLOUDFLARED_CONFIG=/home/<your-username>/.cloudflared/config.yml

      [Install]
      WantedBy=default.target
    3. 启用并启动服务
      依次执行以下命令(无需 sudo):

      1
      2
      3
      4
      5
      6
      7
      8
      9
      # 重新加载 systemd 用户级配置
      systemctl --user daemon-reload

      # 启用开机自启(需要先执行 loginctl enable-linger)
      loginctl enable-linger $(whoami)
      systemctl --user enable cloudflared-tunnel.service

      # 启动服务
      systemctl --user start cloudflared-tunnel.service

      注意: loginctl enable-linger 确保用户不登录时用户级服务也能继续运行,否则用户退出登录后服务会停止。

      之后,可以使用以下命令检查服务状态和日志:

      1
      2
      3
      4
      5
      # 检查状态
      systemctl --user status cloudflared-tunnel.service

      # 查看日志
      journalctl --user -u cloudflared-tunnel.service -f

      方法二:使用 systemd 系统级服务(需要 sudo)

    4. 创建服务文件
      使用文本编辑器创建服务文件:

      1
      sudo nano /etc/systemd/system/cloudflared-tunnel.service
    5. 服务文件内容
      将以下内容复制到文件中,注意替换 <tunnel-name> 为你的隧道名称:

      1
      2
      3
      4
      5
      6
      7
      8
      9
      10
      11
      12
      13
      14
      15
      16
      17
      [Unit]
      Description=Cloudflare Tunnel
      After=network.target

      [Service]
      Type=simple
      User=root
      ExecStart=/usr/local/bin/cloudflared tunnel run <tunnel-name>
      Restart=always
      RestartSec=5
      # 可选:设置环境变量
      Environment=TUNNEL_ORIGIN_CERT=/path/to/cert.pem
      # 可选:指定配置文件
      Environment=CLOUDFLARED_CONFIG=/path/to/config.yml

      [Install]
      WantedBy=multi-user.target
    6. 启用并启动服务
      依次执行以下命令:

      1
      2
      3
      4
      5
      6
      7
      8
      # 重新加载 systemd
      sudo systemctl daemon-reload

      # 启用开机自启
      sudo systemctl enable cloudflared-tunnel.service

      # 启动服务
      sudo systemctl start cloudflared-tunnel.service

      之后,可以使用以下命令检查服务状态和日志:

      1
      2
      3
      4
      5
      # 检查状态
      sudo systemctl status cloudflared-tunnel.service

      # 查看日志
      sudo journalctl -u cloudflared-tunnel.service -f
  8. 启用 “Always Use HTTPS” 设置

    • Cloudflare 提供了一个非常简单的方法来自动将所有 HTTP 流量重定向到 HTTPS:通过 “Always Use HTTPS” 选项。这是最直接的方式,适用于大多数场景。

    • 操作步骤:

    • 登录到你的 Cloudflare 控制面板。
    • 选择你要配置的域名。
    • 进入 “SSL/TLS” 设置页面。
    • 在页面顶部,点击 “Edge Certificates” 选项卡。
    • 向下滚动,找到 “Always Use HTTPS” 设置。
    • 开启这个选项,将所有的 HTTP 请求自动重定向到 HTTPS。

优点:

  • 安全性高:内网不需要暴露在公网,只通过加密隧道进行通信。
  • 无公网 IP:适用于没有固定公网 IP 的环境。
  • 简化配置:不需要复杂的端口映射或 NAT 配置。

注意:

  • Cloudflare Tunnel 是一种基于 Cloudflare 的服务,因此需要有一个 Cloudflare 账户,并且 DNS 需要指向 Cloudflare 才能使用。
  • 可能会有流量限制或费用问题,特别是在高流量场景下。

这种方式的好处是可以轻松实现内网穿透,并且利用 Cloudflare 的全球加速和安全防护功能,使你的应用更加可靠和安全。如果有其他问题,或对某些配置有疑问,欢迎继续提问!


Cloudflare tunnel 内网穿透
https://zhazhajust.github.io/2025/02/02/cloudflare/
作者
JayZz
发布于
2025年2月2日
许可协议