Cloudflared Helper Desktop
AGPL-3.0 · Made with ❤ by lingyicute

多条 Cloudflare Tunnel,
一个现代化桌面窗口搞定。

基于 Python + GTK4 的现代化桌面应用:保存任意数量的 cloudflared access 隧道,多条同时运行,每条都有独立的状态灯、启停按钮与实时日志。
复制一条 trycloudflare.com 快速隧道链接再切回窗口,还可以快速连接。

Linux 桌面 Flatpak GTK4 AGPL-3.0
往下滚动,不用安装就能在浏览器里点一点完整界面
多隧道管理 cloudflared 下载与更新 剪贴板自动识别
在线预览 · 直接上手点

不用安装,先把玩真正的界面

下面这个窗口是用原生 HTML / CSS / JS 复刻的:同样的标题栏、 同样的 boxed-list、同样的状态灯与文案。点「+」新建、点圆钮连接、点终端图标读日志、切到「版本管理」下载 cloudflared —— 行为都跟着真实代码走。 隧道、版本号与日志均为演示数据,可随意折腾,随时用工具条右侧的按钮重置。

窗口里的按钮都能点:试试 + 号新建隧道、行尾 菜单、右上角主菜单与「版本管理」页。
0 / 0 个隧道运行中 cloudflared:检测中…

窗口较宽,可左右滑动查看完整界面

功能特性

为「同时连好几条隧道」这件事而做

不是把命令行包一层壳。多隧道状态机、版本管理、剪贴板识别、端口校验,都是从日常使用里长出来的细节。

多隧道并发

保存任意数量的隧道,可同时连接多条。每条隧道都有独立的状态指示、启停按钮与实时日志,一条挂了不影响其他几条。

独立进程状态灯实时日志

剪贴板快速连接

窗口获得焦点后读一次剪贴板,发现 *.trycloudflare.com 链接就询问是否连接;点「是」时主机名和名称都填好了,只剩一个端口号要敲。

焦点检测150 ms 延迟一链只问一次

cloudflared 版本管理

自动识别系统与架构,从官方 Releases 拉取版本列表,一键下载安装、显示进度、随时取消;多版本并存,随时切换策略。

自动 chmod +x多版本并存探测生效版本

智能校验

端口范围检查、低于 1024 的权限提示、本地端口冲突检测,全部在启动之前拦下来——而不是让你对着 cloudflared 的报错猜。

1–65535sudo 提示冲突检测

贴心细节

程序启动时自动连接标了「自动连接」的隧道、一键复制等效命令行、连接失败时从提示条直接跳到日志、退出前确认断开。

自动连接复制命令行退出确认

额外参数直通

高级设置里可以追加任意 cloudflared 参数,原样拼到命令行末尾;引号不配对会在保存时就被拦下,而不是启动时才炸,报错还能在日志里找到。

原样透传保存时校验失败可查日志
快速开始

三步,连上一条隧道

全流程甚至不用碰鼠标:从复制链接到隧道跑起来,唯一的动作是敲一个端口号、按一次回车。

复制快速隧道链接

在任意机器上跑一条快速隧道,把输出的 https://xxx.trycloudflare.com 整条复制下来。

$ cloudflared tunnel --url localhost:8080

切回窗口,点「是」

应用拿到焦点后读一次剪贴板。只有「整条剪贴板就是一个快速隧道链接」才会弹窗询问,而且同一条链接一个会话只问一次。

敲端口,回车保存

新建对话框里主机名与「yyyymmdd hh:mm:ss 快速隧道」都已经填好,光标停在端口框上(默认值已选中),输入数字后按 Enter 即可,全程不用碰鼠标。

常见问题

它为什么这么做

这些设计决策都写在代码和文档里,这里整理成几条最常被问到的。

为什么没有「协议类型」选项?

因为 cloudflared accessssh / rdp / smb 并不是不同的协议实现,它们只是 tcp 的别名:四个子命令共用同一个 Action 和同一组 flag,源码中没有任何地方读取子命令名;ssh://rdp:// 这类 scheme 也只用来推导缺省的 --url,对转发行为没有任何影响。

因此本应用统一执行:cloudflared access tcp --hostname <隧道主机名> --url <监听地址>:<端口>

只有一个例外:cloudflared 2020.6.1 之前的古董版本还没有 tcp 子命令;不过官方只支持一年以内的版本,就别惦记它们了。

需要先自己安装 cloudflared 吗?

不需要。在「版本管理」页点「安装最新版」,应用会按系统与架构匹配官方资源名(如 cloudflared-linux-amd64),下载后自动 chmod +x 并记下位置。

你也可以用系统 PATH 里已有的 cloudflared,或指定某个已安装的版本;「自动:最新已安装版本」是默认策略。

它会一直读取我的剪贴板吗?

不会。它只在「整个窗口获得键盘焦点」时读一次,并延迟 150 ms。窗口内部控件之间切焦点不算「获得焦点」,所以不会反复弹窗。

  • 同一条链接一个会话只问一次;
  • 已经建过相同主机名的隧道就不再问;
  • 在预填对话框里点了「取消」不会吞掉链接,下次切回窗口还会再问;
  • 不想要可以在主菜单里关掉「剪贴板快速连接」。
多条隧道能同时连吗?端口冲突怎么办?

可以同时连,每条隧道是一个独立的 cloudflared 子进程,有各自的日志与退出码。

启动前会做本地端口冲突检测:localhost::1 视为同一地址,0.0.0.0 / :: 与任何具体地址都算冲突。

支持哪些系统?怎么分发?

安装包只发 Linux(x86_64 / aarch64 的 Flatpak 与便携版);代码本身跨平台,macOS 上装好 PyGObject 与 GTK4 / libadwaita 也能从源码跑。cloudflared 二进制的下载支持 amd64 / arm64 / arm / 386 自动匹配,macOS 取 .tgz 包解压安装。

配置和下载的 cloudflared 存在哪里?

隧道配置是纯文本 JSON,放在 ~/.config/cloudflared-tunnel-manager/config.json,手改、备份、同步到别的机器都可以(写坏了也不会炸,启动时会自动回退默认值)。

下载的 cloudflared 按版本分目录,放在 ~/.local/share/cloudflared-tunnel-manager/versions/<版本>/

下载安装

挑一种方式装上去

所有构建产物都在 GitHub Actions 里自动生成并上传到 Releases,文件名与架构一一对应。

从源码运行

Python ≥ 3.10 · GTK 4 · libadwaita ≥ 1.4

适合想改点什么的你。装好 PyGObject 与 GTK4 / libadwaita(macOS 用 Homebrew 装同名包),然后一条命令起。

# 克隆仓库并安装依赖
git clone https://github.com/lingyicute/Cloudflared-Helper-Desktop
cd Cloudflared-Helper-Desktop
sudo apt install python3-gi gir1.2-gtk-4.0 gir1.2-adw-1
python3 main.py
# 安装并启动 Flatpak 包
flatpak install --user ./cloudflared-tunnel-manager-x86_64.flatpak
flatpak run uk._92li.cftm.CloudflaredTunnelManager
# 解压便携包(--self-test 可先验环境)
tar -xzf cloudflared-tunnel-manager-*-linux-x86_64.tar.gz
./cloudflared-tunnel-manager/cloudflared-tunnel-manager

把散落的隧道,都收进这一个窗口

去 Releases 下载安装包,或从源码运行。装好后先去「版本管理」拿一个 cloudflared,再把常用隧道一条条存进来,以后就是点一下的事。