分析 xray 代码 DNS解析


分析 Xray 的代码, 在哪里进行DNS解析

分析 xray 日志
[Debug] app/log: Logger started
[Debug] app/proxyman/inbound: creating stream worker on 127.0.0.1:1080
[Info] transport/internet/tcp: listening TCP on 127.0.0.1:1080
[Warning] core: Xray 25.10.15 started
[Info] [304315699] proxy/socks: TCP Connect request to tcp:api.myip.la:80
[Info] [304315699] app/dispatcher: default route for tcp:api.myip.la:80
[Info] [304315699] transport/internet/tcp: dialing TCP to tcp:api.myip.la:80
[Debug] [304315699] transport/internet: dialing to tcp:api.myip.la:80
[Info] [304315699] proxy/freedom: connection opened to tcp:api.myip.la:80, local endpoint 198.23.254.247:57912, remote endpoint 149.28.31.24:80
[Info] [304315699] proxy: CopyRawConn splice
可以发现一些关键词, 比如
dialing TCP to 
我们打开xray源码
* 对, 就是把 Xray 项目的 github.com 改为 .dev 
** 当然, 我这是图省事的操作. 你愿意下载源码再用M$ VS打开也是一样的.

搜索 dialing TCP to 
这就是xray打印日志的地方了.
https://github.dev/XTLS/Xray-core/blob/b69a376aa1b61ad94c9c05b2c2cd263567b8cc23/transport/internet/tcp/dialer.go#L21
懂一点代码的就读代码+猜.
不懂代码的就把整个函数复制粘到到GPT里面, 问
分析以下代码, 哪里进行域名的DNS解析?

* 当然, 本地用M$ VS打开的, copilot有额度的, 直接侧边栏问copilot也是一样的.

我们判断这个 DialSystem 里面进行域名的DNS解析. 

右键菜单 Go to Definition

https://github.dev/XTLS/Xray-core/blob/b69a376aa1b61ad94c9c05b2c2cd263567b8cc23/transport/internet/dialer.go#L228

用同样的方法分析代码, 发现是这个 LookupForIP 做DNS解析域名的工作
右键菜单 Go to Definition
https://github.dev/XTLS/Xray-core/blob/b69a376aa1b61ad94c9c05b2c2cd263567b8cc23/transport/internet/dialer.go#L88

很明显, 这个LookupForIP里根据 IPv4优先 IPv6优先等策略, 完成DNS解析的工作.
但是我们还没看到 getaddrinfo的调用. 继续分析. 
应该是这个 dnsClient.LookupIP 进行DNS解析.

这里继续用 右键菜单 Go Definition 就不行了, 用搜索+猜测到找这里
https://github.dev/XTLS/Xray-core/blob/b69a376aa1b61ad94c9c05b2c2cd263567b8cc23/app/dns/dns.go#L186

在这个LookupIP函数里, 继续分析. 应该是这个 client.QueryIP 进行DNS解析.

用搜索+猜测到找这里
https://github.dev/XTLS/Xray-core/blob/b69a376aa1b61ad94c9c05b2c2cd263567b8cc23/app/dns/nameserver.go#L219

继续分析. 应该是这个 server.QueryIP 进行DNS解析.

用搜索+猜测, 找到这里
https://github.dev/XTLS/Xray-core/blob/b69a376aa1b61ad94c9c05b2c2cd263567b8cc23/app/dns/nameserver_local.go#L20

在这里面是这个 LookupIP 进行DNS解析

用搜索+猜测找到了这里
https://github.dev/XTLS/Xray-core/blob/b69a376aa1b61ad94c9c05b2c2cd263567b8cc23/features/dns/localdns/client.go#L23

终于, 我们看到了熟悉的 net.LookupIP 
这是一个 Go 语言标准库自带的函数, 它的底层会调用 Linux 系统的 getaddrinfo 接口. (在一定的条件下. 详见前文)

分析代码的逻辑为:
通过 net.LookupIP 解析域名为地址列表, 可能有IPv4, 可能有IPv6, 
再根据 option 决定返回什么IP.
从阅读代码的理解 看起来, 当没有限制 IPv4或IPv6时, 应该直接使用 getaddrinfo 的返回.

评论

The Hot3 in Last 7 Days

酒馆SillyTavern 玩英文角色卡 也能以中文输出 设置世界书Lorebooks

极简一键脚本 搭NaiveProxy梯子 自定义端口 与Caddy V2前置的VLESS/Vmess V2Ray共存 可开CDN