个人 VPN 1.8.0

1.8.0 苹果免安装连接（测试功能）
- 在高级设置填写原 VPS 的 SSH 登录信息和原输出目录，再进入“苹果免安装”。
- 首次填写一台设备名称，点击“首次搭建并生成配置”；其他设备使用“添加设备并生成配置”。
- 为每台苹果设备生成独立 .mobileconfig，打开并在系统设置中安装描述文件后连接 VPN，不用安装 WireGuard 或使用外区 Apple 账户。
- 云防火墙需允许 UDP 500、4500；配置含专用 VPN CA、设备证书和私钥，只交给对应设备。
- 原管理记录保存在输出目录的 apple-vpn 子目录，失败后保留完整目录并点“重试未完成操作”。
- 苹果端为普通 VPN，不自动继承 Windows 国内直连；当前提供 IPv4 出口，对该 VPN 内层 IPv6 转发拒绝。
- 服务器支持 Ubuntu 22.04/24.04；已有 IPsec、端口/网段冲突、身份或证书变化会停止。
- 本次不代用户连接真实 VPS；真实部署由用户在 Windows 填写 SSH 后执行，苹果设备连接仍需实机确认。


1.7.7 设备管理原目录设置修复
- 同一服务器的设备读取和同步自动沿用原目录VPN端口，避免旧表单端口挡住添加设备。
- “读取原目录”恢复原服务器/端口并刷新设备；不同服务器不会在被动刷新时自动切换目标。
- 保留原设备身份；缺少管理记录时选择首次保存的完整目录，不要重新生成已有设备配置。

1.7.6 点 X 收到托盘
- 点击右上角 X 隐藏到系统托盘，保持当前连接与节点切换；点击蓝色 VPN 图标恢复窗口。
- 真正退出请右键托盘选择“退出”；退出前仍等待连接引擎可靠停止和清理。
- 托盘不可用或图标无效时，X 走原来的安全退出流程，避免窗口隐藏后找不回来。
- 忙操作拒绝退出或断开失败后，仍可以点 X 收到托盘，稍后再操作。

1.7.5 托盘与快速切换节点
- 托盘改为程序直接绘制的蓝底白色 VPN 图标，单击或双击可恢复主窗口。
- 启动即请求显示托盘，允许 Windows 托盘稍后可用时由 Qt 自动注册。
- 连接期间可直接选择其他节点：先正常断开原连接，确认结束后自动检查并连接新节点。
- 断开过程中再选其他节点，将连接最后一次选择；新连接启动期间暂时不能改选。
- 旧连接退出失败、强制结束或新节点检查失败时停止切换并提示；不会自动连回原节点。
- 未连接时选择节点仍只选择，不会自动连接；点击托盘退出或手工断开会取消待切换节点。
- Windows 可能把图标收到右下角“^”隐藏图标区，可展开找到蓝色 VPN 图标并拖到时钟旁。
- 本次仅做 Mac 合成测试和 Windows 包静态校验，Windows 实机仍需确认。

1.7.4 重连与托盘更新
- 修复断开后再次连接时，权限工具继承失效 Windows 控制台句柄而启动失败的问题。
- 同步修正连接检查、订阅离线检查和网卡预检的标准输入处理，保留文件权限保护。
- 最小化到右下角系统托盘，连接保持运行；双击图标或选择“显示主窗口”恢复。
- 托盘右键可选择“断开连接”或“退出”；退出仍等待连接清理确认。
- 系统托盘不可用时保留普通最小化，关闭窗口仍会退出并先断开连接。
- 本次在 Mac 进行合成回归；Windows 原生句柄、实机托盘及真实重连仍待验证。

1.7.3 界面轮询修复
- 修复状态轮询短暂禁用节点下拉、使下拉自动收起的问题。
- 修复断开后高级搭建/设备页每两秒被切走的问题，保留用户当前页面和焦点。
- 停止后不再持续轮询；轮询中的明确连接/断开操作串行执行。
- 首页与高级“国内直连”共用同一连接，不需要分别连接。
- 断开、切换页面、返回首页重连与失败后重试已通过合成回归测试。
  用户原环境中的重连配置提示尚未稳定复现，本轮未切换真实网络。

1.7.2 连接检查提示更新
- 分别提示配置不存在、读取权限不足、国内路由数据缺失、临时文件写入失败等问题。
  这些本地故障不会再统一提示“配置格式不兼容”。
- 增加仅离线检查当前节点的支持工具；报告只含状态与固定错误分类，不含配置、密钥或链接。
- 原节点列表和设备身份继续使用，升级后不会自动连接。

1.7.1 修复
- 补齐当前构建运行时 SSLContext 所需的证书资源，保留其既有不信任列表策略。
- 随附 certifi 2026.10.23 Mozilla 公共根证书库，与系统信任库一起使用，
  修复部分 ZeroSSL／Sectigo 证书链在本机默认信任库中无法验证的兼容问题。
  HTTPS 证书、主机名／IP 身份和有效期校验仍然开启。
- 兼容旧版 ws-path、ws-headers 与新版 ws-opts 参数；重复且一致时合并，冲突时拒绝。
- 区分证书失败、超时、HTTP 拒绝、Base64 通用订阅和 YAML 格式问题，提示不包含私密链接。
- 粘贴链接时自动移除两端空白，包括浏览器复制带来的空格与不间断空格。

支持 HTTPS Clash YAML 订阅与连接实时状态。
首页选择节点 → 连接；切换前先断开。自己 VPS 的 WireGuard 配置继续保留。

开始使用
1. 断开并从托盘菜单退出旧助手，停用官方 WireGuard 的原连接。
2. 完整解压，双击 PersonalVPN.exe，允许 Windows 权限提示。
   保留 _internal 文件夹。原有节点列表继续读取，不会自动连接。
3. 自己 VPS 的节点使用“导入配置”；订阅使用“添加订阅”。
4. 添加订阅时输入名称、粘贴 HTTPS Clash YAML 链接，再点击“添加并获取节点”。
   不需要将订阅链接发到聊天。软件后台获取、转换、检查并保存兼容节点。
5. “节点管理 → 更新订阅”手动刷新；重复添加同一链接会更新现有订阅。
   更新不自动连接，下载或格式检查失败保留原列表。
6. 首页下拉选择节点再连接；同一按钮断开。使用期间保持软件运行，可最小化。
   点 X 收到托盘；右键托盘“退出”才会先断开并退出。Windows 可能每次启动都提示管理员权限。

订阅支持范围
- 接受含 proxies 列表的 Clash/Mihomo YAML，HTTPS 链接，最多 2 MiB、512 个节点。
- 支持 SS 常见 AEAD／SS2022 单密钥、VMess AEAD、VLESS、Trojan 的已验证参数。
- 支持 TCP、WebSocket、gRPC；支持白名单 TLS/SNI/ALPN/uTLS 与 VLESS TCP Reality。
- 不支持的协议、插件、多路复用、未知参数、证书校验跳过等项目会列出原因。
  VLESS 未启用 TLS、VMess 明文加密组合等项目也会跳过。
- 只导入节点，不应用订阅里的 DNS、规则、监听端口、脚本、控制接口或代理组。
- 不递归获取 proxy-providers；仅有 providers 链接的配置需使用实际节点 YAML 链接。
- 不接受 HTTP 明文订阅、Base64 通用节点链接列表、单个分享链接或 OpenVPN 配置。
- 导入检查是语法与引擎离线校验，不验证账号有效、远端服务可达或速度。
  需以真实连接结果为准；当前不会自动选择最快节点或自动切到其他身份。
- 订阅链接与节点凭据使用当前 Windows 用户 DPAPI 加密，明文下载不落盘。
  更新仅由你点击触发。换 Windows 账户后需重新添加订阅，不能跨账户解密。
  下载只访问 HTTPS 公网地址，验证 TLS，不使用环境代理，不接受私网／回环地址。

实时状态
- 连接后约每秒采样一次：橙色上传、蓝色下载、最近 60 次采样曲线。
- KB/s、MB/s 使用 1024 进位；虚拟网卡统计包含国内直连及国外代理流量。
- 内存数值是当前连接引擎进程的工作集，不是整台电脑内存。
- 断开后速率与图表归零；读不到计数或进程时显示等待或空值，不生成模拟数据。

节点管理与配置
- 支持导入、重命名、移除，连接期间暂停节点修改。
- 移除订阅节点只移出当前列表，再次更新该订阅可能恢复该节点。
- WireGuard 节点只记原文件位置，原 .conf 和原输出目录需要保留；移除不删除原文件。
- 订阅节点凭据加密保存在本机，不依赖原 .conf；不存在于公开软件包中。
- 节点消失或配置失效时不会自动换另一身份，请自行选择可用节点。
- 现有标准 WireGuard 导入仍限单 Peer、IPv4 全隧道、公网 IPv4 Endpoint；可附加 IPv6。
- Mac 和手机继续使用各自官方 WireGuard 配置；内置订阅连接与状态区仅支持 Windows。

分流规则与边界
- 随附国内域名规则与 APNIC 标记为 CN 的 IP 分配快照用于选择本地直连；
  其他受支持的流量使用原 VPS 的 WireGuard 出口。规则在用户态引擎内处理，
  不往官方 WireGuard 配置中写入数万条 AllowedIPs，也不需要导入新 conf。
- 规则不是完整的 IP 地理库，也不按应用名称识别。其他注册机构或历史分配的
  国内地址可能遗漏；域名规则未覆盖的国内网站与部分 CDN 仍可能走 VPN。
  国外服务若匹配直连规则，也可能走本地。规则不会改善电脑到 VPS 的底层线路。
- 分流允许国内流量使用本地网络，不提供全流量断网保护；断开后可以恢复本地访问。
  不要把分流功能当作“禁止所有本地出口”的隐私保护方式。
- 引擎 DNS 按 IPv4 解析。匹配国内域名规则的请求使用 223.5.5.5，并走本地网络；
  其他请求使用 1.1.1.1，并显式通过 WireGuard 出口。应用自行使用的加密 DNS
  不保证按同样的域名规则解析，不应把本分流方式理解为所有 DNS 都只经 VPN。
- CN IPv6 地址可按规则直连。当前 VPS 没有国外 IPv6 出口；通过 DNS 访问的网站
  使用 IPv4，直接访问海外 IPv6 地址仍会进隧道，不能保证可用。
- 检查和连接会在当前 Windows 用户的受限临时目录中写入引擎所需的私有配置，
  断开时清理。原 conf、identity.json 和 VPS 授权不因选择本页而被替换。
- 仅支持本软件包的 Windows 内置客户端。Mac 和手机继续使用各自的官方 WireGuard
  客户端与独立配置；本页不生成手机二维码，不保证与本页相同的分流行为。
- 每台电脑必须有独立配置。在“设备管理”添加另一台电脑后，才将新 conf 安全传过去。
  原配置及临时引擎配置含私钥，不要分享到聊天、网盘公开链接或错误报告。

1.2 新增：记住登录信息与目录警告修复
- Windows 上可勾选“记住登录信息（Windows 加密）”，点击“保存登录信息”，
  或在勾选后执行检查/搭建操作。下次打开自动恢复服务器、SSH 端口、密码和原输出目录。
- 保存文件使用 Windows 当前用户 DPAPI 加密，不写入明文密码；只能在相应 Windows
  用户环境解密，不应作为跨电脑备份，也无法防止已经以该用户身份运行的恶意程序读取。
- “清除保存”会删除加密登录资料并清空界面密码，不删除设备密钥或 VPN 配置。
- 未勾选时，每次操作结束仍清空密码；macOS 启动版暂未提供安全记住功能，需手动输入。
- “检查服务器”和“检查运行状态”不再要求输出目录匹配，不会新建客户端密钥，
  也不会恢复/修改设备配置；运行状态会显示服务器实际使用的 VPN UDP 端口。
- “此输出目录已用于其他服务器或端口”表示界面地址/端口与 identity.json 记录不符。
  点击“选择目录”选回原目录，或点击“读取目录设置”，即可恢复原服务器和 VPN 端口。
  不要为此删除 identity.json、创建新密钥或重搭服务器。
- 选中另一个服务器的目录时，界面会清空旧密码，避免把一个服务器的凭据用于另一个。
  检查及修改都使用你填入的 SSH 端口；VPN UDP 端口是另一个字段。

新增电脑并生成 conf（设备管理）
1. 第一次使用先按下面“Windows 使用”完成服务器搭建。
2. 打开“搭建 VPN”页，填写同一 VPS 的 SSH 登录信息，并选择以前的原输出目录。
   原目录中必须保留 identity.json；从 1.0 升级时直接选择原目录，不需重搭服务器。
3. 打开“设备管理”，点击“读取原目录”。
4. 输入电脑名称，例如“办公室电脑”，点击“添加并生成 conf”。
5. 软件生成新的独立设备密钥、分配 VPN 地址，并通过 SSH 将公钥授权到服务器。
   客户端私钥留在本地；已有设备的密钥和连接配置保持原值。
6. 完成后，在列表中选中新增电脑，点击“另存选中 conf”，把文件安全传到该电脑。
   文件名使用设备编号；你输入的名称显示在设备管理列表中。
7. 对方安装官方 WireGuard 客户端，导入该 conf 文件并连接。
8. 每加一台电脑重复以上操作，不用再次安装服务器，也不需要给每台电脑买 VPS。
   配置文件可在 Windows 或 Mac 的 WireGuard 客户端使用。

失败重试与撤销
- 如果添加/撤销时 SSH 断开或同步失败，本地会保留待同步记录。修正登录信息后，
  点击“同步并重新导出”继续，不要重复添加同一台电脑。
- 添加成功显示“已生成配置”；尚未授权显示“待同步授权”。显示已生成不代表设备在线。
- 选中设备后点击“撤销选中设备”，确认并同步成功后，该旧 conf 不能再连接。
- 撤销未同步时可能仍能连接；需要看到同步成功，才算完成撤销。
- 撤销成功后，软件会清理原输出目录中该设备的 conf；手动传出的副本不会自动删除，
  但其公钥已从服务器移除，无法继续连接。
- 添加/撤销用热更新同步配置，不重启 VPN 接口；系统重启后也会保留设备名单。
- 本版保留已撤销设备记录，防止复用旧地址和误恢复旧配置。最多累计保存 253 条设备记录，
  并不代表 1GB VPS 可让 253 台设备同时高速上网；并发能力仍取决于服务器和线路。
- 管理请一直使用同一份原输出目录。多份旧目录同时修改会触发版本冲突，工具会停止。
  未勾选“记住登录信息”时，SSH 密码每次操作结束都会清空，下次操作前重新填写。

Windows 使用
1. 双击 PersonalVPN.exe，无需另外安装 Python。
2. 填写美国 VPS 的公网 IPv4、SSH 端口（通常 22）、SSH 用户名（通常 root）。
3. 选择密码或私钥登录；私钥有密码时填写“私钥密码”。
4. VPN UDP 端口默认 51820。输出目录请选专用空文件夹。
5. 点击“一键搭建并导出配置”。首次连接会显示服务器主机指纹。
   建议在云厂商的网页控制台查看 /etc/ssh/ssh_host_*_key.pub 对应的指纹，
   核实后再信任。例如在网页控制台运行：
   for k in /etc/ssh/ssh_host_*_key.pub; do ssh-keygen -lf "$k" -E sha256; done
6. 若云厂商启用了云防火墙，放行实际 SSH TCP 端口，以及 VPN UDP 端口。
   UDP 51820 的来源通常设为所有 IPv4；SSH 可仅允许你自己的公网 IP。
7. 软件完成后打开配置文件夹，将 windows.conf 留给 Windows，mac.conf 给 Mac。
8. 两台电脑分别安装官方 WireGuard 客户端并导入各自的 .conf 文件，点击连接：
   https://www.wireguard.com/install/
9. 连接后在浏览器检查公网 IP，应变成服务器公网 IP。
   也可在 Windows PowerShell / Mac 终端执行：
   curl https://api.ipify.org
   若 PowerShell 的 curl 是别名，使用：
   curl.exe https://api.ipify.org
   安装显示成功仅代表服务端已启动，不代表实际跨网连接已验证。

服务器要求
- 专用于 VPN 的 VPS，有公网 IPv4，能通过 SSH 访问。
- Ubuntu 22.04 或 24.04 LTS，systemd 和 Python 3（标准 Ubuntu 云镜像通常自带）。
- 建议 1 vCPU、1GB 内存及以上，至少 600MB 可用磁盘。
- SSH 用户为 root，或拥有免密码 sudo 权限的用户。
- 现有非本工具 WireGuard 配置、运行中的 Docker 或自定义 iptables 规则
  会导致工具停止，防止干扰其他服务。不会覆盖之前聊天脚本生成的 wg0。
  若已部署旧方案，请继续使用旧方案；迁移可另行安排，勿直接重装有重要数据的服务器。
- 标准 WireGuard 依赖 UDP，不保证在所有运营商或网络环境下可连接。
- 出口国家取决于 VPS，软件不能将其他国家的 VPS 变成美国出口。

本地文件
- windows.conf：Windows 的独立连接配置，含客户端私钥。
- mac.conf：Mac 的独立连接配置，含另一组客户端私钥。
- identity.json：保留两台设备的密钥，用于失败重试及再次导出。
- server.json：服务器公钥和部署检查结果。
- device-xxxxxxxxxxxx.conf：新增电脑的独立配置。设备名称、地址和撤销记录在 identity.json 中。
- windows-cn.conf：旧 1.3 生成的超长分流配置，本版本已停止生成，不建议继续使用。
  1.4“国内直连”直接选择原 windows.conf，由助手管理引擎，不需导出或导入新 conf。
同一服务器的重复安装必须使用原输出目录，会沿用密钥。
如果本地目录丢失，本版本不会用新密钥覆盖原来的服务器配置。
请在自己的加密磁盘或密码管理器附件中备份，勿公开分享以上私钥文件或二维码。
软件对输出目录设置当前用户专属权限。仅用户选择记住时，Windows 会加密保存登录凭据。
服务端只保存服务器私钥和已授权设备的公钥，客户端私钥不上传 VPS。
软件不含遥测，也不把 SSH 凭据发送给开发者；管理连接目标是你填写的 VPS。
分流连接还会按规则访问所用 DNS 解析服务及实际访问的网站；规则数据随软件包提供。
VPS 安装时会访问其配置的 Ubuntu 软件源。

防火墙和 IPv6
- 软件会启用 UFW，保留所填 SSH TCP 端口，放行 VPN UDP 端口和 VPN 出站转发。
- 转发只开放 VPN 网段 10.77.77.0/24 从 wgvpn 到公网网卡。
- NAT 仅作用于该 VPN 网段；服务随系统启动。
- 默认全流量配置的 IPv4 全量通过 VPN；IPv6 路由也进入隧道，但本版本不提供 IPv6 出口。
  这样可避免仅配置 IPv4 时 IPv6 继续走本地网络。IPv6 专用网站可能无法访问。
- 本工具未实现统一的断线保护。客户端断开 VPN 后，设备恢复原有网络路由；
  如需要始终禁止非 VPN 流量，请单独配置所用客户端及系统防火墙。
- 云厂商的防火墙不属于 Ubuntu 系统，本工具没有云账号权限，需要你在控制台放行。

排查
1. SSH 失败：核对地址、TCP 端口、用户名和密码/私钥，以及云防火墙。
2. 检测到旧 WireGuard 配置：工具只接受本工具已有安装，或全新专用 VPS。
3. 安装失败：保留本地原目录；修正运行记录中的错误，再填登录凭据重试。
   已完成的系统修改不会自动撤回；再次运行会沿用原服务器和设备密钥。
4. 没有握手：先确认客户端已连接，再查云防火墙是否允许正确的 UDP 端口。
5. 有握手无网页：点击“检查运行状态”，确认服务 active、IPv4 转发 1；
   检查 DNS 和网络是否限制 UDP。关闭其他 VPN 后再试。
6. 主机指纹变化：先从云控制台核实是否重装服务器；确认后才删除“信任记录”
   文件夹内 known_hosts 中该服务器的旧条目。不要直接信任不明变化。
7. 两台设备各用自己的配置；不要把同一个二维码同时导入 Windows 和 Mac。
8. 内置客户端检查失败：按新版提示处理。文件缺失时重新选择原 conf；
   随附规则或引擎缺失时完整解压软件包；权限或写入失败时检查本地目录权限。
   不要删除原设备密钥；旧 windows-cn.conf 不适合新客户端。
9. 提示已有 VPN：停用官方 WireGuard 的原隧道并断开其他 VPN，再重新检查与连接。
10. 引擎运行但网页慢或打不开：先断开并确认恢复原网络；“运行中”不代表连通测试通过。
    保留原配置，勿反复换密钥或重装 VPS。DNS、网站路由、运营商线路均可能影响访问，
    应按具体网站和同一网络下的结果继续排查。
11. 提示引擎未退出：保留本窗口，再点“断开”。助手会等待确认引擎退出后才允许真正退出。

Mac 运行部署工具（可选）
通常只需在 Windows 搭建一次，再将 mac.conf 导入 Mac 的官方 WireGuard 客户端。
如需直接在 Mac 上运行本工具，请使用源码包：
1. 安装 Python 3.12 或更高的兼容版本：https://www.python.org/downloads/macos/
2. 解压源码包，在终端进入解压目录，运行：bash 启动Mac.command
3. 首次会从 PyPI 安装依赖并打开相同界面；联网下载可能需要时间。
源码启动器需要 macOS 和所用 PySide6 版本兼容。
Windows 上不能生成或验证可签名的 Mac .app，本次提供的是 Mac 源码启动版。

版本与验证范围
此前版本在 Windows 环境进行过本地检查、模拟服务器同步检查和界面检查。
1.3 巨量 conf 分流方案已停用。内置客户端界面进行了 mock/offscreen 检查，
覆盖后台配置检查、无自动连接、权限取消、关闭等待引擎退出和错误信息脱敏。
1.5 的 136 项本地测试已通过。1.6 的节点管理、标准配置导入和打包离线检查结果见本次交付记录。
本轮使用合成节点检查，未连接或购买第三方 VPN。
2026-10-28 经你另行授权，在当前 Windows / 电信网络进行了两次临时连接：
- 国外出口确认是原 VPS 167.172.211.90；国内请求实际命中直连规则。
- 抖音网页 HTTP 200，返回约 0.17～0.18 秒；你确认抖音电脑版新视频播放顺畅。
- 两次正常断开后，网卡 MTU、接口度量及 WeakHost 参数与基线一致，
  无活动 JelvorTUN 或残留引擎进程，默认网关恢复原值；原 conf 内容未更改。
这些是本机当前网络的实测结果。异常强杀后的完整网卡恢复未做真实网络验证。
日常连接仍需你主动点击连接；检查配置不会自动切换网络。
Windows 可执行文件未购买代码签名证书，系统可能显示“未知发布者”。
源码随附可审阅。软件使用 sing-box、Paramiko、Cryptography、PySide6 / Qt、qrcode 等开源组件。
对应许可放在第三方许可目录；本工具不代表 WireGuard 或 sing-box 项目。

参考资料
https://www.wireguard.com/quickstart/
https://git.zx2c4.com/wireguard-tools/about/src/man/wg-quick.8
https://ubuntu.com/server/docs/firewalls/
https://ubuntu.com/server/docs/security-firewall/
https://docs.paramiko.org/en/stable/api/client.html
https://git.zx2c4.com/wireguard-windows/about/docs/netquirk.md

https://sing-box.sagernet.org/
https://sing-box.sagernet.org/configuration/inbound/tun/
