我参考 V2Ray 文档,遇到几个困惑的地方,前来请教。
文档中提到:
V2Ray 内置了一个 DNS 服务器,可以将 DNS 查询根据路由设置转发到不同的远程服务器中。
若要使 DNS 服务生效,需要配置路由功能中的 domainStrategy。
由此 DNS 服务器所发出的 DNS 查询请求,会自动根据路由配置进行转发,无需额外配置。
可以看出 V2Ray 的 DNS 与路由息息相关。
假如客户端配置如下:
{
"dns": {
"servers": [
"8.8.8.8",
"localhost"
]
},
"inbound": {
"port": 8080,
"protocol": "socks",
"settings": {
"auth": "noauth",
"timeout": 0
}
},
"outbound": {
"protocol": "vmess",
"settings": {
"vnext": [
{
"address": "x.x.x.x",
"port": xxxx,
"users": [
{
"alterId": 31,
"id": "----"
}
]
}
]
},
"tag": "US"
},
"outboundDetour": [
{
"protocol": "vmess",
"settings": {
"vnext": [
{
"address": "x.x.x.x",
"port": xxxx,
"users": [
{
"alterId": 31,
"id": "----"
}
]
}
]
},
"tag": "JP"
},
{
"protocol": "vmess",
"settings": {
"vnext": [
{
"address": "x.x.x.x",
"port": xxxx,
"users": [
{
"alterId": 31,
"id": "----"
}
]
}
]
},
"proxySettings": {
"tag": "US"
},
"tag": "SG"
},
{
"protocol": "freedom",
"settings": {},
"tag": "direct"
},
{
"protocol": "blackhole",
"settings": {},
"tag": "adblock"
}
],
"routing": {
"strategy": "rules",
"settings": {
"domainStrategy": "AsIs",
"rules": [
{
"domain": [
"amazon.com",
"microsoft.com",
"youtu.com"
],
"type": "field",
"outboundTag": "JP"
},
{
"type": "chinasites",
"outboundTag": "direct"
},
{
"type": "chinaip",
"outboundTag": "direct"
},
{
"domain": [
"twtter.com",
"youtube.com"
],
"type": "field",
"outboundTag": "SG"
}
]
}
}
}
对于这样的配置,我作出这样的解释不知道对不对:
如果上面的说法错了,请指正。如果没错,请教:
当 domainStrategy = "AsIs" 时,不会进行 DNS 查询。
"AsIs": 只使用域名进行路由选择。默认值。
当 domainStrategy = "IPIfNonMatch" 时,会进行 DNS 查询,但只是当域名未找到匹配时。在这种情况下,如果你访问了 "v2ray.com",此时在路由中没有找到相应规则,V2Ray 会进行 DNS 查询。DNS 查询目标地址是 8.8.8.8,你的路由中没有匹配 8.8.8.8 的规则,于是由默认的 outbound (US) 发出。假设查到的 IP 是 1.2.3.4,再次进行路由匹配。如果 1.2.3.4 匹配到某一规则,则由这个规则对应的 outbound 转发;否则由默认的 outbound 转发。
DNS 目前用的是静态的服务器列表,无法做到像你描述的那样,根据查询目标而选择不同的线路。由于 DNS 和路由是两个独立的模块,要实现你描述的功能,需要在 DNS 配置中加入一些匹配选项。
似乎有些明白了,是不是如果设置了IPIfNonMatch 之后进行的 DNS 查询只是本地的查询?
如果配置了非本机的 DNS 服务器,如你的配置中的 8.8.8.8,则会向这个服务器发送 DNS 查询。如果配置了多个,比如你的 [8.8.8.8, localhost],则会依次查询所有的服务器,每个查询之间间隔 8 秒。如果第一个服务器返回了正常的响应,则不会查询后续的服务器。
明白了。多谢你的解答
Most helpful comment
当 domainStrategy = "AsIs" 时,不会进行 DNS 查询。
当 domainStrategy = "IPIfNonMatch" 时,会进行 DNS 查询,但只是当域名未找到匹配时。在这种情况下,如果你访问了 "v2ray.com",此时在路由中没有找到相应规则,V2Ray 会进行 DNS 查询。DNS 查询目标地址是 8.8.8.8,你的路由中没有匹配 8.8.8.8 的规则,于是由默认的 outbound (US) 发出。假设查到的 IP 是 1.2.3.4,再次进行路由匹配。如果 1.2.3.4 匹配到某一规则,则由这个规则对应的 outbound 转发;否则由默认的 outbound 转发。
DNS 目前用的是静态的服务器列表,无法做到像你描述的那样,根据查询目标而选择不同的线路。由于 DNS 和路由是两个独立的模块,要实现你描述的功能,需要在 DNS 配置中加入一些匹配选项。