使用 win2socks + v2ray 开启全局代理
为了实现全匿名科学上网,实现无限接近真正全局代理的模式,考虑使用 tun 模式。具体使用方法如下:
- 先用 v2ray 在本地开启一个 socks5 代理,并打开 udp 模式,设置回环地址(因为后面需要开另一个网卡,所以需要将返回的流量数据走真实地址)。具体配置稍后会给出参考。
- v2ray 启动后,使用 win2socks 在本地开启一个虚拟网卡,并修改路由规则使所有流量全部拦截并走虚拟网卡,再对虚拟网卡配置 v2ray 开启的代理,实现全局科学上网。
前置准备与预备知识
win2socks 下载地址:https://github.com/xjasonlyu/tun2socks/releases
wintun.dll 下载地址:https://www.wintun.net
v2ray 下载地址:https://github.com/v2fly/v2ray-core/releases
v2ray 的 config.json 配置参考:
{
"inbounds": [
{
"tag": "socks",
"port": 这里写你自己想监听的本地代理端口,
"listen": "0.0.0.0",
"protocol": "socks",
"sniffing": {
"enabled": true,
"destOverride": [
"http",
"tls"
],
"routeOnly": false
},
"settings": {
"auth": "noauth",
"udp": true,
"ip": 写本地真实物理网卡ip,
"allowTransparent": false
}
}
],
"outbounds": [
{
"tag": "proxy",
"protocol": "vmess",
"settings": {
"vnext": [
{
"address": 你自己的代理ip地址,
"port": 你自己的代理端口,
"users": [
{
"id": 我这是vmess协议,所以有这个uuid,
"alterId": 0,
"email": "t@t.tt",
"security": "auto"
}
]
}
]
},
"streamSettings": {
"network": "tcp"
},
"mux": {
"enabled": false,
"concurrency": -1
}
},
{
"tag": "direct",
"protocol": "freedom",
"settings": {}
},
{
"tag": "block",
"protocol": "blackhole",
"settings": {
"response": {
"type": "http"
}
}
}
],
"dns": {
"servers": [
"1.1.1.1",
"8.8.8.8"
]
},
"routing": {
"domainStrategy": "AsIs",
"rules": [
{
"type": "field",
"inboundTag": [
"api"
],
"outboundTag": "api"
},
{
"type": "field",
"outboundTag": "direct",
"domain": [
"domain:example-example.com",
"domain:example-example2.com"
]
},
{
"type": "field",
"outboundTag": "block",
"domain": [
"geosite:category-ads-all"
]
},
{
"type": "field",
"outboundTag": "direct",
"domain": [
"geosite:cn"
]
},
{
"type": "field",
"outboundTag": "direct",
"ip": [
"geoip:private",
"geoip:cn"
]
}
]
}
}
有些配置是可以删掉的,但是我懒得试了。如果有好心人可以试完将最简格式发我,那可真是太棒啦!
然后就是关于路由的预备知识(应该很多人都懂,但还是提一嘴)。要在 cmd 中输入命令哦!
先来盘开胃菜,在命令行输入 ipconfig
会输出很多以太网信息,这里只展示一个。Ethernet0 表示的是这个以太网的网卡名称。
然后是正餐,在命令行输入 route print ,打印出路由表
我们只要关心中间这一坨 “IPv4 路由表” 的信息就行。
里面的目标网络、网关、接口、跃点数都是我们需要关注的东西。
目标网络为 0.0.0.0 则表示拦截所有流量走对应接口出去,而网关则表示这个接口的出口。
跃点数是一个很重要的东西,如果同时存在两个不同的接口规则对应同一个目标网络,那么流量应该如何抉择呢?这时候就会看 跃点数。
跃点数 越低,则优先级越高,也就是流量实际走的地方。
具体实现
以下命令都必须要管理员权限开启的 cmd !
开三个管理员 cmd 窗口(一个给 win2socks,一个给 v2ray,一个改路由表)
- v2ray.exe run -c test.json (我的 test.json 是我配置文件的名称,如果你是 config.json 就直接 v2ray.exe 运行即可)
- tun2socks-windows-amd64.exe -device wintun -proxy socks5://127.0.0.1:33001(我这里开启的 v2ray 监听端口是 33001,记得改成自己的监听端口)
- netsh interface ip set address name="wintun" source=static addr=192.168.123.1 mask=255.255.255.0 gateway=none(这里无需改动,直接复制过去即可)
- route add 0.0.0.0 mask 0.0.0.0 192.168.123.1 metric 5(这里有点要注意,如果你是 win7 就把 5 改成 4。因为 win7 有的版本默认路由的跃点数就是 5 的基数,如果你这也是 5 他就还是走原来的物理网卡)
- route add 你的代理ip地址 你的默认网关ip地址(这一步是放行所有走代理的流量,不然会造成 流量->虚拟网卡->代理->虚拟网卡->代理 的死循环)
- netsh interface ip set dns "wintun" source=static addr=8.8.8.8(这一步是将虚拟网卡的 dns 地址改成国际通用地址,因为有些电脑会出现 dns 劫持的情况,导致无法科学上网)
至此,所有配置均已完成。如果不放心的话可以打印路由表瞅瞅,此时应该类似下图:
你会发现有两个 0.0.0.0 的路由规则,但是我们虚拟网卡(192.168.123.1)的跃点数更低。然后还会发现我们多了一条让代理走原先物理网卡的默认网关的规则。
可能各个版本的路由表输出有点差异,但是无伤大雅。此时应该是可以完成全局代理了。
问题汇总
命令全部正常,但是无法科学上网
建议在 cmd 输出路由表(route print),看看虚拟网卡的跃点数是不是最低的。然后再看看有没有放行代理ip走原来的默认网卡。如果都正常的话,在执行 curl ip.gs 。如果能正确输出你的代理ip,说明是你的 dns 被劫持了,再次尝试更改虚拟网卡的 dns:netsh interface ip set dns "wintun" source=static addr=8.8.8.8
win7 x64 无法启动 tun2socks
系统参数
启动报错
这是因为缺少几个驱动。由于 Win7 已停产,Windows Update 不会自动安装此更新,需要手动安装。
注:共需要两个驱动,而且由于微软官方关闭下载按钮,需要去 google 上找野生驱动下载。
第一个驱动是:kb2533623
下载地址:https://github.com/akl7777777/ShellGPT/blob/main/windows6.1-kb2533623-x64.msu
下载并安装完成之后,再次启动 tun2socks 会发现有第二个报错
不要慌,此时需要下载第二个驱动:kb4474419
下载地址:https://catalog.update.microsoft.com/search.aspx?q=kb4474419
重启之后再次启动 tun2socks ,即可发现一切正常