Xray-core icon indicating copy to clipboard operation
Xray-core copied to clipboard

[bug] 开启内置DNS后,仍然会通过系统DNS查询

Open Hubedge opened this issue 3 years ago • 21 comments

测试1

通过/etc/resolv.conf配置系统DNS为8.8.8.8,搭配如下Xray配置,https://www.doileak.com/classic.html 显示同时存在来自Cloudflare和Google的DNS查询。

{
    "log": {
        "loglevel": "warning"
    },
    "dns": {
        "servers": [
            "1.1.1.1",
            "1.0.0.1"
        ]
    },
    "inbounds": [],
    "outbounds": [
        {
            "protocol": "freedom",
            "settings": {
                "domainStrategy": "UseIPv4" //出站连接时使用内置DNS,即1.1.1.1
            }
        },
        {
            "protocol": "blackhole",
            "tag": "blocked"
        }
    ],
    "routing": {
        "domainStrategy": "AsIs", // 路由阶段不进行DNS查询
        "rules": [
            {
                "type": "field",
                "ip": [
                    "geoip:private"
                ],
                "outboundTag": "blocked"
            }
        ]
    }
}

测试2

相同的Xray配置,在/etc/resolv.conf配置系统DNS为1.1.1.1后,测试显示只收到来自Cloudflare的DNS查询。

预期

无论系统DNS为何,在该Xray配置配置下,doileak都应该只收到来自Cloudflare的DNS查询。

Hubedge avatar May 09 '22 14:05 Hubedge

这问题你是用路由器上的软件翻墙吗?不是,是用客户端如v2rayn,也要发客户端配置。

和xray 服务器配置无关。你要搜下 dns 查询流程

chika0801 avatar May 09 '22 14:05 chika0801

@chika0801 客户端是Windows 10,V2rayN 5.16,未配置内置DNS服务器。客户端系统DNS非8888

{
  "log": {
    "access": "",
    "error": "",
    "loglevel": "warning"
  },
  "inbounds": [
    {
      "tag": "socks",
      "port": 10809,
      "listen": "127.0.0.1",
      "protocol": "socks",
      "sniffing": {
        "enabled": true,
        "destOverride": [
          "http",
          "tls"
        ]
      },
      "settings": {
        "auth": "noauth",
        "udp": true,
        "allowTransparent": false
      }
    }
  ],
  "outbounds": [
    {
      "tag": "proxy",
      "protocol": "trojan",
      "settings": {
        "servers": [
          {
            "address": "server.example.com",
            "method": "chacha20",
            "ota": false,
            "password": "a_simple_password",
            "port": 443,
            "level": 1,
            "flow": "xtls-rprx-direct"
          }
        ]
      },
      "streamSettings": {
        "network": "tcp",
        "security": "xtls",
        "xtlsSettings": {
          "allowInsecure": false
        }
      },
      "mux": {
        "enabled": false,
        "concurrency": -1
      }
    },
    {
      "tag": "direct",
      "protocol": "freedom",
      "settings": {}
    },
    {
      "tag": "block",
      "protocol": "blackhole",
      "settings": {
        "response": {
          "type": "http"
        }
      }
    }
  ],
  "routing": {
    "domainStrategy": "AsIs",  // 路由阶段不进行DNS查询
    "domainMatcher": "mph",
    "rules": [
      {
        "type": "field",
        "inboundTag": [
          "api"
        ],
        "outboundTag": "api",
        "enabled": true
      },
      {
        "type": "field",
        "inboundTag": [],
        "outboundTag": "block",
        "domain": [
          "geosite:category-ads-all"
        ],
        "enabled": true
      },
      {
        "type": "field",
        "inboundTag": [],
        "outboundTag": "direct",
        "ip": [
          "geoip:private",
          "geoip:cn"
        ],
        "enabled": true
      }
    ]
  }
}

Hubedge avatar May 09 '22 15:05 Hubedge

看了你的客户端配置,服务器配置,没发现什么问题。

我把系统 DNS 改成 8.8.8.8,复现了你的情况。原因不清楚。我一直是系统 DNS 和 服务器配置里的是一样的,就一直没发现。感谢你的发现,你等高手来解释原因吧

~建议你在服务器配置dns部分加下面参数,再测试下。不行还露,我也不知道原因。我拿你发的链接测了我的配置,没dns泄露。你这测试网站我是第一次见。其它类似测试网站我自己用的配置也没问题。~

~或者你换套翻墙协议组合测试来排除法~

"queryStrategy": "UseIPv4" https://github.com/chika0801/Xray-examples/blob/c7fd07ae78e731396f1e916d19b57af27d565c29/VLESS-TCP-XTLS/config_server.json#L11

chika0801 avatar May 09 '22 16:05 chika0801

@xqzr 说 windows 的系统 socks 代理是 socks4 不支持域名代理 所以流量在进入 core 之前有一次 DNS 解析 想要完全避免泄漏可以使用 proxifier 之类的全局代理工具

yuhan6665 avatar May 10 '22 14:05 yuhan6665

@xqzr 说 windows 的系统 socks 代理是 socks4 不支持域名代理 所以流量在进入 core 之前有一次 DNS 解析 想要完全避免泄漏可以使用 proxifier 之类的全局代理工具

~刚才验证了,不是WIN上的原因~。WIN11,系统代理关。chrome,SwitchyOmega不论用sock还是http引入v2rayN,xray-core。现在还是一样的复现。

复现如1楼说的现象

~想了下大概理解 @xqzr 的意思,那就VPS上的代理和配置文件里的,用一样的就行比如都是CF的2333~

chika0801 avatar May 10 '22 14:05 chika0801

手机使用v2rayN 自定义配置 fakedns。

还是复现了1楼的情况

手机客户端不可能是sockv4的锅吧

chika0801 avatar May 10 '22 17:05 chika0801

有没有可能是浏览器的预加载之类的功能(通过代理)发送了一次多余的DNS查询?但即使这样也应该走服务端xray配置的内置DNS啊。

目前发现Edge和Chrome都有一楼的情况,浏览器的flag是默认。Chrome 101.0.4951.54,Edge 101.0.1210.39

Hubedge avatar May 10 '22 19:05 Hubedge

服务端把系统DNS设置为一个显然不是DNS服务的IP后,客户端浏览器仍然能正常上网,且测试显示只收到来自Cloudflare的查询,说明这一次系统DNS的查询不是必需的。

Hubedge avatar May 10 '22 19:05 Hubedge

噢 我理解错了 能看一下服务端的 debug 日志?

yuhan6665 avatar May 11 '22 03:05 yuhan6665

我复现的vps用的Debian11,刚才找了一台Debian10的,一样的xray客户端(v2rayN),服务器端配置,没有复现出1楼的现象。怕是和Deian10 11有关。手里没ubuntu的vps。

chika0801 avatar May 11 '22 05:05 chika0801

服务端把系统DNS设置为一个显然不是DNS服务的IP后,客户端浏览器仍然能正常上网,且测试显示只收到来自Cloudflare的查询,说明这一次系统DNS的查询不是必需的。

我把resolv.conf里面乱写一个 IP,一样复现了你的情况。你VPS系统是什么?

chika0801 avatar May 11 '22 06:05 chika0801

噢 我理解错了 能看一下服务端的 debug 日志? access.txt error.txt

我的配置是 https://github.com/chika0801/Xray-examples/tree/main/VLESS-TCP-XTLS

按1楼的方法resolv.conf 的IP是 8.8.8.8,客户端 VPS端的DNS是1.1.1.1,系统Deibian11,测试DNS泄露网站是https://browserleaks.com/dns

就复现了1楼情况。

chika0801 avatar May 11 '22 06:05 chika0801

另一个VPS,用的一个DD脚本安装的debian11,只是用的HY,比如hy配置是1.1.1.1,resolv.conf是8.8.8.8,不会出现1楼现象。

可能真是xray这边,我目前发现在debian11上出的问题。

chika0801 avatar May 11 '22 06:05 chika0801

用于测试的地址无返回。流程如下。

  1. app/dns 查询内部dns未命中。
  2. transport/internet/tcp 会直接使用域名进行连接。(这里会调用本地dns,但是查询仍是未命中)

vevx avatar May 11 '22 07:05 vevx

服务端把系统DNS设置为一个显然不是DNS服务的IP后,客户端浏览器仍然能正常上网,且测试显示只收到来自Cloudflare的查询,说明这一次系统DNS的查询不是必需的。

我把resolv.conf里面乱写一个 IP,一样复现了你的情况。你VPS系统是什么?

$ lsb_release -a
No LSB modules are available.
Distributor ID: Debian
Description:    Debian GNU/Linux 11 (bullseye)
Release:        11
Codename:       bullseye

Hubedge avatar May 11 '22 13:05 Hubedge

@vojeus

  1. app/dns 查询内部dns未命中。

实际上从leak测试原理来说,stddns-xxxxxxxxxxx.dnstest2.doileak.com不需要能够被解析到任何A或者AAAA记录,只要该域名的根服务器(是叫这个吗?)接收到相应DNS查询就行。实际上,我猜测这个域名可能被设计为返回SOA。

  1. transport/internet/tcp 会直接使用域名进行连接。(这里会调用本地dns,但是查询仍是未命中)

服务端resolv.conf 的IP是 8.8.8.8,服务端 xray 内置DNS设置为一个非DNS服务的IP:

  1. 仍然能上网,但是能够明显感觉变慢,应该是在等待xray内置DNS超时然后使用系统DNS查询
  2. doileak测试结果显示只有来自Google的DNS查询

@chika0801

测试DNS泄露网站是https://browserleaks.com/dns

如果这个网站测试DNS泄露用的域名能够返回一个A或者AAAA记录的话,xray应该就不会内置DNS超时然后使用系统DNS查询。 update: 看了下,形如xxxxxxxxxxxxx.6.browserleaks.orgxxxxxxxxxxxxx.4.browserleaks.org的域名是有合法解析的,也确实不会泄露8888


到这里,应该基本破案了

Hubedge avatar May 11 '22 13:05 Hubedge

服务端resolv.conf 的IP是 8.8.8.8,服务端 xray 内置DNS设置为一个非DNS服务的IP:

仍然能上网,但是能够明显感觉变慢,应该是在等待xray内置DNS超时然后使用系统DNS查询

我也遇到这现象

chika0801 avatar May 11 '22 13:05 chika0801

你们这个讨论的是服务端DNS问题,我同时发现客户端也会用Xray配置的DNS以外的本机DNS去查询,感觉这个更容易造成DNS泄露吧,毕竟客户端在墙内

Bearljj avatar May 19 '22 06:05 Bearljj

同意,如果客户端也有这样的问题那就有点危险了。建议改成:如果设置了内置DNS,就只使用内置DNS查询,不使用系统DNS。

有人可以draft一个fix并PR到v2fly吗,或者我去把这个raise到v2fly?

Edit: 暂未测试以上问题是否存在于v2fly

Hubedge avatar May 21 '22 12:05 Hubedge

我用openwrt, 通過iptables挾持了局域網内所有主機的DNS請求,然後用XRAY内建DNS分流,發現依然會出現DNS泄漏

WordsWorthLess avatar Jun 03 '22 13:06 WordsWorthLess

有没有一种可能是没有配置 SystemDialerdomainStrategy 出入站的 address 如果填写的是域名,默认不进入 Xray 的内置 DNS 流程,直接交由系统 DNS 解析。

https://xtls.github.io/config/transport.html#sockoptobject

"streamSettings": {
	"sockopt": {
		"domainStrategy": "UseIP"
	}
}

timi-owo avatar Jul 20 '22 15:07 timi-owo