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 ...` 来连接,这就是为你准备的工具。
## 为什么需要它
每次在 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
## 为什么需要它
每次在 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, 逆向工具