# 网关保活 · .NET 托盘版 Windows 上的主路由 / 旁路由保活工具。旁路由连续检测失败时回退直连,稳定恢复后切回旁路由;也可以固定模式或暂停自动切换。 基于 [PowerShell 原项目](https://git.lionwebsite.xyz/lion/Gateway-keepaliveForPowershell) 重写,使用 C#、.NET 10、WinForms。托盘交互参考相邻的雷蛇鼠标控制器项目。完整设计见 [PLAN.md](PLAN.md)。 ## 当前版本 这是 `0.1.0` 初版,包含托盘面板、中文设置、分层探测、自动策略、可补偿的路由/DNS切换、快照恢复、日志与最高权限登录任务。 默认未配置且暂停。首次运行必须显式选择网卡并保存,程序不会按网卡名字猜测并立即修改网络。只管理选择网卡的 IPv4 默认路径;IPv6、VPN 路由和其他网卡不接管。 ![主面板](docs/screenshots/gateway-panel-healthy-proxy.png) | 故障回退到主路由 | 首次未配置 | | --- | --- | | ![故障回退](docs/screenshots/gateway-panel-fault-direct.png) | ![未配置](docs/screenshots/gateway-panel-paused-initial.png) | 设置分为连接、保活规则、检测与提醒三页,默认只展示当前页需要的选项。 | 连接 | 保活规则 | 检测与提醒 | | --- | --- | --- | | ![连接设置](docs/screenshots/gateway-settings-preview.png) | ![保活规则](docs/screenshots/gateway-settings-rules.png) | ![检测与提醒](docs/screenshots/gateway-settings-detection.png) | ## 运行 使用 Windows x64 与 .NET 10 Desktop Runtime(需自行安装;发布只提供依赖运行时版)。托盘模式会请求管理员权限;只读诊断和预览不提权。 首次运行会看到两次系统提示,都是 Windows 自己弹的,不是程序重复启动: 1. “未知发布者 / 安全警告”:exe 没有代码签名。点“运行”即可;想少一次提示可以先跑 `.\tools\unblock-publish.ps1` 去掉“来自网络”标记,或者给 exe 做代码签名。 2. 用户账户控制(UAC):改路由和 DNS 需要管理员权限。拒绝提权后就无法切换网络。 手动启动时一定会弹出面板(登录任务用 `--minimized` 启动,只驻留托盘),不会再让人以为程序没启动而反复双击。 ### 放在哪个目录运行 程序要改路由和 DNS,会以管理员身份运行,请把它放在自己的用户目录下,例如 `%LOCALAPPDATA%\Programs\GatewayKeepalive\`。 不要从“低完整性”目录(沙箱、共享、被打了 Low 标签的目录,例如本机开发目录 `D:\dsh workspace` 下的产物)启动:Windows 会用低完整性令牌运行那里的 exe,它连自己的 `%LOCALAPPDATA%` 都写不了,登录自启就会停在“Access to the path … is denied”。判断办法是跑一次 `.\GatewayKeepalive.exe --logcheck`,看输出里的“数据目录 … 可写=True/False”和“实际目录”。程序也有兜底:首选日志目录写不了会依次退到 `%LOCALAPPDATA%Low`、`%TEMP%`、`%ProgramData%`,并在日志里写明“日志目录改为 …”,但数据目录(`session.json`、`settings.json`)必须是可写的用户目录。 - 左键图标:显示/隐藏面板;Esc 或点外部:收起面板。 - 自动:按连续阈值和冷却切换;直连/旁路由:固定模式,失败时提示。 - 暂停:继续监测,停止自动改网络。 - 恢复:恢复接管前快照并暂停。存在未完成切换时,先处理那次切换的恢复。 - 默认退出保留当前网络;“退出时恢复”可在设置中开启。 - 设置是独立窗口:在任务栏有按钮,居中打开不会被托盘浮窗挡住;设置开着时点“退出程序”,会先关掉设置再继续退出。 - 登录后启动:创建当前用户的交互式最高权限计划任务(`schtasks` 写入任务 XML,失败回退任务计划 COM,两条路径都读回校验)。程序换了位置后,下次以管理员身份启动会自动把任务改写为新路径,并写日志。 首次设置的示例网关为 `192.168.6.1` / `192.168.6.2`,SOCKS5 端口为 `1070`,请按实际网络调整。旁路由探测默认使用 `www.google.com`;直连探测另用 `www.baidu.com`、`www.microsoft.com`,避免直连无法访问代理目标导致错误回滚。默认各要求至少一个目标成功。 ## 构建与测试 安装 .NET 10 SDK 后运行: ```powershell .\build.ps1 -Test .\build.ps1 -Test -Publish ``` 脚本优先使用 `$env:GATEWAY_DOTNET`、`$env:USERPROFILE\.dotnet-sdk\dotnet.exe`,其次使用 PATH 中的 dotnet。产物在 `artifacts/publish/`,编译与测试不会修改系统网络。 测试不依赖外部 NuGet 包,采用有退出码的控制台测试集,覆盖状态机、故障补偿、外部修改保护、持久化、SOCKS5 分片和 DNS 报文边界;不是用 `dotnet test` 运行。当前结果见 [验证记录](docs/validation.md)。 ## 只读诊断 发布目录的 `diagnostics/GatewayKeepalive.Cli.exe` 不修改网络,也不创建自启任务: ```powershell .\GatewayKeepalive.Cli.exe --diagnose --output report.json .\GatewayKeepalive.Cli.exe --probe --adapter <网卡GUID> .\GatewayKeepalive.Cli.exe --dry-run --adapter <网卡GUID> --proxy .\GatewayKeepalive.Cli.exe --dry-run --adapter <网卡GUID> --direct ``` `--config 路径` 指定 JSON 配置;`--probe` 会发送 DNS / SOCKS5 / TLS 网络请求,仍不会改网关。`--dry-run` 只生成计划。托盘 exe 也支持上述参数与 `--preview 目录`。 ## 数据与恢复 数据位于 `%LocalAppData%\GatewayKeepalive\`:`settings.json`、`session.json`、`switch-journal.json`、`logs/`。JSON 采用临时文件写入、刷新落盘与替换,保留上一版 `.bak`。日志保留 14 天。 路由与 DNS 没有系统级跨操作原子事务。程序写前保存记录,分步写入、读回验证并探测真实 IPv4 TLS 出口;失败时补偿。发现外部修改、陌生网络或补偿失败会停止自动写入。进程被强行终止后,需要下次启动识别未完成记录再恢复;没有独立后台服务替已退出的进程实时修复网络。 接管范围与手动恢复步骤见 [网络行为说明](docs/network-behavior.md)。界面截图在 `artifacts/preview/`(`./build.ps1` 后运行托盘程序 `--preview <目录>` 可重新生成)。