Hook DNS
Во время запросов встроенного DNS ядро вызывает глобальную функцию HandleDNSQuery из dns.script. Настройка и полные примеры приведены в руководстве по скриптам DNS.
Указатель API
| Категория | Член API | Описание |
|---|---|---|
| Hook | HandleDNSQuery(...) | Обработка DNS-запросов |
Интерфейс Hook
HandleDNSQuery(...)
function HandleDNSQuery(domain, ipv4, ipv6, fake)
return ips, ttl, err
end2
3
Обрабатывает один DNS-запрос и возвращает срез IP, TTL или ошибку.
Параметры
Ядро всегда передаёт все четыре параметра; ни один из них не равен nil.
| Параметр | Тип | Описание |
|---|---|---|
domain | string | Запрашиваемый домен; непустой, в нижнем регистре |
ipv4 | boolean | Разрешены ли запросы адресов IPv4 |
ipv6 | boolean | Разрешены ли запросы адресов IPv6 |
fake | boolean | Разрешён ли FakeDNS для этого запроса |
ipv4 и ipv6 уже ограничены глобальным queryStrategy; хотя бы один равен true. Обычно при запросах к вышестоящему серверу эти три булевых параметра передаются без изменений.
Возвращаемые значения
| Значение | Тип | Описание |
|---|---|---|
ips | []net.IP или nil | Результаты запроса; нужен срез, массив Lua не принимается |
ttl | number или nil | TTL в секундах; при err == nil должен быть целым числом в диапазоне 0 .. 4294967295 |
err | error, string или nil | Только nil означает отсутствие ошибки |
Поведение
Ядро последовательно проверяет err, ttl и ips, останавливаясь при первой ошибке. Если err не равен nil, два остальных значения игнорируются. При отсутствии ошибки нужно указать допустимый TTL, даже если результат IP пуст.
Для пустого ответа используйте return nil, 0, nil. Ошибка должна быть в третьей позиции, например return nil, nil, "ошибка запроса".
| Результат скрипта | Действие ядра |
|---|---|
Проверка успешна, ips непустой | Запрос успешен |
err == nil, TTL допустим, но ips равен nil или пустому срезу | Запрос завершается неудачей с пустым ответом |
| Возвращена ошибка, неверный тип значения или исключение выполнения | Запрос завершается неудачей |
Пример
Можно напрямую передать все три возвращаемых значения serverObj:Query:
local dns = require("xray.dns")
local serverObj = dns.Servers[1]
function HandleDNSQuery(domain, ipv4, ipv6, fake)
return serverObj:Query(domain, ipv4, ipv6, fake)
end2
3
4
5
6