Files
XTLS_Xray-docs-next/docs/ru/development/lua/reference/module-dns.md
T

7.5 KiB
Raw Blame History

xray.dns

Предоставляет интерфейсы DNS-запросов и доступа к вышестоящим серверам.

local dns = require("xray.dns")

Указатель API

Категория Член API Описание
Функция dns.Query(domain, ipv4, ipv6, fake) Запрос через DNS-клиент Xray
Поле dns.Servers Массив вышестоящих серверов
Объект serverObj Отдельный вышестоящий DNS-сервер
Поле serverObj.ID Идентификатор сервера
Метод serverObj:Query(domain, ipv4, ipv6, fake) Прямой запрос к указанному серверу

Функции

dns.Query

local ips, ttl, err = dns.Query(domain, ipv4, ipv6, fake)

Запрашивает домен через DNS-клиент Xray. В Hook DNS недоступен, поскольку скрипт заменяет именно этот процесс обработки запросов.

Параметры

Параметр Тип Описание
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; при ошибке запроса или отсутствии доступных адресов — 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 luaDNSServer из app/dns
Представление в Lua table
Получение Элемент массива dns.Servers

ID

local id = serverObj.ID
Имя Тип Описание
serverObj.ID string Поле id в конфигурации DNS-сервера; никогда не nil

Если id не задан, значение равно "", в том числе у серверов, настроенных строками. Автоматически добавленный системный DNS имеет ID "localhost".

Если нужно различать серверы по ID, самостоятельно задайте уникальные значения: ядро не проверяет дубликаты.

Query

local ips, ttl, err = serverObj:Query(domain, ipv4, ipv6, fake)

Запрашивает вышестоящий сервер, представленный serverObj.

Параметры и возвращаемые значения

Требования к параметрам и типы возвращаемых значений такие же, как у dns.Query.

Поведение

Обычно настроенный сервер при успехе возвращает непустой срез IP, TTL и nil. При ошибке запроса, отсутствии адресов, удовлетворяющих условиям, или запросе FakeDNS с fake == false возвращается nil, 0, err.

Запрашивает этот сервер напрямую, обходя глобальные Hosts и скрипт DNS. Собственные настройки сервера queryStrategy, кеш, timeoutMs, clientIP, tag, а также expectedIPs / unexpectedIPs и соответствующие actPrior / actUnprior продолжают действовать.

Пример

Вернуть результат запроса к первому серверу напрямую из Hook DNS:

function HandleDNSQuery(domain, ipv4, ipv6, fake)
    return dns.Servers[1]:Query(domain, ipv4, ipv6, fake)
end