分析 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
用同样的方法分析代码, 发现是这个 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 的返回.











评论
发表评论