Xray-core
Xray-core copied to clipboard
[bug] 开启内置DNS后,仍然会通过系统DNS查询
测试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查询。
这问题你是用路由器上的软件翻墙吗?不是,是用客户端如v2rayn,也要发客户端配置。
和xray 服务器配置无关。你要搜下 dns 查询流程
@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
}
]
}
}
看了你的客户端配置,服务器配置,没发现什么问题。
我把系统 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
@xqzr 说 windows 的系统 socks 代理是 socks4 不支持域名代理 所以流量在进入 core 之前有一次 DNS 解析 想要完全避免泄漏可以使用 proxifier 之类的全局代理工具
@xqzr 说 windows 的系统 socks 代理是 socks4 不支持域名代理 所以流量在进入 core 之前有一次 DNS 解析 想要完全避免泄漏可以使用 proxifier 之类的全局代理工具
~刚才验证了,不是WIN上的原因~。WIN11,系统代理关。chrome,SwitchyOmega不论用sock还是http引入v2rayN,xray-core。现在还是一样的复现。
复现如1楼说的现象
~想了下大概理解 @xqzr 的意思,那就VPS上的代理和配置文件里的,用一样的就行比如都是CF的2333~
手机使用v2rayN 自定义配置 fakedns。
还是复现了1楼的情况
手机客户端不可能是sockv4的锅吧
有没有可能是浏览器的预加载之类的功能(通过代理)发送了一次多余的DNS查询?但即使这样也应该走服务端xray配置的内置DNS啊。
目前发现Edge和Chrome都有一楼的情况,浏览器的flag是默认。Chrome 101.0.4951.54,Edge 101.0.1210.39
服务端把系统DNS设置为一个显然不是DNS服务的IP后,客户端浏览器仍然能正常上网,且测试显示只收到来自Cloudflare的查询,说明这一次系统DNS的查询不是必需的。
噢 我理解错了 能看一下服务端的 debug 日志?
我复现的vps用的Debian11,刚才找了一台Debian10的,一样的xray客户端(v2rayN),服务器端配置,没有复现出1楼的现象。怕是和Deian10 11有关。手里没ubuntu的vps。
服务端把系统DNS设置为一个显然不是DNS服务的IP后,客户端浏览器仍然能正常上网,且测试显示只收到来自Cloudflare的查询,说明这一次系统DNS的查询不是必需的。
我把resolv.conf里面乱写一个 IP,一样复现了你的情况。你VPS系统是什么?
噢 我理解错了 能看一下服务端的 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楼情况。
另一个VPS,用的一个DD脚本安装的debian11,只是用的HY,比如hy配置是1.1.1.1,resolv.conf是8.8.8.8,不会出现1楼现象。
可能真是xray这边,我目前发现在debian11上出的问题。
用于测试的地址无返回。流程如下。
- app/dns 查询内部dns未命中。
- transport/internet/tcp 会直接使用域名进行连接。(这里会调用本地dns,但是查询仍是未命中)
服务端把系统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
@vojeus
- app/dns 查询内部dns未命中。
实际上从leak测试原理来说,stddns-xxxxxxxxxxx.dnstest2.doileak.com不需要能够被解析到任何A或者AAAA记录,只要该域名的根服务器(是叫这个吗?)接收到相应DNS查询就行。实际上,我猜测这个域名可能被设计为返回SOA。
- transport/internet/tcp 会直接使用域名进行连接。(这里会调用本地dns,但是查询仍是未命中)
服务端resolv.conf 的IP是 8.8.8.8,服务端 xray 内置DNS设置为一个非DNS服务的IP:
- 仍然能上网,但是能够明显感觉变慢,应该是在等待xray内置DNS超时然后使用系统DNS查询
- doileak测试结果显示只有来自Google的DNS查询
@chika0801
测试DNS泄露网站是https://browserleaks.com/dns
如果这个网站测试DNS泄露用的域名能够返回一个A或者AAAA记录的话,xray应该就不会内置DNS超时然后使用系统DNS查询。
update: 看了下,形如xxxxxxxxxxxxx.6.browserleaks.org和xxxxxxxxxxxxx.4.browserleaks.org的域名是有合法解析的,也确实不会泄露8888
到这里,应该基本破案了
服务端resolv.conf 的IP是 8.8.8.8,服务端 xray 内置DNS设置为一个非DNS服务的IP:
仍然能上网,但是能够明显感觉变慢,应该是在等待xray内置DNS超时然后使用系统DNS查询
我也遇到这现象
你们这个讨论的是服务端DNS问题,我同时发现客户端也会用Xray配置的DNS以外的本机DNS去查询,感觉这个更容易造成DNS泄露吧,毕竟客户端在墙内
同意,如果客户端也有这样的问题那就有点危险了。建议改成:如果设置了内置DNS,就只使用内置DNS查询,不使用系统DNS。
有人可以draft一个fix并PR到v2fly吗,或者我去把这个raise到v2fly?
Edit: 暂未测试以上问题是否存在于v2fly
我用openwrt, 通過iptables挾持了局域網内所有主機的DNS請求,然後用XRAY内建DNS分流,發現依然會出現DNS泄漏
有没有一种可能是没有配置 SystemDialer 的 domainStrategy
出入站的 address 如果填写的是域名,默认不进入 Xray 的内置 DNS 流程,直接交由系统 DNS 解析。
https://xtls.github.io/config/transport.html#sockoptobject
"streamSettings": {
"sockopt": {
"domainStrategy": "UseIP"
}
}