检测方案有很多,这里讲解一个有趣的。
由于大部分 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 17:31:43 +08:00 via Android
手机试了下,挂没挂代理都是 true
|
2
XhstormR02 2021-10-17 18:26:15 +08:00 via Android
Android vpn 试了有效
|
3
ZeroClover 2021-10-17 18:39:34 +08:00
对移动设备似乎无效。
虚拟网卡类型的代理似乎也能检测出来。 |
4
liuzhiyong 2021-10-17 18:49:09 +08:00 via Android
安卓上面有效,强。
|
5
ClarkAbe 2021-10-17 19:40:48 +08:00
大佬本人?
|
6
iqoo OP 理论上 VPN 是无效的,只有 http/socks 有效
|
7
Tink 2021-10-17 20:06:40 +08:00 via Android
厉害了,路由器 clash fq 有效
|
9
heiher 2021-10-17 21:18:44 +08:00
有两个问题:
1. tcpwin=0 时,用户态 send 的数据也可以在内核的 TCP 栈上部分缓冲,缓冲空间有多大不同系统可能不同,影响判断精度不? 2. socks5 代理服务器也可以缓冲很小的,与问题 1 还是不太好区分? |
10
lekai63 2021-10-17 21:58:51 +08:00 via iPhone
loon 测了下。 被识别出来了
|
11
iqoo OP |
12
NewYear 2021-10-18 09:15:10 +08:00
win10 firefox 无效
|
15
scyuns 2021-10-18 13:46:17 +08:00
4G 开流量看也是 true 呀
|
17
BQsummer 2021-10-20 16:22:53 +08:00
mac big sur, clash, ss, chrome 无效
|
18
imxieke 2021-10-23 05:13:35 +08:00 via iPhone
ios 15 无效 结果都一样
|
19
imxieke 2021-10-23 05:14:08 +08:00 via iPhone
shadowrocket
|
20
hanssx 2023-10-12 14:07:02 +08:00
这个需要等好久吗?一直显示 status: ...
也没发现有未完成的包? |
21
hanssx 2023-10-12 14:13:35 +08:00
看到了,ws server 关了应该是
|