零隧道 · 零污染 · 零干预 —— 本地代理转换管理程序
YLproxy 是一款运行在 Windows 平台上的桌面 GUI 应用程序(基于 .NET / WPF),它的核心职能是:将需要用户名密码认证的远程 HTTP 代理,转换为本地不需要认证的 HTTP 代理端口,供模拟器、游戏客户端、浏览器扩展等软件使用。
典型场景:
模拟器/软件 → 127.0.0.1:9001(无需认证) ↓ YLproxy 本地代理转换 ↓ 第三方 HTTP 认证代理(需认证) ↓ 目标网站
一句话定义: 在网络环境受限于认证代理时,为无法配置认证的软件提供一条干净的代理出路。
设计原则:
- 零系统入侵 — 不修改系统路由、DNS、网络适配器或注册表
- 进程级隔离 — 只有主动设置使用本地端口的程序经过代理,系统其余流量不受影响
- 开箱即用 — 输入远程代理信息 → 测试 → 启动,三步完成
在许多企业、校园或受限网络环境中,访问外部网络必须通过一个需要用户名 + 密码认证的 HTTP 代理。然而大量软件(尤其是模拟器、老旧游戏、命令行工具、IoT 调试器)不支持代理认证配置,只支持填写 IP 和端口。这导致这些软件在上述网络中无法正常工作。
- 模拟器(如 MuMu、雷电、BlueStacks)无法配置认证代理 → 通过 YLproxy 分配本地端口即可使用
- 需要代理的网络环境,但不希望全局代理影响微信、浏览器等已有正常流量
- 多个软件需要走不同的代理出口时,为每个应用分配独立端口
- 一个稳定的 Windows 桌面程序,安装后双击即用
- 支持多代理配置管理与独立启停
- 后台进程监控,代理异常自动感知
- 清晰的图形界面,零命令行操作
- (远期)支持 REST API 远程管理与 SQLite 持久化
| 项目 | 值 |
|---|---|
| 操作系统 | Windows 10 / Windows 11(x64) |
| 运行时 | .NET 10.0 SDK / Runtime(global.json 基线 10.0.200,rollForward=latestMinor) |
| 代理引擎 | 3proxy 0.9.7(由 scripts/prepare-runtime.ps1 准备) |
| 开发工具 | Visual Studio 2022+ / VS Code |
| 版本 | 0.2.0(Phase 7) |
| 最后更新 | 2026-07-22 |
YLproxy/ ├── .agent # 第一必读文件,规则与文件放置约束 ├── AppSettings.json # 全局运行配置(本地生成,从 AppSettings.example.json 复制) ├── global.json # .NET SDK 版本约束(10.0.301) ├── YLproxy.sln # 唯一解决方案入口 ├── .github/ # GitHub Copilot/Agent 配置 ├── .vscode/ # VS Code 调试、任务与编辑器配置 │ ├── src/ # —————— 源代码 —————— │ ├── YLproxy.Models/ # 数据模型层:ProxyItem、ProxyStatus、代理数据模型 │ ├── YLproxy.Utils/ # 通用工具层:PathResolver 等路径/基础工具 │ ├── YLproxy.Core/ # 核心业务逻辑层 │ │ ├── Config/ProxyDataService.cs # data/config.json 加载/保存 │ │ ├── ProxyTester.cs # 代理连通性测试(HTTP 请求 + 延迟测量) │ │ └── MonitorService.cs # 按 AppSettings 轮询监控代理进程状态 │ ├── YLproxy.Infrastructure/ # 全局配置与日志基础设施 │ ├── YLproxy.Proxy/ # 3proxy 集成层 │ │ ├── ConfigGenerator.cs # 动态生成 3proxy .cfg 配置文件 │ │ ├── ProxyProcessManager.cs # 3proxy 进程启动/停止/状态检测 │ │ └── ProxyRuntimeConfiguration.cs # 运行目录/DLL 配置桥接 │ └── YLproxy.GUI/ # WPF 图形界面层(MVVM 架构) │ ├── MainWindow.xaml # 主窗口 │ ├── ViewModelBase.cs # MVVM ViewModel 基类(INotifyPropertyChanged) │ ├── RelayCommand.cs # 命令绑定实现 │ ├── MainViewModel.cs # 主界面 ViewModel │ ├── Views/MainView.xaml # 主界面布局(信息区、操作区、代理列表、日志) │ └── Views/AddProxyWindow.xaml # 添加代理弹窗(表单校验、端口分配) │ ├── runtime/ # —————— 运行时依赖 —————— │ └── 3proxy/ # 3proxy 代理引擎及其运行数据 │ ├── bin64/ # 本地准备的 3proxy.exe 与 DLL(不提交) │ ├── cfg/ # 生成的 {Proxy.Id}.cfg 文件(不提交) │ └── logs/ # 3proxy 自身日志(不提交) │ ├── data/ # —————— 用户数据目录 —————— │ ├── config.example.json # 脱敏配置模板(提交到仓库) │ └── config.json # 代理配置持久化 JSON(本地生成,被 Git 忽略) │ ├── logs/ # —————— 日志目录(运行时生成) —————— │ ├── docs/ # —————— 项目文档 —————— │ ├── INDEX.md # 文档中心入口 │ ├── pending/ # 待执行任务和计划 │ ├── incomplete/ # 待完善领域和规划 │ ├── deployed/ # 已完成部署和发布 │ ├── issues/ # 已知问题和缺陷 │ ├── risks/ # 风险评估和缓解措施 │ └── development/ # 开发指南和参考文档 │ ├── tests/ # —————— 测试代码 —————— │ ├── YLproxy.Tests.csproj # 测试项目 │ ├── UnitTest1.cs # 单元测试 │ └── PathResolverTests.cs # 路径解析测试 │ ├── build/ # —————— 构建脚本与产物(预留) —————— │ └── .gitignore # Git 忽略规则
路径约定:开发运行和发布运行都以应用根目录为相对路径基准。AppSettings.json 只放在应用根目录;代理数据只放在 data/config.json;应用日志只放在 logs/;3proxy 生成配置和引擎日志分别放在 runtime/3proxy/cfg/ 与 runtime/3proxy/logs/。禁止在 src/ 下创建 data/、logs/ 或 runtime/ 作为运行时数据目录。
| 类别 | 名称/库 | 版本要求 | 用途 |
|---|---|---|---|
| 框架 | .NET SDK | ≥ 10.0 | 运行时与编译基础 |
| UI 框架 | WPF(Windows Presentation Foundation) | .NET 10.0 | 桌面图形界面 |
| 架构模式 | MVVM | — | ViewModelBase / RelayCommand |
| 代理引擎 | 3proxy | 0.9.7(脚本下载) | 本地代理进程 |
| IDE | Visual Studio 2022+ / VS Code | — | 开发与调试 |
| 包管理器 | NuGet | — | 依赖管理 |
无需外部数据库、无需 Docker、无需 Web 服务器。
AppSettings.json 位于项目根目录,是应用全局配置的唯一入口。注意:此文件为本地配置文件,已被 Git 忽略,不应直接提交到仓库。
应用首次启动时会自动创建 AppSettings.json(使用代码默认值),无需手动准备。如果需要自定义配置:
# 方式一:从模板复制
Copy-Item AppSettings.example.json AppSettings.json
# 方式二:使用环境初始化脚本(推荐)
# 该脚本还会安装 Git hooks 等开发基础设施
pwsh -NoProfile -ExecutionPolicy Bypass -File .\scripts\init-environment.ps1
# 方式三:应用首次启动自动生成(最简单)
dotnet run --project src/YLproxy.GUIAppSettings.json已加入.gitignore,不会被意外提交- Git pre-commit 钩子(
.githooks/pre-commit)会在提交时检查是否误将敏感文件纳入暂存区 - 使用
scripts/init-environment.ps1 -InstallHooks安装钩子后即可生效
模板文件 AppSettings.example.json 包含默认配置结构,不含敏感信息:
{
"Logging": {
"LogDirectory": "logs",
"RetentionDays": 30,
"MinLevel": "Info"
},
"Proxy": {
"DataDirectory": "data",
"ConfigFileName": "config.json",
"PortRangeStart": 9001,
"PortRangeEnd": 9099,
"CheckIntervalSeconds": 5
},
"ThreeProxy": {
"RuntimeDirectory": "runtime/3proxy",
"RequiredDlls": ["FilePlugin.dll", "StringsPlugin.dll"]
},
"Api": {
"Port": 9100,
"AccessToken": ""
},
"Startup": {
"AutoStart": false
}
}代理数据以对象形式保存,仓库只提供不含凭据的 data/config.example.json 模板:
{
"Proxies": [
{
"Id": 1,
"Name": "示例代理",
"RemoteHost": "proxy.example.com",
"RemotePort": 8080,
"Username": "dpapi:v1:<Windows 当前用户密文>",
"Password": "dpapi:v1:<Windows 当前用户密文>",
"LocalHost": "127.0.0.1",
"LocalPort": 9001,
"Status": "Stopped"
}
]
}Username 和 Password 由 Windows DPAPI 以当前用户作用域加密保存。旧明文配置迁移命令为:
pwsh -NoProfile -ExecutionPolicy Bypass -File .\scripts\migrate-proxy-data.ps1 -Apply密文不能直接复制到其他 Windows 用户或计算机;迁移前应使用脚本提供的回滚机制并重新录入凭据。
powershell
git clone https://github.com/lygg6699/YLproxy.git cd YLproxy
pwsh -NoProfile -ExecutionPolicy Bypass -File .\scripts\prepare-runtime.ps1
dotnet build YLproxy.sln
dotnet run --project src/YLproxy.GUI
或双击 src/YLproxy.GUI/bin/Debug/net10.0-windows/YLproxy.GUI.exe 直接运行。
首次启动会在 data/config.json 中创建本机配置。该文件包含代理凭据,已被 Git 忽略;仓库不提交。
仓库只提供脱敏配置模板 data/config.example.json,不要把包含真实凭据的配置强制加入提交。
AppSettings.json 是应用全局配置的本地文件,已被 Git 忽略,应用首次启动时会自动创建(使用代码默认值),无需手动准备。
- 点击「添加代理」→ 弹出窗口
- 填写:代理名称、远程主机、端口、用户名、密码
- 点击「确定」→ 自动分配本地端口(9001 起)
- 在列表中选中该代理 → 点击「测试」
- 测试通过后 → 点击「启动」
- 在模拟器/目标软件中设置 HTTP 代理为 127.0.0.1:9001
powershell
curl -x http://127.0.0.1:9001 http://ip-api.com/json
Invoke-WebRequest -Uri http://ip-api.com/json -Proxy http://127.0.0.1:9001
模拟器(如 MuMu/雷电)WiFi 设置: ┌────────────────────────────┐ │ 代理:手动 │ │ 主机名:127.0.0.1 │ │ 端口:9001 │ │ 认证:无 │ └────────────────────────────┘ ↓ YLproxy 已启动代理「办公代理」(127.0.0.1:9001) ↓ 远程认证代理 → 目标网站
POST /api/proxy/{id}/start
POST /api/proxy/{id}/stop
POST /api/proxy/{id}/test
GET /api/proxy
┌─────────────────────────────────────────────────┐ │ 你的电脑 │ │ │ │ 模拟器 ──→ 127.0.0.1:9001 ──→ 认证代理 ──→ 外网 │ │ │ │ 浏览器 ──→ 直连(不走代理,不受影响) │ │ │ │ 微信 ──→ 直连(不走代理,不受影响) │ │ │ │ 游戏 ──→ 直连(不走代理,不受影响) │ └─────────────────────────────────────────────────┘
YLproxy 只影响 那些显式配置了使用本地代理端口的进程。系统全局网络不受任何影响。
应用日志默认保存在 logs/ 目录,3proxy 引擎日志保存在 runtime/3proxy/logs/。使用以下策略自动控制日志增长:
# 手动执行日志清理
pwsh -NoProfile -ExecutionPolicy Bypass -File .\scripts\cleanup-logs.ps1
# 预览模式(查看将要删除的文件,不实际删除)
pwsh -NoProfile -ExecutionPolicy Bypass -File .\scripts\cleanup-logs.ps1 -WhatIf| 策略 | 默认值 | 配置位置 |
|---|---|---|
| 应用日志保留天数 | 30 天 | AppSettings.json → Logging.RetentionDays |
| 应用日志大小上限 | 100 MB | scripts/cleanup-logs.ps1 -MaxSizeMB |
| 3proxy 日志保留天数 | 7 天 | scripts/cleanup-logs.ps1 -ProxyLogMaxAgeDays |
如需定时自动清理,可以管理员身份注册计划任务:
# 注册每日 02:00 自动清理
pwsh -NoProfile -ExecutionPolicy Bypass -File .\scripts\init-environment.ps1 -InstallScheduledTask
# 卸载计划任务
pwsh -NoProfile -ExecutionPolicy Bypass -File .\scripts\init-environment.ps1 -UninstallScheduledTaskscripts/init-environment.ps1 提供一键安装 Git pre-commit 钩子的功能,用于防止敏感文件被意外提交:
# 安装 Git 钩子(无需管理员权限)
pwsh -NoProfile -ExecutionPolicy Bypass -File .\scripts\init-environment.ps1 -InstallHooks安装后,执行 git commit 时会自动检查暂存区是否包含以下敏感文件:
AppSettings.json— 全局运行配置data/config.json— 代理数据(含 DPAPI 加密凭据)*.pem、*.key、*.pfx— 私钥和证书文件
如需绕过检查(仅在确认安全时):git commit --no-verify -m "message"
首次克隆项目后,建议执行一次完整环境初始化:
# 一次性完成:安装 Git 钩子 + 注册日志清理计划任务
pwsh -NoProfile -ExecutionPolicy Bypass -File .\scripts\init-environment.ps1# 清理所有项目的 bin/ 和 obj/ 目录
dotnet clean
# 或使用验证脚本包含清理步骤
pwsh -NoProfile -ExecutionPolicy Bypass -File .\scripts\validate-workspace.ps1powershell
dotnet build YLproxy.sln
dotnet test tests/YLproxy.Tests.csproj
dotnet publish src/YLproxy.GUI -c Release -r win-x64 --self-contained true
本仓库的 .devcontainer/devcontainer.json 面向 Codespaces:容器中用于 还原/编译/运行单元测试(WPF GUI 仅能在 Windows 上运行)。
- 端口转发:
forwardPorts设置为 9100(YLproxy API)与 9001(本地代理起始端口)。 - HTTPS 开发证书:明确关闭
DOTNET_GENERATE_ASPNET_CERTIFICATE(当前不生成 ASP.NET Core 开发证书)。如未来需要 HTTPS,可在 devcontainer 中开启并同步对外端口策略。
若终端出现异常中文乱码串,表示命令输出编码与终端解码不一致。
本仓库已在 .vscode/settings.json 中固定 DOTNET_CLI_UI_LANGUAGE=en-US,建议在 VS Code 终端内执行 dotnet 命令。