5.0 KiB
xray.dns
提供 DNS 查询和上游服务器访问接口。
local dns = require("xray.dns")
API 索引
| 分类 | 成员 | 说明 |
|---|---|---|
| 函数 | dns.Query(domain, ipv4, ipv6, fake) |
通过 Xray DNS 客户端查询 |
| 字段 | dns.Servers |
上游服务器数组 |
| 对象 | serverObj |
单个 DNS 上游服务器 |
| 字段 | serverObj.ID |
服务器标识 |
| 方法 | serverObj:Query(domain, ipv4, ipv6, fake) |
直接查询指定上游 |
函数
dns.Query
local ips, ttl, err = dns.Query(domain, ipv4, ipv6, fake)
通过 Xray 的 DNS 客户端查询域名。在 DNS Hook 中不可用,因为脚本接管的就是它。
参数
| 参数 | 类型 | 说明 |
|---|---|---|
domain |
string |
待查询域名 |
ipv4 |
boolean |
是否允许查询 IPv4 |
ipv6 |
boolean |
是否允许查询 IPv6 |
fake |
boolean |
是否允许使用 FakeDNS |
返回值
| 返回值 | 类型 | 说明 |
|---|---|---|
ips |
[]net.IP 或 nil |
查询结果 |
ttl |
number |
TTL(秒),范围 0 .. 4294967295,始终非 nil |
err |
error 或 nil |
查询错误,nil 表示无错误 |
行为约定
四个参数均须显式传入且类型正确,否则抛出 Lua 异常。
查询遵循客户端的全局查询类型限制、Hosts 和上游配置;配置了 DNS 脚本时,也会交由该脚本处理。未配置内置 DNS 时使用系统 DNS。
查询成功时返回非空 IP slice;查询失败或没有可用地址时返回 nil, 0, err。
示例
local ips, ttl, err = dns.Query("example.com", true, true, false)
if err == nil and ips ~= nil and #ips > 0 then
local firstIP = ips[1]:String()
end
字段
dns.Servers
local servers = dns.Servers
| 名称 | 类型 | 说明 |
|---|---|---|
dns.Servers |
table |
serverObj 数组,下标从 1 开始,顺序与配置相同 |
使用内置 DNS 时,列表包含配置的上游;未配置 DNS 或上游服务器时,列表仅包含 localhost(系统 DNS)。
可用 ipairs 遍历列表;下标超出范围时,servers[i] 为 nil。
示例
for _, serverObj in ipairs(dns.Servers) do
local id = serverObj.ID
end
对象
server
serverObj 表示一个 DNS 上游服务器,包含其标识和查询方法。
| 属性 | 说明 |
|---|---|
| Go 侧实现 | app/dns 中的 luaDNSServer |
| Lua 表现 | table |
| 取得方式 | dns.Servers 的数组元素 |
ID
local id = serverObj.ID
| 名称 | 类型 | 说明 |
|---|---|---|
serverObj.ID |
string |
对应 DNS 服务器配置中的 id 字段,始终非 nil |
未填写 id 时为 "",包括用字符串形式配置的服务器;自动添加的系统 DNS 上游 ID 为 "localhost"。
需要通过 ID 区分服务器时,请自行配置唯一的值,核心不会检查是否重复。
Query
local ips, ttl, err = serverObj:Query(domain, ipv4, ipv6, fake)
查询 serverObj 对应的上游。
参数与返回值
参数要求和返回值类型与 dns.Query 相同。
行为约定
正常配置的上游成功时返回非空 IP slice、TTL 和 nil;查询失败、没有符合条件的地址,或 fake == false 却查询 FakeDNS 时返回 nil, 0, err。
直接查询该服务器,跳过全局 Hosts 和 DNS 脚本。服务器自身的 queryStrategy、缓存、timeoutMs、clientIP、tag,以及 expectedIPs / unexpectedIPs 和对应的 actPrior / actUnprior 仍然生效。
示例
在 DNS Hook 中直接返回首个上游的查询结果:
function HandleDNSQuery(domain, ipv4, ipv6, fake)
return dns.Servers[1]:Query(domain, ipv4, ipv6, fake)
end