-
Notifications
You must be signed in to change notification settings - Fork 164
-
VPN:通过系统提供的 VPN 服务(TUN 虚拟接口)全局接管流量,将代理作为一个"伪 VPN"使用。不是真正的 VPN。
-
作为一个代理而不是 VPN,显然地仅支持代理 TCP 流和 UDP 数据报,不支持代理 TCP 握手、其他传输层协议(如 SCTP)、网络层协议(如 ICMP)等。
-
ICMP echo 回复和 ICMPv6 echo 回复是伪造的。如果您不喜欢此行为,启用"丢弃 ICMP"以禁用此行为并丢弃 ICMP 与 ICMPv6。
-
-
仅代理:仅启动代理实例,不接管流量。
类似于 SOCKS 或 HTTP CONNECT 的代理是工作在传输层的,而大多数 VPN 是工作在网络层的。为了将代理用作"伪 VPN",需要将网络层的 IP 数据报重组为传输层 TCP 流或 UDP 数据报。
-
gVisor:使用 gVisor netstack 作为用户态网络栈,将 IP 数据报重组为 TCP 流或 UDP 数据报。
-
System:对于 TCP,通过一种头部改写伎俩 [1] [2] [3] 进行两次 NAT,利用操作系统的网络栈将 IP 数据报重组为 TCP 流。对于 UDP,直接解封装 IP 数据报为 UDP 数据报。该 TCP 流重组方法没有一个确切的名称,"system"一词可能是 Clash 发明的。
对于 TCP,发出网络请求的应用以为自己是与目标地址进行 TCP 握手并发送数据,实际上是与代理软件的 gVisor/system 栈进行 TCP 握手并发送数据。然后,代理软件把数据转发给代理服务器;代理服务器与目标地址进行 TCP 握手并把数据转发给目标地址。
"System 栈"需要一个 TCP 监听器以接受目标地址为私有地址的连接。如果存在防火墙机制,需要允许代理软件接受传入连接。同理,如果是 Android 17 上目标 SDK 37 的代理软件,需要授予"附近的设备"权限才能正常使用"System 栈"。
最大传输单元。软件内的默认值为 1500。
-
在实践中,Clash 等软件使用 9000 的 MTU 值仅仅为了在跑分中获得更高的分数,但如此大的 MTU 值可能会造成一些网络传输问题。
-
本软件未考虑大于 16384 的 MTU 值,使用大于 16384 的 MTU 值可能造成未知后果。
使用 gVisor 作为 TCP/IP 栈时启用其抓包功能并转储流量。转储的 PCAP 文件有助于网络分析和故障排查。
仅 Android 10+ 可用。如果启用,将 VPN 标记为按流量计费。如果禁用,VPN 继承上游接口的按流量计费特性。
丢弃 ICMP 和 ICMPv6,而不是伪造 ICMP echo 回复和 ICMPv6 echo 回复。
应用流量统计仅对 VPN 模式下的 TUN 生效。某些中国"安卓"设备魔改了"读取应用列表"的权限,您可能需要在系统设置中或其它地方手动授予该权限。
-
系统:使用系统根证书颁发机构存储。实际行为是仅解析并信任
/system/etc/security/cacerts中的所有系统证书文件。这实际上是 Go 的 bug,而不是预期行为。 -
Mozilla:使用 Mozilla 提供的根证书颁发机构存储[1] [2] 。对于一些缺乏系统更新、无法更新根证书存储的设备有用。
-
系统和用户:使用 Java API(
java.security.KeyStore.getInstance("AndroidCAStore"),0.17.52 起)或手动文件解析(0.17.52 之前)获取系统根证书颁发机构存储。大致行为如下:- 信任
/apex/com.android.conscrypt/cacerts(Android 14 及以上)或/system/etc/security/cacerts(Android 13 及以下)中的系统证书; - 信任
/data/misc/user/[user id]/cacerts-added中用户安装的证书; - 不信任
/data/misc/user/[user id]/cacerts-removed中用户禁用的系统证书。
- 信任
-
自定义:将自定义的
root_store.certs文件(PEM 格式)放置到Android/data/包名/files,或者将其导入为路由资源,以使用自定义的根证书存储。
如果禁用,仅为 VPN 设置 IPv4 地址。如果启用,为 VPN 设置 IPv4 地址和 IPv6 地址。
从 VPN 中排除或包含所选应用。
在"代理"模式下,只有所选应用的流量会被 VPN 处理。在"绕过"模式下,除了所选应用以外的所有流量会被 VPN 处理。
-
许多中国"安卓"设备魔改了"查询所有软件包"(
android.permission.QUERY_ALL_PACKAGES)仅声明权限,破坏了软件的正常行为。您可能需要在系统设置中或其它地方手动授予所谓的"读取应用软件列表"(或其他相似名称,com.android.permission.GET_INSTALLED_APPS)运行时权限。 -
没有"拥有完全的网络访问权限"权限(
android.permission.internet)的应用不会被显示。例如:Gemini(com.google.android.apps.bard)没有联网权限,而是通过名为的"Google"应用(com.google.android.googlequicksearchbox)进行联网。您应该搜索"Google"而不是"Gemini"。 -
多用户支持:Android VPN 仅作用于当前用户。您需要为每一个需要使用本应用的用户单独安装本软件。
-
"分应用 VPN"实际上是"分 UID VPN"。相同 UID(android:sharedUserId)的应用共用是否从 VPN 中包含或排除。因此,用户界面上会有勾选一个则其余都勾选上的效果。
允许应用使用 bindProcessToNetwork 等系统提供的方法自行绕过 VPN。
从 VPN 中排除私有地址。一些局域网通信应用需要启用此选项以工作。若禁用,设置 TUN 路由地址为 0.0.0.0/0、::/0。
如果启用后 LineageOS 等系统的"允许客户端使用 VPN"不工作:点击查看
见 V2Ray 文档"domainStrategy"。
用于使目标地址是域名的流量匹配 IP 规则,却又把域名作为目标地址的扭曲需求。
- 在 TUN 的情形下,目标地址总是 IP 地址。如果您不使用 fake DNS 或"覆盖目标地址"或 HTTP/SOCKS 入站,这些选项几乎没有区别。
V2Ray 中的 sniffing。嗅探流量的域名(从 HTTP Host、TLS SNI、QUIC SNI 中)以及嗅探协议类型。
用于使目标地址是 IP 的流量匹配域名规则的扭曲需求。
如果禁用,通过"流量嗅探"嗅探出的域名仅用于路由选择;如果启用,通过"流量嗅探"嗅探出的域名将作为目标地址。
用于使目标地址是 IP 的流量匹配域名规则,却又把嗅探出的域名作为目标地址的扭曲需求。
- 启用本选项仅当你了解其存在的副作用。这是一些启用后无法工作的例子:Tor、Apple 推送、MTProto。
使用 DNS 嗅探模块劫持不是发往 TUN DNS 地址的 DNS 查询(如 Termux 里的 dig),使其被内置 DNS 模块处理。
-
一些假阳性和假阴性是预期的。该选项未被默认启用。
-
发往 TUN DNS 地址的 DNS 查询始终会被内置 DNS 模块处理。
-
本软件补充了 V2Ray 的内置 DNS 模块,使其可以按照 DNS 规则处理非 A/AAAA DNS 查询。所谓的"nonIPQuery"对本软件毫无意义。
-
本软件补充了 V2Ray 的内置 DNS 模块,使其除系统 DNS 外可以返回正确的 TTL。所谓的"responseTtl"对本软件毫无意义。
对于被代理的流量,如果目标地址是域名,则解析该域名为 IP 地址作为目标地址。
-
在 TUN 的情形下,目标地址总是 IP 地址。如果您不使用 fake DNS 或"覆盖目标地址"或 HTTP/SOCKS 入站,这个选项几乎没有作用。启用 fake DNS 如果您非要这个选项起作用。
-
不要像 SagerNet/sing-box#932 以及链接到的那些重复问题那样报告"偏好 IPv4/偏好 IPv6"不工作。
-
您可能不希望服务端接收到目标地址是域名的 UDP 流量,因为目标地址是域名的 UDP 流量的 NAT 映射行为几乎不可能被正确处理。
对于直连流量,如果目标地址是域名,则解析该域名为 IP 地址作为目标地址。
如果禁用,则由系统通过上游接口 DNS 地址解析域名为 IP 地址。
-
在 TUN 的情形下,目标地址总是 IP 地址。如果您不使用 fake DNS 或"覆盖目标地址"或 HTTP/SOCKS 入站,这个选项几乎没有作用。启用 fake DNS 如果您非要这个选项起作用。
-
不要像 SagerNet/sing-box#932 以及链接到的那些重复问题那样报告"偏好 IPv4/偏好 IPv6"不工作。
如果服务器地址是域名,则解析该域名为 IP 地址再向该 IP 地址发起连接。
如果禁用,则由系统通过上游接口 DNS 地址解析域名为 IP 地址。
用于测试代理连通性的 URL。设置为 HTTPS URL 以避免"机场"劫持流量伪造时延。
- 一些其它软件会使用 HTTP RTT 等数值作为测试结果以取悦用户眼球,并不反映实际体验。
对 TLS Client Hello 进行 TLS 记录分片 或 TCP 分段或两者兼用,可能有助于规避某些地区的 SNI 审查。仅适用于核心支持的协议,不适用于插件。
-
在 2023 年至 2025 年左右,该机制据报告[1] [2] 被一些地区的 SNI 审查豁免,但也会造成极其明显的特征。使用它仅当你知道自己在做什么的话。
-
由于过大的后量子密钥大小导致的过大 TLS Client Hello,Go 标准 TLS 库,以及 uTLS 库,本已不得不对 TLS Client Hello 进行 TCP 分段,但完整的 SNI 仍存在于第一个分段中。
-
不属于 TLS Client Hello 分片但与此有关的是,对于 QUIC 所使用的 TLS 变体,据 2025 年的报告,对 QUIC Client Initial 和其 CRYPTO 帧进行分片和乱序被一些地区的 SNI 审查豁免,尽管这最初是 Chromium quiche 里用于避免协议僵化的所谓"Chaos Protection"。事实上的 Go 标准 QUIC 库 quic-go 已采用该机制。
-
如果不是走投无路的话,不要滥用豁免机制。
对安全性相当于明文(一些人所谓的"裸奔")的配置显示警告。对于被显示警告的配置,传输内容可以被中间人解密。
该选项默认启用,且强烈不推荐禁用。强烈建议不要使用被显示警告的配置。
存在下列的局限性(包含但不限于):
- 如果"密码"用于加密,密码强度未被检查;
- 对于部分协议,不代表无法实行重放攻击;
- 自定义配置未被检查;
- 如果 Shadowsocks 配置使用非 obfs-local(simple-obfs)或 v2ray-plugin 的插件,无法检查;
- 不代表您正在使用代理的事实无法被检测到;
- 不代表如果密码、私钥等被泄露,传输内容仍然无法被解密;
- 不代表如果您的本地环境不安全,传输内容仍然无法被解密;
- 不代表如果本软件有未知的漏洞,传输内容仍然无法被解密;
- 不代表随着科技发展,传输内容仍然无法被将来的技术解密;
- 服务器地址为
localhost、::1、127.0.0.0/8的配置不会被警告不安全,但是如果服务器地址为解析到::1、127.0.0.0/8的域名,则会出现假阳性; - 安全建议被提供是期望它能有所帮助,但不提供任何担保。
格式:每行一个。没有并发查询。
支持的 DNS 服务器类型:
| 格式 | 说明 | 绕过路由组件 |
|---|---|---|
host(域名或 IP) |
使用 53 端口的 UDP DNS | |
udp://host[:port] |
UDP DNS | |
udp+local://host[:port] |
UDP DNS | ✓ |
tcp://host[:port] |
TCP DNS | |
tcp+local://host[:port] |
TCP DNS | ✓ |
https://[username:password]@host[:port]/dns-query |
DNS over HTTPS(仅 HTTP/1.1 和 HTTP/2) | |
https+local://[username:password]@host[:port]/dns-query |
DNS over HTTPS(仅 HTTP/1.1 和 HTTP/2) | ✓ |
quic://host[:port] |
DNS over QUIC | |
quic+local://host[:port] |
DNS over QUIC | ✓ |
tls://host[:port] |
DNS over TLS | |
tls+local://host[:port] |
DNS over TLS | ✓ |
h3://[username:password]@host[:port]/dns-query |
DNS over HTTPS(仅 HTTP/3) | |
h3+local://[username:password]@host[:port]/dns-query |
DNS over HTTPS(仅 HTTP/3) | ✓ |
| 使用系统 DNS | 使用系统 API,通过上游接口 DNS 地址进行 DNS 查询。系统 DNS 查询非 A/AAAA 仅支持 Android 10+。如果是 Android 9 或以下,将对非 A/AAAA 查询返回"未实现(NOTIMP)"。 | ✓ |
某些是本软件添加而不是存在于原始 V2Ray 中。
-
EDNS 客户端 IP:填入一个有效的 IP 地址。根据 V2Ray 源码,IPv4 将使用
/24的 CIDR,IPv6 将使用/96的 CIDR。 -
远程/直连 DNS 解析策略:
-
这显然地仅适用于明文可劫持的 A/AAAA 查询。
-
用于控制 DNS 解析所谓的"IP 地址偏好"的扭曲需求。
-
"UseIPv4" 将始终对 AAAA 查询返回空解析(NOERROR),"UseIPv6" 将始终对 A 查询返回空解析(NOERROR)。
-
没有
PreferIPv4、PreferIPv6。不要像 SagerNet/sing-box#932 那样报告"偏好 IPv4/偏好 IPv6"不工作。
-
-
若远程 DNS 为域名,该域名由直连 DNS 解析;若直连 DNS 为域名且不带
+local且启用"解析目标地址",该域名由 Bootstrap DNS 解析。Bootstrap DNS 仅能填写 IP 地址的 DNS 或者带+local的 DNS。 -
域名重写:"hosts"。解析指定的域名为指定的 IP 地址并伪造回复。这显然地仅适用于明文可劫持的 A/AAAA 查询。格式如下。
example.com 127.0.0.1 127.0.0.2 www.example.com 127.0.0.1 www1.example.com www2.example.com -
启用 DNS 路由:若启用,路由中绕过的域名由直连 DNS 解析,代理的域名由远程 DNS 解析;若禁用,绕过和代理的域名均由远程 DNS 解析。但是,为了避免回环,代理服务器地址总是由系统 DNS 或直连 DNS 解析。
-
启用 fake DNS:使用"fake DNS"本地伪造 DNS 回复以消灭由 DNS 查询所带来的 RTT。伪造出的对每个域名唯一的"fake IP"地址将在连接时被还原为域名。
- 这显然地仅适用于明文可劫持的 A/AAAA 查询。
- 这也用于使目标地址是 IP 的流量匹配域名规则以及可选的把还原出的域名作为目标地址的扭曲需求。
- 这也用于控制 DNS 解析"IP 地址偏好"的扭曲需求。
- 您应该对计算机网络有足够的认识,了解 fake DNS 的数不清的副作用和局限性。这些问题包含但不限于:破坏依赖正确的 DNS 回复以工作的应用;破坏 UDP NAT 映射行为;破坏代理中的代理。
启用一个监听在 TCP 与 UDP 127.0.0.1(如果允许来自局域网的连接,则监听在 ::)的 SOCKS 入站。
一些应用可以显式配置使用 SOCKS 代理。
SOCKS5 UDP 缺乏鉴权机制。如果启用 UDP 支持,用户名密码认证总是可以被绕过。
如果未启用用户名密码认证,该 SOCKS5 入站兼容 SOCKS4 和 SOCKS4A。
启用一个监听在 TCP 127.0.0.1(如果允许来自局域网的连接,则监听在 ::)的 HTTP 入站。
一些应用可以显式配置使用 HTTP 代理。
仅 Android 10+ 可用。仅未启用 Basic 认证时可用。部分应用会遵循附加到 VPN 的 HTTP 代理,它们的流量不会经过 TUN 接口。
- 部分应用(知乎、京东、讯飞等)检测到被附加的 HTTP 代理会拒绝正常工作,您可以在"HTTP 代理例外列表"中添加它们的域名(每行一个)。更好的方法是在"分应用 VPN" 中绕过它们。
启用一个用于 Netfilter REDIRECT 的监听在 TCP 127.0.0.1 与 ::1(如果允许来自局域网的连接,则监听在 ::)的入站。
你需要使用 iptables DNAT/REDIRECT 把 TCP 流量重定向到透明代理端口。
不支持 TPROXY,因为其需要以 root 特权运行 JNI 代码。这需要使用 Magisk/KernelSU 等 root 解决方案的透明代理模块。
启用一个监听在 TCP 与 UDP 127.0.0.1(如果允许来自局域网的连接,则监听在 ::)的 DNS 请求转发器。
将监听地址设置为 ::(这在 Go 中是双栈的)而不是 127.0.0.1,以允许其他设备主动地配置 SOCKS 或 HTTP 代理通过本设备连接代理服务器。
这不意味着其他设备的流量会通过热点无感知地通过您的代理。除非您设备的系统支持"VPN 共享"(未经修改的 Android 系统不支持),这需要使用 VPN Hotspot(需要 root)以达成。
在网络变化(如 Wi-Fi 接入点之间切换、数据网络与 Wi-Fi 之间切换)时打断现有连接,以缓解一些因为连接复用或多路复用导致的错误使用已无法使用的旧连接的问题。该选项仅对这些连接复用或多路复用的协议有效(不包括由插件实现的协议):
- HTTP/2、HTTP/3、SSH、WireGuard、AnyTLS、Hysteria 2、TUIC、Juicity、mieru
- 带下列"传输层"的协议:HTTP(或称 H2)、gRPC、QUIC、Hysteria 2、XHTTP(仅在使用 HTTP/2 或 HTTP/3 时)
- 启用了 Mux.Cool 或 sing-mux 的协议
- UDP DNS、DNS over HTTPS、DNS over HTTP/3、DNS over QUIC
DNS over TCP 与 DNS over TLS 虽然可以连接复用,但本软件未实现。一些 UDP/QUIC 类协议包含在内,是因为可能会由 UDP over TCP 的协议承载。
不建议禁用该选项。该选项在未来可能会被强制启用并移除。
不使用 getInstalledPackages 或 getInstalledApplications 查询已安装软件包,而是添加
<queries>
<intent>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent>
</queries>
并使用 getPackagesHoldingPermissions 查询具有"拥有完全的网络访问权限"权限(android.permission.internet)的软件包。此方法不需要 android.permission.QUERY_ALL_PACKAGES 权限或所谓的 com.android.permission.GET_INSTALLED_APPS 权限,以规避一些应用商店(例如:Google Play 商店)对 android.permission.QUERY_ALL_PACKAGES 权限的一刀切管制(甚至禁止合理使用)和许多中国"安卓"设备对 android.permission.QUERY_ALL_PACKAGES 权限以所谓的"保护用户隐私"为幌子进行的蓄意破坏。
该方法的输出结果可能不会与 getInstalledPackages 或 getInstalledApplications 完全一致。切勿启用如果您没有遇到无法查询已安装软件包的问题。