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
- 登录 Cloudflare Zero Trust Dashboard。
- 在左侧导航栏进入 网络 → Tunnels,点击 创建隧道。
- 选择 Cloudflared 连接器,输入隧道名称(例如
xzyapp-linux),点击保存。 - 在“安装并运行”页面,操作系统选择 Debian(或你实际使用的发行版),架构选择 64-bit。
- 页面会显示一条类似下面的安装命令,其中
eyJhIjoi...部分就是你的 Token:
sudo cloudflared service install eyJhIjoi**************bSJ9安全提示
这条 Token 授予了对 Cloudflare 账户下该隧道的访问权限。不要公开分享,截图时务必打码。一旦泄露,可以在隧道详情页点击 刷新令牌 使旧 Token 立即失效。
记下这串 Token,关闭页面,进入下一步。
第二步:在 Linux 上安装并启动服务
2.1 安装 cloudflared
Debian / Ubuntu(APT)
# 添加 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 cloudflaredCentOS / RHEL / Fedora(RPM)
wget https://github.com/cloudflare/cloudflared/releases/latest/download/cloudflared-linux-x86_64.rpm
sudo rpm -i cloudflared-linux-x86_64.rpm安装完成后验证:
cloudflared --version2.2 以 Token 方式安装为 systemd 服务
sudo cloudflared service install 你的TOKEN执行成功后,启动并设置开机自启:
sudo systemctl enable --now cloudflared2.3 验证连接状态
sudo systemctl status cloudflared --no-pager状态显示 active (running) 即表示服务已正常运行。同时回到 Cloudflare Dashboard 的 Tunnels 列表,你创建的隧道状态应从“非活动/离线”变为健康/已连接。
后续管理服务
sudo systemctl status cloudflared
sudo systemctl restart cloudflared
sudo systemctl stop cloudflared
sudo journalctl -u cloudflared -f第三步:添加路由,发布应用程序
- 在 Tunnels 列表中点击你刚创建的隧道名称,进入详情页。
- 切换到 路由 标签页。
- 点击 添加路由。
- 在路由类型选择弹窗中,选择 已发布应用程序。
- 填写路由信息:
| 字段 | 填写内容 | 示例 |
|---|---|---|
| 子域 | 你希望使用的二级域名前缀 | app |
| 域 | 下拉选择你的 Cloudflare 域名 | yourdomain.com |
| 路径 | 留空即可(除非需要按路径分流) | — |
| 服务 → 类型 | 本地服务协议 | HTTP |
| 服务 → URL | 本地服务的地址和端口 | http://localhost:8080 |
- 点击 添加路由 保存。
Cloudflare 会自动在 DNS 中创建 CNAME 记录,将 app.yourdomain.com 指向隧道的 cfargotunnel.com 子域。现在访问 https://app.yourdomain.com,请求就会经由 Cloudflare 网络,通过隧道转发到这台 Linux 服务器上的 localhost:8080。
进阶:使用 Docker 运行(可选)
方式一:docker run
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
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.com | http://localhost:8080 |
nas.yourdomain.com | http://localhost:5000 |
api.yourdomain.com | http://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。
