
检测方案有很多,这里讲解一个有趣的。
由于大部分 socks5 代理只转发数据,不转发 TCP 头,因此后端返回数据时附带一个特殊的 TCP 头,然后前端验证该头是否生效,即可推断否是存在代理。
例如后端下发 tcpwin=0 的控制信息,正常情况下前端收到后不会再往外发包,数据累计在协议栈缓冲区里;而有代理的情况下,数据被累积在了代理服务的缓冲区,前端仍能往代理服务发包,缓冲区不会有累积。至于缓冲区是否满,可通过 WebSocket 的 bufferAmount 属性检测。
Demo: www.etherdream.com/proxy-detect/tcpwin.html
实现也很简单,查看 github.com/EtherDream/web-frontend-magic
有不准确的情况可反馈。
1 Trim21 2021 年 10 月 17 日 via Android 手机试了下,挂没挂代理都是 true |
2 XhstormR02 2021 年 10 月 17 日 via Android Android vpn 试了有效 |
3 ZeroClover 2021 年 10 月 17 日 对移动设备似乎无效。 虚拟网卡类型的代理似乎也能检测出来。 |
4 liuzhiyong 2021 年 10 月 17 日 via Android 安卓上面有效,强。 |
5 ClarkAbe 2021 年 10 月 17 日 大佬本人? |
6 iqoo OP 理论上 VPN 是无效的,只有 http/socks 有效 |
7 Tink PRO 厉害了,路由器 clash fq 有效 |
9 heiher 2021 年 10 月 17 日 有两个问题: 1. tcpwin=0 时,用户态 send 的数据也可以在内核的 TCP 栈上部分缓冲,缓冲空间有多大不同系统可能不同,影响判断精度不? 2. socks5 代理服务器也可以缓冲很小的,与问题 1 还是不太好区分? |
10 lekai63 2021 年 10 月 17 日 via iPhone loon 测了下。 被识别出来了 |
11 iqoo OP |
12 NewYear 2021 年 10 月 18 日 win10 firefox 无效 |
15 scyuns 2021 年 10 月 18 日 4G 开流量看也是 true 呀 |
17 BQsummer 2021 年 10 月 20 日 mac big sur, clash, ss, chrome 无效 |
18 imxieke 2021 年 10 月 23 日 via iPhone ios 15 无效 结果都一样 |
19 imxieke 2021 年 10 月 23 日 via iPhone shadowrocket |
20 hanssx 2023 年 10 月 12 日 这个需要等好久吗?一直显示 status: ... 也没发现有未完成的包? |
21 hanssx 2023 年 10 月 12 日 看到了,ws server 关了应该是 |