V2Ray 中 DNS 的解析流程

V2Ray 有自带的 DNS 模块,提供 DNS 解析的功能,包括 hosts,DNS 分流,防劫持,防污染等等功能。

本文主要对 V2Ray 中 DNS 的解析流程做一个说明。

V2Ray 的 DNS 解析分两种:

  1. DNS Outbound 解析
  2. Socks5 Proxy 代理解析

1. DNS Outbound 解析

DNS Outbound 解析是指通过 TUN 设备做透明代理,把 DNS 的 UDP 流量全部导入到 V2Ray 中,同时配置一个 rule 去拦截到这个 UDP 的流量。

1
2
3
4
5
6
7
8
9
10
11
  "rules": [{
"type": "field",
"outboundTag": "dns-out",
"inboundTag": [
"tun2socks"
],
"network": "udp",
"port": 53
},
.........
]

这个时候,V2Ray 第一会调用内置的 DNS 模块去解析 UDP 流量中的域名地址。

通过 dns servers 中的 DNS server IP 同样要经过 rules 的规则路由。比如,如果 DNS server 的 IP 地址是 8.8.8.8,就需要配置相应的 rule,走代理去解析。(V2Ray/VMess 目前是 UDP over TCP)

2. Socks5 Proxy 代理解析

需要开启域名嗅探功能, sniffing 的配置:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
{
"port": 1086,
"listen": "0.0.0.0",
"protocol": "socks",
"settings": {
"auth": "noauth",
"timeout": 0,
"udp": true
},
"sniffing": {
"enabled": true,
"destOverride": [
"http",
"tls"
]
}
}

包含 两种 :
1. inbound 接收到 socks5 代理请求
2. TUN 设备通过 tun2Socks 转发到 v2ray-core 的请求

当 inbound 获取到代理请求时,会使用 rules 进行匹配,匹配时有三种情况,对应rules 中的 domainStrategy 的三个配置:

  1. AsIs(默认): 使用core 接收到的地址(可能是域名,也可能是 IP)匹配
  2. IPOnDemand : 只要rules里面有匹配 IP 的规则,都先解析一次
  3. IPIfNonMatch : 如果根据域名没有匹配到规则,则调用内置 DNS 执行一次解析后,再根据 IP 匹配

如果以上都没有匹配到规则,那么默认使用 outbound 的第一个规则(通常第一个是 Vmess Proxy,有时候也会配置成 freedom )。

2.1. 根据匹配到的 outbound 来判断是否进一步解析

  1. 如果根据 域名 匹配到的是 freedom 的 direct outbound,那么会看是否有配置 UseIP(v4,v6),有配置,调用内置的 dns server 去解析(dns server IP 同样要通过 rules 匹配走哪个规则),然后直接连接获取到的 IP 地址。

  2. 如果匹配到的是 proxy 的代理规则,则不解析域名,直接将域名发到远程代理服务器,远端执行的 DNS 解析。

Just for my love !!