Skip to content

Cloudflare Tunnel 内网穿透教程(Linux) ​

Cloudflare Tunnel 在 Linux 上的工作方式与 Windows 完全一致:cloudflared 守护进程主动向 Cloudflare 边缘网络建立出站加密连接,外部流量经你的域名进入 Cloudflare 网络,再通过隧道转发到本机服务。全程不需要公网 IP,不需要开放任何入站端口,Linux 服务器位于 NAT 或防火墙之后也可以正常工作。

本教程使用 云端管理(Token 模式),全程在 Cloudflare Dashboard 完成隧道创建和路由配置。Linux 端提供两种部署方式:systemd 原生服务(推荐,轻量、开机自启)和 Docker 容器(适合已经使用容器化环境或希望隔离运行的场景)。

前提条件 ​

  • 一个托管在 Cloudflare 的域名(NS 已指向 Cloudflare)。
  • 一台可访问互联网的 Linux 服务器(Debian / Ubuntu / CentOS / RHEL / Fedora 等均可)。
  • 具有 sudo 权限的账户。

为什么需要域名

Cloudflare Tunnel 通过一个公有主机名(如 app.yourdomain.com)来对外暴露本地服务。这个主机名必须是你的 Cloudflare 域名下的子域名,Cloudflare 会自动创建对应的 DNS 记录指向隧道。

第一步:创建隧道并获取 Token ​

  1. 登录 Cloudflare Zero Trust Dashboard。
  2. 在左侧导航栏进入 网络 → Tunnels,点击 创建隧道。
  3. 选择 Cloudflared 连接器,输入隧道名称(例如 xzyapp-linux),点击保存。
  4. 在“安装并运行”页面,操作系统选择 Debian(或你实际使用的发行版),架构选择 64-bit。
  5. 页面会显示一条类似下面的安装命令,其中 eyJhIjoi... 部分就是你的 Token:
bash
sudo cloudflared service install eyJhIjoi**************bSJ9

安全提示

这条 Token 授予了对 Cloudflare 账户下该隧道的访问权限。不要公开分享,截图时务必打码。一旦泄露,可以在隧道详情页点击 刷新令牌 使旧 Token 立即失效。

记下这串 Token,关闭页面,进入下一步。

第二步:在 Linux 上安装并启动服务 ​

2.1 安装 cloudflared ​

Debian / Ubuntu(APT)

bash
# 添加 Cloudflare 官方 GPG 密钥和软件源
sudo mkdir -p --mode=0755 /usr/share/keyrings
curl -fsSL https://pkg.cloudflare.com/cloudflare-main.gpg | sudo tee /usr/share/keyrings/cloudflare-main.gpg >/dev/null

echo "deb [signed-by=/usr/share/keyrings/cloudflare-main.gpg] https://pkg.cloudflare.com/cloudflared $(lsb_release -cs) main" | sudo tee /etc/apt/sources.list.d/cloudflared.list

# 安装
sudo apt update && sudo apt install -y cloudflared

CentOS / RHEL / Fedora(RPM)

bash
wget https://github.com/cloudflare/cloudflared/releases/latest/download/cloudflared-linux-x86_64.rpm
sudo rpm -i cloudflared-linux-x86_64.rpm

安装完成后验证:

bash
cloudflared --version

2.2 以 Token 方式安装为 systemd 服务 ​

bash
sudo cloudflared service install 你的TOKEN

执行成功后,启动并设置开机自启:

bash
sudo systemctl enable --now cloudflared

2.3 验证连接状态 ​

bash
sudo systemctl status cloudflared --no-pager

状态显示 active (running) 即表示服务已正常运行。同时回到 Cloudflare Dashboard 的 Tunnels 列表,你创建的隧道状态应从“非活动/离线”变为健康/已连接。

后续管理服务

bash
sudo systemctl status cloudflared
sudo systemctl restart cloudflared
sudo systemctl stop cloudflared
sudo journalctl -u cloudflared -f

第三步:添加路由,发布应用程序 ​

  1. 在 Tunnels 列表中点击你刚创建的隧道名称,进入详情页。
  2. 切换到 路由 标签页。
  3. 点击 添加路由。
  4. 在路由类型选择弹窗中,选择 已发布应用程序。
  5. 填写路由信息:
字段填写内容示例
子域你希望使用的二级域名前缀app
域下拉选择你的 Cloudflare 域名yourdomain.com
路径留空即可(除非需要按路径分流)—
服务 → 类型本地服务协议HTTP
服务 → URL本地服务的地址和端口http://localhost:8080
  1. 点击 添加路由 保存。

Cloudflare 会自动在 DNS 中创建 CNAME 记录,将 app.yourdomain.com 指向隧道的 cfargotunnel.com 子域。现在访问 https://app.yourdomain.com,请求就会经由 Cloudflare 网络,通过隧道转发到这台 Linux 服务器上的 localhost:8080。

进阶:使用 Docker 运行(可选) ​

方式一:docker run ​

bash
docker run -d \
  --name cloudflared \
  --restart unless-stopped \
  --network host \
  cloudflare/cloudflared:latest \
  tunnel --no-autoupdate run --token 你的TOKEN

--no-autoupdate 避免容器内的 cloudflared 自动更新导致意外重启。

方式二:docker-compose.yml ​

yaml
services:
  cloudflared:
    image: cloudflare/cloudflared:latest
    container_name: cloudflared
    restart: unless-stopped
    network_mode: host
    command: tunnel --no-autoupdate run --token ${CLOUDFLARE_TUNNEL_TOKEN}

network_mode: host 的用途

Docker 中 cloudflared 需要访问宿主机的本地服务(如 localhost:8080)。使用 network_mode: host 可以让容器直接共享宿主机网络栈,从而通过 localhost 访问本地服务,避免额外的网络配置。

进阶:同时发布多个本地服务 ​

一个隧道可以承载多个独立的应用程序。重复第三步,为每个本地服务添加一条“已发布应用程序”路由即可:

公网主机名本地服务
app.yourdomain.comhttp://localhost:8080
nas.yourdomain.comhttp://localhost:5000
api.yourdomain.comhttp://localhost:3000

每条路由都会生成独立的 DNS 记录,互不干扰。

常见问题排查 ​

服务启动失败或状态异常 执行 sudo journalctl -u cloudflared -n 50 --no-pager 查看最近日志。常见原因是 Token 复制不完整或包含多余空白字符。重新执行 sudo cloudflared service install 完整TOKEN 即可覆盖配置。

访问域名返回 502 / 1033 错误 通常表示 cloudflared 与 Cloudflare 之间的连接正常,但无法连接到本地服务。检查本地服务是否正在监听 Dashboard 中配置的端口:ss -tlnp | grep 8080。

Docker 容器无法访问宿主机服务 确认是否使用了 network_mode: host。如果未使用 host 网络,需要将服务 URL 改为 http://宿主机局域网IP:端口。

修改 Dashboard 路由后不生效 cloudflared 会自动拉取远程配置,通常无需手动操作。如果长时间未同步,重启服务即可:sudo systemctl restart cloudflared(systemd)或 docker restart cloudflared(Docker)。

如何更换 Token 进入隧道详情页,在右侧点击 刷新令牌,旧 Token 会立即失效。随后用新 Token 重新执行 sudo cloudflared service install 新TOKEN 并重启服务。

小结 ​

Linux 版与 Windows 版的流程骨架完全一致,核心区别仅在于安装和持久化方式:

Dashboard 创建隧道 → 复制 Token → sudo cloudflared service install 你的TOKEN → systemctl enable --now cloudflared → 添加“已发布应用程序”路由 → 通过公网域名访问

如果服务器已有 Docker 环境,也可以选择 docker run 或 docker compose 方式运行 cloudflared。整个过程中,Linux 服务器不需要开放任何入站端口,也不需要公网 IP。

VitePress Vue.js 3.5+ Node.js 24.04 LTS pnpm Nginx Released under the MIT License.