V2ray-core: 求教 V2Ray DNS 的一些疑惑

Created on 11 Dec 2016  ·  4Comments  ·  Source: v2ray/v2ray-core

我参考 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"
        }
      ]
    }
  }
}

对于这样的配置,我作出这样的解释不知道对不对:

  • 当我访问了 amazon.com,匹配路由规则 .routing.settings.rules[0],那么 DNS 查询将由 JP 这个服务向 8.8.8.8 查询,然后将结果返回给客户端
  • 当访问了 google.com,没有匹配配置中给出的路由规则,那么默认路由是 outbound,对于 google.com 的 DNS 查询由 US 向 8.8.8.8 查询,然后将结果返回给客户端

如果上面的说法错了,请指正。如果没错,请教:

  1. 当访问 baidu.com 匹配规则 .routing.settings.rules[1],这个规则的 outbound 是 freedom。那么

    • 将由客户端进行 DNS 查询。这个是否正确?

    • 向哪个 DNS 服务器进行查询?是 DNS 配置中的 8.8.8.8 还是 localhost(本机预设的 DNS) ?

  2. 当我访问了 amazon.com,匹配路由规则 .routing.settings.rules[0],那么 DNS 查询将由 JP 这个服务向 8.8.8.8 查询,但是如果查询失败后服务器是否会使用 localhost 这个值的 DNS进行查询?
  3. 如果我访问 youtube.com,匹配 .routing.settings.rules[3],但是 SG 使用了传出代理(由 US 代理),这个时候是由 SG 还是 US 进行 DNS 查询?

Most helpful comment

当 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 配置中加入一些匹配选项。

All 4 comments

当 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 秒。如果第一个服务器返回了正常的响应,则不会查询后续的服务器。

明白了。多谢你的解答

Was this page helpful?
0 / 5 - 0 ratings

Related issues

limaofu picture limaofu  ·  3Comments

supersndqd picture supersndqd  ·  3Comments

ghost picture ghost  ·  4Comments

samjoeyang picture samjoeyang  ·  4Comments

shuangyuxiaoyi picture shuangyuxiaoyi  ·  4Comments