0%

在 v2ray 中同时开启 socks 和 http 代理

前置要求

  1. 有 v2ray-core 客户端
  2. 有一定的 Linux 操作基础

一些介绍

  • 正如我们所知的那样, v2ray 的配置文件大体是由 log + inbound + outbound + route 组成的。
  • 下面是一个简单的 v2ray 配置文件

    config.json

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
{
"log": {
"loglevel": "warning",
"access": "D:\\v2ray\\access.log",
"error": "D:\\v2ray\\error.log"
},
"inbounds": [
{
"port": 1080,
"protocol": "socks",
"sniffing": {
"enabled": true,
"destOverride": ["http", "tls"]
},
"settings": {
"auth": "noauth",
"udp": true
}
}
],
"outbounds": [
{
"protocol": "vmess",
"settings": {
"vnext": [
{
"address": "serveraddr.com",
"port": 16823,
"users": [
{
"id": "b831381d-6324-4d53-ad4f-8cda48b30811",
"alterId": 0
}
]
}
]
}
},
{
"protocol": "freedom",
"settings": {},
"tag": "direct"
}
],
"routing": {
"domainStrategy": "IPOnDemand",
"rules": [
{
"type": "field",
"outboundTag": "direct",
"domain": ["geosite:cn"] // 中国大陆主流网站的域名
},
{
"type": "field",
"outboundTag": "direct",
"ip": [
"geoip:cn", // 中国大陆的 IP
"geoip:private" // 私有地址 IP,如路由器等
]
}
]
}
}

alt

  • 在图片中我们可以清楚的看到该配置文件有一个 inbound两个 outbound 以及 两条路由规则

一些想法

  • 既然可以有多个 outbound 那么为什么不能有多个 inbound
  • 而且官方文档里也说了,inboundsoutboundsinboundoutbound 的集合。

简单的尝试

以上面的 config.json 为例,copy & paste
然后再修改一下端口协议什么的

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
{
"log": {
"loglevel": "warning",
"access": "",
"error": ""
},
"inbounds": [
{
"port": 1080,
"protocol": "socks",
"sniffing": {
"enabled": true,
"destOverride": ["http", "tls"]
},
"settings": {
"auth": "noauth",
"udp": true
}
},
{
"port": 1081,
"protocol": "http",
"sniffing": {
"enabled": true,
"destOverride": ["http", "tls"]
},
"settings": {
"auth": "noauth",
"udp": false
}
}
],
"outbounds": [
{
"protocol": "vmess",
"settings": {
"vnext": [
{
"address": "serveraddr.com",
"port": 16823,
"users": [
{
"id": "b831381d-6324-4d53-ad4f-8cda48b30811",
"alterId": 0
}
]
}
]
}
},
{
"protocol": "freedom",
"settings": {},
"tag": "direct"
}
],
"routing": {
"domainStrategy": "IPOnDemand",
"rules": [
{
"type": "field",
"outboundTag": "direct",
"domain": ["geosite:cn"]
},
{
"type": "field",
"outboundTag": "direct",
"ip": [
"geoip:cn",
"geoip:private"
]
}
]
}
}

alt

尝试的结果

  • ./v2ray --conf=./config.json

alt

  • lsof -i:1080 && lsof -i:1081

alt

显然试验成功了。那么是 为什么 呢?

一些原因

  1. 我们可以将 v2ray 看成一个带加密功能的 switch , 将 inbound 看成 LAN 口,将 outbound 看成 WAN 口。
  2. 如果我们想正常上网,那么我们就得添加路由规则。也就是 routing 下面的 rule
  3. v2ray 接收来着 LAN口 的流量(也就是用户的流量),经过 rule 的匹配筛选后,转发给对应的 WAN口 ,从而实现正常上网。
  4. 参考上面 config.json 里面的 ruleinboundTag 都为空,outboundTag 都有明显的值。相当于匹配所有 inboundTag ,不区分,只区分应该转发到哪个 outboundTag相当于默认路由)。
  5. ?如何匹配路由?我们可以看到在每一个 rule 下面都有一个 ip 或者 domain, v2ray 根据这个来匹配。书写规范alt

routing 下 rule 的 IP 或域名书写规范

官方文档:https://guide.v2fly.org/basics/routing/basics_routing.html
为了方便,copy 一份如下:

关于路由规则的注意事项

本节记录了一些新手朋友使用 V2Ray 使用路由功能时常范的错误,希望大家能够避免。

通配符

如果我想让淘宝和京东的域名直连,路由功能的规则写成下面这样的,你觉得这样的规则有问题吗?

1
2
3
4
5
6
7
8
9
10
[
{
"type": "field",
"outboundTag": "direct",
"domain": [
"*.taobao.com",
"*.jd.com"
]
}
]

看起来没有什么问题,但事实上,有。如果使用了这样的规则,你会发现根本没有走 direct 直连。很奇怪?这并不奇怪。这是因为你的经验在作祟。在 V2Ray 中,星号 * 不具备通配符的意义,只是一个普通的字符而已,是你以为星号 * 是通配符,这是臆想。如果想要匹配所有子域名的话,可以这么写规则:

1
2
3
4
5
6
7
8
9
10
[
{
"type": "field",
"outboundTag": "direct",
"domain": [
"domain:taobao.com",
"domain:jd.com"
]
}
]

domain: 代表子域名,如 “domain:taobao.com” 这样一条规则包含了所有 taobao.com 域名及其子域名。

IP & domain
1
2
3
4
5
6
7
8
9
10
11
12
[
{
"type": "field",
"outboundTag": "direct",
"domain": [
"domain:taobao.com"
],
"ip": [
"192.168.0.0/16"
]
}
]

这样的一个规则的严格来说没有问题,真正的问题在与使用者不理解规则的配置。如果要匹配以上的规则,那么代表这有一个数据包的目标地址域名是 taobao.com 并且 IP 属于 192.168.0.0.1/16。通常情况下这是不可能的,所以你访问淘宝是不会匹配这个规则。如果你要满足域名和 IP 任一条件都能够匹配规则,那么应该这么写:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
[
{
"type": "field",
"outboundTag": "direct",
"domain": [
"domain:taobao.com"
]
}
{
"type": "field",
"outboundTag": "direct",
"ip": [
"192.168.0.0/16"
]
}
]
-------------本文结束再接再厉-------------

本文标题:在 v2ray 中同时开启 socks 和 http 代理

文章作者:IITII

发布时间:2020年02月04日 - 17:02

最后更新:2020年02月04日 - 19:02

原始链接:https://iitii.github.io/2020/02/04/1/

许可协议: 署名-非商业性使用-禁止演绎 4.0 国际 转载请保留原文链接及作者。