V2Ray 有自带的 DNS 模块,提供 DNS 解析的功能,包括 hosts,DNS 分流,防劫持,防污染等等功能。
本文主要对 V2Ray 中 DNS 的解析流程做一个说明。
V2Ray 的 DNS 解析分两种:
- DNS Outbound 解析
- Socks5 Proxy 代理解析
1. DNS Outbound 解析
DNS Outbound 解析是指通过 TUN 设备做透明代理,把 DNS 的 UDP 流量全部导入到 V2Ray 中,同时配置一个 rule 去拦截到这个 UDP 的流量。
1 | "rules": [{ |
这个时候,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 | { |
包含 两种 :
1. inbound 接收到 socks5 代理请求
2. TUN 设备通过 tun2Socks 转发到 v2ray-core 的请求
当 inbound 获取到代理请求时,会使用 rules 进行匹配,匹配时有三种情况,对应rules 中的 domainStrategy 的三个配置:
- AsIs(默认): 使用core 接收到的地址(可能是域名,也可能是 IP)匹配
- IPOnDemand : 只要rules里面有匹配 IP 的规则,都先解析一次
- IPIfNonMatch : 如果根据域名没有匹配到规则,则调用内置 DNS 执行一次解析后,再根据 IP 匹配
如果以上都没有匹配到规则,那么默认使用 outbound 的第一个规则(通常第一个是 Vmess Proxy,有时候也会配置成 freedom )。
2.1. 根据匹配到的 outbound 来判断是否进一步解析
如果根据 域名 匹配到的是 freedom 的 direct outbound,那么会看是否有配置 UseIP(v4,v6),有配置,调用内置的 dns server 去解析(dns server IP 同样要通过 rules 匹配走哪个规则),然后直接连接获取到的 IP 地址。
如果匹配到的是 proxy 的代理规则,则不解析域名,直接将域名发到远程代理服务器,远端执行的 DNS 解析。