Skip to content
This repository has been archived by the owner on Nov 3, 2023. It is now read-only.

[Feature] 支持在使用拨号连接(VPN)时正确设置 Windows 系统代理 #833

Closed
Mythologyli opened this issue Oct 17, 2023 · 4 comments · Fixed by zzzgydi/sysproxy-rs#3
Labels
enhancement New feature or request

Comments

@Mythologyli
Copy link

Mythologyli commented Oct 17, 2023

Is your feature request related to a problem? Please describe.
当前版本处理 Windows 系统代理的方式过于简单,无法在使用拨号连接(例如 L2TP VPN)时正确设置系统代理

已经有用户反馈过此问题,见 #412

目前 clash verge 处理 Windows 系统代理的核心代码如下:
https://github.com/zzzgydi/sysproxy-rs/blob/41c765d8ad55f307521716771a990d2aa5f4b5df/src/windows.rs#L42

cur_var.set_value("ProxyEnable", &enable)?;
cur_var.set_value("ProxyServer", &server)?;
cur_var.set_value("ProxyOverride", &bypass)?;

这一方法可以在使用路由器等无需拨号的环境下正常修改系统代理设置。但 Windows 对于 L2TP VPN 等拨号连接的代理设置是独立的,储存在 HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\Internet Settings\Connections

对应的 GUI 设置方法为:Internet 选项 - 连接
image

在注册表中,代理设置以二进制形式存储:
image

由于拨号连接的设置是独立的,此时更改 HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\Internet Settings 中的设置对 HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\Internet Settings\Connections 无效

可以参考:https://myth.cx/p/windows-proxy/

Describe the solution you'd like
考察了三个较为流行的客户端:

  • Clash for Windows:可以正确处理此情况
  • v2rayN:可以正确处理此情况
  • clashN:可以正确处理此情况

以上三个都调用了:https://github.com/Noisyfox/sysproxy

C++ API 的实现可以参考:https://github.com/Mythologyli/ZJU-Connect-for-Windows/blob/e7e6cbaaffb425e850a1580b46c9a552b48148c1/utils/utils.cpp#L48

也有一个 rust 的实现作为参考(不过这个只处理了默认连接):https://github.com/vbfox/proxyconf/blob/master/src/proxyconf/internet_settings/modern/registry.rs

@Mythologyli Mythologyli added the enhancement New feature or request label Oct 17, 2023
@Mythologyli
Copy link
Author

吐槽一下 Windows 在代理方面的混乱:光是代理设置就分了 IE 代理设置(浏览器和大多数应用)和 WinHttp 代理设置,然后每个拨号连接的 IE 代理设置又是独立的,并且没法用设置 - 网络和 Internet - 代理去统一修改

辛苦作者了~

@Mythologyli
Copy link
Author

事实上我找到这个例子也不能正确处理拨号连接的情况:
https://github.com/vbfox/proxyconf/blob/master/src/proxyconf/internet_settings/modern/registry.rs

const KEY_PATH: &str =
    "SOFTWARE\\Microsoft\\Windows\\CurrentVersion\\Internet Settings\\Connections";
const KEY_PATH_WOW6432: &str =
    "SOFTWARE\\WOW6432Node\\Microsoft\\Windows\\CurrentVersion\\Internet Settings\\Connections";
pub const DEFAULT_CONNECTION_NAME: &str = "DefaultConnectionSettings";
pub const WINHTTP_CONNECTION_NAME: &str = "WinHttpSettings";

这个项目只处理了 Connections 下的 DefaultConnectionSettings 和 WinHttpSettings 两个键,但当存在拨号连接的时候会有更多键,必须进行设置

而且不能删除图中的 ZJUVPN 键从而使用默认值——系统会重新创建这个键

@Mythologyli
Copy link
Author

也许可以直接调用这个来实现:
https://github.com/Noisyfox/sysproxy

@ashengstd
Copy link

完美复现问题了,等待作者解决

Sign up for free to subscribe to this conversation on GitHub. Already have an account? Sign in.
Labels
enhancement New feature or request
Projects
None yet
Development

Successfully merging a pull request may close this issue.

2 participants