Skip to content

Freedom 出站请求错误的 DNS 服务器 #4728

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Closed
4 tasks done
flowerinsnowdh opened this issue May 14, 2025 · 8 comments
Closed
4 tasks done

Freedom 出站请求错误的 DNS 服务器 #4728

flowerinsnowdh opened this issue May 14, 2025 · 8 comments

Comments

@flowerinsnowdh
Copy link
Contributor

flowerinsnowdh commented May 14, 2025

完整性要求

  • 我保证阅读了文档,了解所有我编写的配置文件项的含义,而不是大量堆砌看似有用的选项或默认值。
  • 我提供了完整的配置文件和日志,而不是出于自己的判断只给出截取的部分。
  • 我搜索了 issues, 没有发现已提出的类似问题。
  • 问题在 Release 最新的版本上可以成功复现

描述

当出站为 Freedom 时,根据日志推测,似乎它向 [::1]:53 请求 DNS,即便已配置内置 DNS 服务器。这让 Freedom 无法访问网络,因为 systemd-resolved 默认不监听 ::1

我不清楚这是 Xray 的 bug 还是操作系统的问题。

仅 Freedom 存在该问题,其他出战无该问题

目前已知 2 个行为可以解决该问题,请开发者大佬们参考以定位问题

  1. 编辑 /etc/systemd/resolved.conf 并添加 DNSStubListenerExtra=::1
  2. 编辑 /etc/hosts 并注释掉 ::1 localhost

补充信息:

  • 操作系统:Archlinux
  • Xray 版本:v25.4.30

重现方式

2025/05/15 07:23:46.209969 [Debug] [338955201] transport/internet: dialing to tcp:www.baidu.com:443
2025/05/15 07:23:46.611016 [Info] [338955201] app/proxyman/outbound: app/proxyman/outbound: failed to process outbound traffic > proxy/freedom: failed to open connection to tcp:www.baidu.com:443 > common/retry: [dial tcp: lookup www.baidu.com on [::1]:53: read udp [::1]:52932->[::1]:53: read: connection refused dial tcp: lookup www.baidu.com on [::1]:53: read udp [::1]:44305->[::1]:53: read: connection refused dial tcp: lookup www.baidu.com on [::1]:53: read udp [::1]:54058->[::1]:53: read: connection refused dial tcp: lookup www.baidu.com on [::1]:53: read udp [::1]:48862->[::1]:53: read: connection refused dial tcp: lookup www.baidu.com on [::1]:53: read udp [::1]:44382->[::1]:53: read: connection refused] > common/retry: all retry attempts failed
2025/05/15 07:23:46.611038 [Info] [338955201] app/proxyman/inbound: connection ends > proxy/http: connection ends > io: read/write on closed pipe

客户端配置

[[inbounds]]
    listen = '127.0.0.1'
    port = 10810
    protocol = 'http'
    tag = 'in-http'
    [inbounds.sniffing]
        enabled = true
        destOverride = [
            'http',
            'tls',
            'quic',
        ]

[[outbounds]]
    protocol = 'freedom'
    tag = 'out-direct'

[log]
    access = 'access.log'
    errror = 'error.log'
    loglevel = 'debug'
    dnsLog = true

[dns]
    [dns.hosts]
        'www.baidu.com' = '103.235.46.115'
    [[dns.servers]]
        address = '223.5.5.5'

服务端配置

N/A

客户端日志

2025/05/15 07:23:46.209969 [Debug] [338955201] transport/internet: dialing to tcp:www.baidu.com:443
2025/05/15 07:23:46.611016 [Info] [338955201] app/proxyman/outbound: app/proxyman/outbound: failed to process outbound traffic > proxy/freedom: failed to open connection to tcp:www.baidu.com:443 > common/retry: [dial tcp: lookup www.baidu.com on [::1]:53: read udp [::1]:52932->[::1]:53: read: connection refused dial tcp: lookup www.baidu.com on [::1]:53: read udp [::1]:44305->[::1]:53: read: connection refused dial tcp: lookup www.baidu.com on [::1]:53: read udp [::1]:54058->[::1]:53: read: connection refused dial tcp: lookup www.baidu.com on [::1]:53: read udp [::1]:48862->[::1]:53: read: connection refused dial tcp: lookup www.baidu.com on [::1]:53: read udp [::1]:44382->[::1]:53: read: connection refused] > common/retry: all retry attempts failed
2025/05/15 07:23:46.611038 [Info] [338955201] app/proxyman/inbound: connection ends > proxy/http: connection ends > io: read/write on closed pipe

服务端日志

N/A

@Meo597
Copy link
Contributor

Meo597 commented May 15, 2025

你这种入站方式进来的是域名,一路到出站都是域名没有ip
到了freedom默认是asis,最终交由golang dial调用os来解析
要在freedom的配置把asis改为useipv4

@Fangliding
Copy link
Member

https://xtls.github.io/config/outbounds/freedom.html#outboundconfigurationobject
只有非asis才走内置dns服务器

@Fangliding Fangliding closed this as not planned Won't fix, can't repro, duplicate, stale May 15, 2025
@flowerinsnowdh
Copy link
Contributor Author

flowerinsnowdh commented May 15, 2025

https://xtls.github.io/config/outbounds/freedom.html#outboundconfigurationobject 只有非asis才走内置dns服务器

感谢提醒,我忘记提及这一点了,但是请不要着急关闭 Issue,还有一个问题没有解决:在没有配置内置 DNS 服务器时,无论是 AsIs 还是 UseIPUseIPv4 ,Freedom 都是选择依赖 systemd-resolved 但是 [::1]:53 作为 DNS 服务器,这一点是否有必要修改?

@Meo597
Copy link
Contributor

Meo597 commented May 15, 2025

既然没ipv6为啥会有v6的dns

我试过各种发行版默认配置下没遇到过这种现象

@Fangliding
Copy link
Member

https://xtls.github.io/config/outbounds/freedom.html#outboundconfigurationobject 只有非asis才走内置dns服务器

感谢提醒,我忘记提及这一点了,但是请不要着急关闭 Issue,还有一个问题没有解决:在没有配置内置 DNS 服务器时,无论是 AsIs 还是 UseIPUseIPv4 ,Freedom 都是选择依赖 systemd-resolved 但是 [::1]:53 作为 DNS 服务器,这一点是否有必要修改?

你系统设置成了这个不就是这个 它是直接调用系统API进行解析的 你curl或者别的任何普通的网络程序大概率都是走的这个DNS 要改也是你从系统改

@flowerinsnowdh
Copy link
Contributor Author

flowerinsnowdh commented May 15, 2025

https://xtls.github.io/config/outbounds/freedom.html#outboundconfigurationobject 只有非asis才走内置dns服务器

感谢提醒,我忘记提及这一点了,但是请不要着急关闭 Issue,还有一个问题没有解决:在没有配置内置 DNS 服务器时,无论是 AsIs 还是 UseIPUseIPv4 ,Freedom 都是选择依赖 systemd-resolved 但是 [::1]:53 作为 DNS 服务器,这一点是否有必要修改?

你系统设置成了这个不就是这个 它是直接调用系统API进行解析的 你curl或者别的任何普通的网络程序大概率都是走的这个DNS 要改也是你从系统改

结论:并不是

我判断并不是系统设置错误的原因

因为除了 Xray 以外的所有该计算机上的应用程序都能正常 Lookup,包括其他 Go 程序

对不同程序的分析

我尝试了一下单独写一个 Go 程序

if _, err := net.LookupIP("www.baidu.com"); err != nil {
	fmt.Println("Failed")
} else {
	fmt.Println("Success")
}

这份代码打印 Success

而同样的内容在我注入进 Xray 后,打印了 Failed

StackTrace

当我把 panic(err) 注入进 localdns.Client#Lookup:26 后,控制台出现了如下的异常

2025/05/15 10:00:53.822801 [Info] [2998206901] app/dispatcher: default route for tcp:www.baidu.com:443
panic: lookup www.baidu.com on [::1]:53: read udp [::1]:50986->[::1]:53: read: connection refused

goroutine 35 [running]:
github.com/xtls/xray-core/features/dns/localdns.(*Client).LookupIP(0x0?, {0xc00038c2f0?, 0x0?}, {0x0?, 0x0?, 0x0?})
        github.com/xtls/xray-core/features/dns/localdns/client.go:26 +0x48f
github.com/xtls/xray-core/proxy/freedom.(*Handler).resolveIP(0xc00038f560, {0x163f588, 0xc0002882d0}, {0xc00038c2f0, 0xd}, {0x0, 0x0?})
        github.com/xtls/xray-core/proxy/freedom/freedom.go:74 +0x1e6
github.com/xtls/xray-core/proxy/freedom.(*Handler).Process.func1()
        github.com/xtls/xray-core/proxy/freedom/freedom.go:136 +0x18d
github.com/xtls/xray-core/common/retry.(*retryer).On(0xc000243cb8, 0xc000243bc0)
        github.com/xtls/xray-core/common/retry/retry.go:27 +0xc3
github.com/xtls/xray-core/proxy/freedom.(*Handler).Process(0xc00038f560, {0x163f588, 0xc0002882d0}, 0xc0000b0420, {0x163cad0, 0xc00037d700})
        github.com/xtls/xray-core/proxy/freedom/freedom.go:133 +0x447
github.com/xtls/xray-core/app/proxyman/outbound.(*Handler).Dispatch(0xc00037d700, {0x163f588, 0xc0002882d0}, 0xc0000b0420)
        github.com/xtls/xray-core/app/proxyman/outbound/handler.go:211 +0x388
github.com/xtls/xray-core/app/dispatcher.(*DefaultDispatcher).routedDispatch(0xc00037b8c0, {0x163f588, 0xc0002882d0}, 0xc0000b0420, {{0x163f240, 0xc0002820e0}, 0x1bb, 0x2})
        github.com/xtls/xray-core/app/dispatcher/default.go:486 +0xc26
github.com/xtls/xray-core/app/dispatcher.(*DefaultDispatcher).Dispatch.func1()
        github.com/xtls/xray-core/app/dispatcher/default.go:295 +0x365
created by github.com/xtls/xray-core/app/dispatcher.(*DefaultDispatcher).Dispatch in goroutine 50
        github.com/xtls/xray-core/app/dispatcher/default.go:268 +0x47b

localdns.Client 确实调用了 Go 原生的 net.Lookupmain/common/net/LookupIP 直接赋值了 Go 原生的 net.Lookup)这一步在其他 Go 程序中不会出错,但会在 Xray 中出错,我并不了解整个项目,所以让我不能理解

@flowerinsnowdh
Copy link
Contributor Author

既然没ipv6为啥会有v6的dns

我试过各种发行版默认配置下没遇到过这种现象

我也不明确,我在其他操作系统上也没有出现该问题,你可以帮我检查一下吗?其他 Linux 发行版的 systemd-resolved 是否也只监听 127.0.0.1:53 而不监听 [::1]:53

@Fangliding
Copy link
Member

看看你执行两个编译的时候go env?

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

No branches or pull requests

3 participants