itatipaul/vpn-launcher

GitHub: itatipaul/vpn-launcher

一款 Linux 平台的 VPN 连接管理 GUI 工具,支持通过图形界面一键启动和切换 OpenVPN 与 WireGuard 配置文件,免去终端操作。

Stars: 2 | Forks: 0

# VPN Launcher Pro 用 ❤️ 制作。 一个简单的 GUI,用于在 Linux 上切换 OpenVPN 配置文件——无需终端。 专为使用 **HackTheBox**、**TryHackMe**、**OffSec/PG** 及类似平台的用户打造。如果你经常需要在多个 `.ovpn` 文件之间切换,且不想每次都输入 `sudo openvpn --config ...` 来连接,这就是为你准备的工具。 disconnected connected ## 为什么需要它 每次在 HTB、THM 或 OffSec 之间切换时,你都必须: 1. 找到正确的 `.ovpn` 文件 2. 打开终端 3. 输入 `sudo openvpn --config ~/Downloads/htb-eu-whatever.ovpn` 4. 保持终端开启 5. 每次切换都要重复以上步骤 这款工具用一个双击即可运行的桌面图标取代了上述所有操作。选择一个配置文件,点击 Connect,搞定。如果需要调试,终端日志依然会在应用内显示,但你再也不必为了使用它而去碰终端了。 ## 功能 - 桌面端一键连接和断开 - 支持 **OpenVPN** (`.ovpn`) 和 **WireGuard** (`.conf`) 配置文件 - 自动从文件夹中加载所有配置文件——每个文件都会标记为 `[ovpn]` 或 `[wg]` - 应用内显示实时的彩色 OpenVPN 日志 - 显示隧道 IP、连接状态和会话正常运行时间 - 搜索框,可按名称筛选配置文件 - 最小化到系统托盘——保持在后台运行 - **持久化配置**——文件夹路径和上次使用的配置文件在重启后会保存下来(`~/.config/vpn-launcher/config.json`) - **连接超时**——如果隧道在 60 秒内未建立,则自动中止 - **配置文件切换保护**——在隧道处于活动状态时切换配置文件会先进行提示 - **日志大小限制**——日志会被修剪为 500 行,以防止长时间会话导致内存增长 - 安装设置完成后无需再使用终端 ## 要求 - Linux(Kali、Ubuntu、Debian、Arch 等) - X11 或 XWayland - `openvpn` - `polkit` / `pkexec`——用于连接时的权限提示 - `python3-tk`——Tkinter GUI 库 - `fonts-dejavu`——UI 使用的等宽字体 - `iproute2`——用于提供 `ip` 命令(在所有主要发行版中均已预装) - `python3-pillow` / `Pillow`——用于调整窗口图标的图像大小(避免在处理大型 PNG 时触发 X11 `BadLength` 错误) - `pystray`——系统托盘图标(最小化到托盘而不是关闭) - `wireguard-tools`——用于提供 WireGuard 支持(`wg-quick`) ## 安装说明 ### 1. 安装依赖 **Kali / Debian / Ubuntu:** ``` sudo apt update sudo apt install openvpn wireguard-tools policykit-1 python3-tk fonts-dejavu pip install pillow pystray --break-system-packages ``` **Arch / Manjaro:** ``` sudo pacman -S openvpn wireguard-tools polkit python-tk ttf-dejavu pip install pillow pystray ``` **Fedora:** ``` sudo dnf install openvpn wireguard-tools polkit python3-tkinter dejavu-sans-mono-fonts pip install pillow pystray ``` ### 2. 克隆仓库 ``` git clone https://github.com/itatipaul/vpn-launcher.git cd vpn-launcher ``` ### 3. 运行安装程序 ``` chmod +x install.sh ./install.sh ``` 安装程序会一次性完成所有设置: - 将 `vpn_launcher.py` 复制到 `/usr/local/bin/vpn-launcher`(在系统全局的 PATH 中可用) - 安装一个限定于你当前用户的 polkit 规则,使得断开连接时无需密码提示 - 将 desktop entry 安装到 `~/.local/share/applications/` - 在 `~/Desktop/` 上放置一个快捷方式并将其标记为受信任(在 GNOME 上不会出现“允许启动”的提示) - 如果 `~/Desktop/vpn/` 不存在,则创建它 ### 4. 导入你的 VPN 配置文件 ``` cp ~/Downloads/*.ovpn ~/Desktop/vpn/ cp ~/Downloads/*.conf ~/Desktop/vpn/ ``` 应用默认使用 `~/Desktop/vpn/` 目录。它会自动加载 `.ovpn` (OpenVPN) 和 `.conf` (WireGuard) 文件。你可以使用应用内的 **[browse]** 按钮将其指向任何文件夹。 ### 6. 启动 ``` vpn-launcher ``` 或者在你的应用程序菜单中找到 **VPN Launcher**。 ## 卸载 ``` ./uninstall.sh ``` 移除二进制文件、终止脚本、polkit 规则和 desktop entry。你的 `.ovpn` 文件将保持原样,不受影响。 ## 断开连接是如何工作的 OpenVPN 以 root 权限运行(通过 `pkexec` 启动)。由于从用户空间的 GUI 无法向 root 拥有的进程发送信号,因此断开连接时会使用 `pkexec` 以 root 身份运行一个内联 shell 脚本,该脚本会发送 SIGTERM,等待最多约 5 秒钟,然后在必要时升级为 SIGKILL: ``` GUI (your user) → pkexec sh -c 'pkill -TERM openvpn; sleep…; pkill -KILL openvpn' → kills root-owned openvpn ✓ ``` 由 `install.sh` 安装的 polkit 规则允许安装用户在执行此操作时无需密码提示。这里没有安装单独的辅助脚本——所有的终止逻辑完全以内联方式运行。 ## 用法 ### 连接 1. 从桌面或应用程序菜单中打开 VPN Launcher 2. 你的 `.ovpn` 配置文件会显示在左侧边栏中 3. 点击一个配置文件以选中它 4. 点击 **[ CONNECT ]** 5. 在出现的 `pkexec` 提示中输入你的密码 6. 等待日志显示 `Initialization Sequence Completed` 7. 状态会切换为 **ONLINE**,并自动显示隧道 IP ### 断开连接 点击 **[ DISCONNECT ]**。隧道将关闭,状态返回至 **OFFLINE**,并且运行时间将重置。 ### 在不同平台之间切换 在侧边栏中点击另一个配置文件。如果当前已有活动的隧道,应用会在断开并切换前提示你进行确认。确认后会断开当前隧道并选择新的配置文件,或者取消以保持当前连接。 ### 使用其他文件夹 如果你的 `.ovpn` 文件不在 `~/Desktop/vpn/` 中,请点击 **[browse]** 选择其他文件夹,或者直接在文件夹字段中输入路径并点击 **[reload]**。应用会将文件夹路径保存到 `~/.config/vpn-launcher/config.json`,并在下次启动时自动恢复。 ### WireGuard 配置文件 WireGuard `.conf` 文件会和 OpenVPN `.ovpn` 文件一起加载。列表中的每个配置文件都会标记为 `[ovpn]` 或 `[wg]`,让你随时清楚自己正在连接什么。 对于 WireGuard,接口名称派生自文件名——例如,`wg0.conf` 会启动接口 `wg0`。连接和断开的工作方式与 OpenVPN 相同。 ### 最小化到托盘 关闭窗口会将应用最小化到系统托盘,而不是退出。托盘图标会在其工具提示中显示当前的连接状态。右键点击托盘图标可获取菜单: - **显示 VPN Launcher**——恢复窗口(双击图标也可触发) - **连接 / 断开**——无需打开窗口即可控制 VPN - **退出**——完全退出应用 如果未安装 `pystray`,关闭窗口将直接退出应用。 ### 搜索配置文件 在 `> search…` 框中输入内容,即可实时按名称筛选配置文件列表——当你拥有跨不同平台或区域的多个 `.ovpn` 文件时,这非常有用。 ## 工作原理 ### 无需 root 权限的 GUI OpenVPN 需要 root 权限来创建 `tun` 接口和修改路由表。应用没有将整个程序以 root 身份运行,而是仅使用 `pkexec` 提升 `openvpn` 子进程的权限: ``` GUI (your user) → pkexec → openvpn (root) ``` `pkexec` 相当于 Polkit 版的 `sudo`,它会显示一个图形化的密码提示,因此你完全不需要使用终端。 ### 日志流 OpenVPN 的输出会逐行实时流式传输到日志窗格中。行内容会自动进行颜色编码: | 颜色 | 含义 | |--------|---------| | 亮绿色 | 隧道已建立 | | 琥珀色 | 警告 | | 红色 | 错误 | | 暗绿色 | 信息 / 正常输出 | ### 隧道 IP 检测 一旦隧道建立,应用就会通过 `ip -4 addr` 扫描所有 `tun*` 接口来查找分配的 IP——这比解析日志行更可靠,并且能自动处理带编号的接口(`tun1`、`tun2` 等)。它会重试约 6 秒钟,以便为内核留出时间完成接口的配置。 ### 断开连接 断开连接会通过 `pkexec sh -c '...'` 以 root 身份运行一个内联 shell 脚本。该脚本会向 openvpn 发送 SIGTERM,等待最多约 5 秒以正常退出,如果进程仍然存活,则升级为 SIGKILL。无论这些 openvpn 进程是如何启动的,这都能干净地终止所有进程。由 `install.sh` 安装的 polkit 规则允许安装用户执行此操作时无需密码提示。 ### 配置持久化 在每次连接和更改文件夹时,应用都会将当前的文件夹路径和所选配置文件名写入 `~/.config/vpn-launcher/config.json`。在下次启动时,`_load_config()` 会恢复这两者——因此应用会在你上次离开的相同状态下打开。 ### 连接超时 当点击 Connect 时,会启动一个 60 秒的计时器。如果届时日志中仍未出现 `Initialization Sequence Completed`(可能是 pkexec 被取消、OpenVPN 挂起、网络不可达),计时器将触发 `_on_connect_timeout()`,从而中止连接并显示 `[ TIMEOUT ]`。如果隧道建立完成或者首先检测到了身份验证/TLS 失败,该计时器将被立即取消。 ### 配置文件切换保护 在隧道处于活动状态时点击其他配置文件会触发一个“是/否”对话框。确认后会在切换选择之前调用 `disconnect()`。取消则会保持当前的隧道和选择不变。 ### 日志大小限制 `write_log()` 会在每次插入前检查行数,并修剪为最后 500 行。这可以防止 Tkinter Text widget 在长时间会话期间无限制地增长。 ## 文件结构 ``` repo/ ├── vpn_launcher.py ← main app ├── vpn_launcher_icon_v3.png ← app icon ├── requirements.txt ← Python dependencies ├── install.sh ← installer └── uninstall.sh ← uninstaller after install: /usr/local/bin/ ├── vpn-launcher ← main app (on PATH) └── vpn_launcher_icon_v3.png ← window/taskbar icon /etc/polkit-1/rules.d/ └── 50-vpn-launcher-kill.rules ← passwordless disconnect for your user ~/.local/share/applications/ └── VPN_Launcher.desktop ← app menu entry ~/.config/vpn-launcher/ └── config.json ← saved folder path + last-used profile ~/Desktop/ └── VPN_Launcher.desktop ← desktop shortcut (trusted, double-click to launch) ~/Desktop/vpn/ ← default profiles folder (created by installer) ├── htb.ovpn ├── offsec.ovpn ├── thm.ovpn └── wg0.conf ``` ## 故障排除 **应用在点击连接后立即显示 `[ TIMEOUT ]`** 连接尝试在 60 秒后超时。常见原因:关闭了 pkexec 密码提示、OpenVPN 无法连接到服务器,或者 `.ovpn` 文件配置了一个不可达的远程地址。检查日志窗格以获取详细信息,并验证你的网络连接。 **应用重启后未记住文件夹路径或上次的配置文件** 配置保存在 `~/.config/vpn-launcher/config.json` 中。检查该目录是否可写: ``` ls -la ~/.config/vpn-launcher/ cat ~/.config/vpn-launcher/config.json ``` **未出现密码提示 / 点击连接后没有任何反应** 确保已安装 `polkit` 并且有 Polkit agent 正在运行。在最小化安装的 Kali 系统上: ``` sudo apt install policykit-1 /usr/lib/polkit-gnome/polkit-gnome-authentication-agent-1 & ``` **`No module named tkinter`** ``` sudo apt install python3-tk ``` **连接后隧道 IP 显示为 `───────`** 应用会自动扫描所有 `tun*` 接口,因此可以处理诸如 `tun3` 或 `tun4` 这样的带编号接口。如果在大约 6 秒后仍未显示 IP,请检查日志以确认打开了哪个接口,并使用 `ip -4 addr` 进行验证。 **应用无法启动** ``` vpn-launcher # run from terminal to see any errors ``` 如果提示 `command not found`,请重新运行 `./install.sh`。 **关闭窗口后未出现托盘图标** 确保已安装 `pystray` 并且系统托盘正在运行: ``` pip install pystray --break-system-packages ``` 在没有托盘的最小化 Kali 安装上(例如裸机 i3/bspwm),请安装一个: ``` sudo apt install trayer trayer & ``` 如果缺少 `pystray`,应用将回退到关闭窗口时直接退出——没有托盘,但不会崩溃。 **窗口图标未出现 / X11 `BadLength` 错误** PNG 图标在运行时会使用 Pillow 调整大小为 64×64。如果缺少 Pillow,你可能会看到 `BadLength` X 错误或静默的启动失败: ``` pip install pillow --break-system-packages ``` **`DejaVu Sans Mono` 字体看起来不对或发生回退** ``` sudo apt install fonts-dejavu ``` **WireGuard 接口无法启动** 确保已安装 `wireguard-tools`: ``` sudo apt install wireguard-tools ``` 使用以下命令检查你的 `.conf` 文件是否有效: ``` sudo wg-quick up ~/Desktop/vpn/wg0.conf ``` **崩溃后出现幽灵 wg 接口** 如果应用在未断开 WireGuard 隧道的情况下崩溃: ``` sudo wg-quick down ~/Desktop/vpn/wg0.conf ``` **崩溃后出现幽灵 tun 接口** 如果应用在未断开连接的情况下崩溃,可能会留下旧的 `tun` 接口。手动清理它们: ``` sudo pkill openvpn sudo ip link delete tun0 # repeat for tun1, tun2, etc. as needed ``` ## 已测试环境 - Kali Linux 2025.x — XWayland 上的 GNOME - OpenVPN 2.7.x - HTB、THM 和 OffSec/PG 的 `.ovpn` 配置文件 ## 更新日志 ### v1.1 - **配置持久化**——文件夹路径和上次使用的文件将保存到 `~/.config/vpn-launcher/config.json`,并在启动时恢复 - **连接超时**——未在 60 秒内完成的连接尝试将自动中止,并显示 `[ TIMEOUT ]` 状态 - **配置文件切换保护**——在隧道处于活动状态时切换配置文件,现在会在断开连接前提示确认 - **日志大小限制**——日志窗格将被修剪为 500 行,以防止长时间会话期间内存的增长 ### v1.0 - 初始发布——支持 OpenVPN 和 WireGuard,包含系统托盘、实时日志、隧道 IP 检测、搜索以及基于 polkit 的无密码断开连接 ## 许可证 MIT
标签:GUI工具, OpenVPN, VPN, WireGuard, 逆向工具