Встроенный DNS-сервер
DNS-сервер
Встроенный DNS-модуль Xray имеет два основных назначения:
На этапе маршрутизации: разрешает доменные имена в IP-адреса и выполняет сопоставление правил на основе полученных IP-адресов для разделения трафика. Разрешение доменных имен и разделение трафика зависят от значения
domainStrategy
в конфигурации модуля маршрутизации. Встроенный DNS-сервер будет использоваться для DNS-запросов только в том случае, если установлено одно из следующих двух значений:"IPIfNonMatch"
: при запросе доменного имени выполняется сопоставление домена в маршрутизации, если совпадение не найдено, для этого доменного имени используется встроенный DNS-сервер для выполнения DNS-запроса, и возвращенный IP-адрес используется для повторного сопоставления IP-маршрутизации."IPOnDemand"
: при обнаружении любого правила на основе IP-адреса доменное имя немедленно разрешается в IP-адрес для сопоставления.
Разрешает целевой адрес для подключения.
- Например, если в исходящем подключении
freedom
установитьdomainStrategy
равнымUseIP
, то запросы, отправленные этим исходящим подключением, сначала будут разрешены во встроенном сервере из доменного имени в IP-адрес, а затем будет выполнено подключение. - Например, если в
sockopt
установитьdomainStrategy
равнымUseIP
, то системные подключения, инициированные этим исходящим подключением, сначала будут разрешены во встроенном сервере из доменного имени в IP-адрес, а затем будет выполнено подключение.
- Например, если в исходящем подключении
СОВЕТ 1
DNS-запросы, отправляемые встроенным DNS-сервером, автоматически перенаправляются в соответствии с конфигурацией маршрутизации.
СОВЕТ 2
Поддерживаются только основные IP-запросы (записи A и AAAA), записи CNAME будут запрашиваться повторно до тех пор, пока не будет возвращена запись A/AAAA. Другие запросы не будут передаваться на встроенный DNS-сервер.
Процесс обработки DNS
Если запрашиваемое доменное имя:
- Совпадает с сопоставлением «доменное имя - IP», «доменное имя - массив IP» в
hosts
, то этот IP или массив IP возвращается в качестве результата разрешения DNS. - Совпадает с сопоставлением «доменное имя - доменное имя» в
hosts
, то значение этого сопоставления (другое доменное имя) будет использоваться в качестве текущего запрашиваемого доменного имени, и процесс обработки DNS будет продолжаться до тех пор, пока не будет разрешен IP-адрес или возвращено пустое разрешение. - Не совпадает с
hosts
, но совпадает с одним (несколькими) списками доменовdomains
на DNS-серверах, то в соответствии с приоритетом совпадающих правил, DNS-серверы, соответствующие этим правилам, будут использоваться для запроса по очереди. Если запрос к DNS-серверу не удался илиexpectIPs
не совпадает, то для запроса будет использоваться следующий DNS-сервер. В противном случае возвращается разрешенный IP-адрес. Если запрос ко всем совпадающим DNS-серверам не удался илиexpectIPs
не совпадает, то компонент DNS:- По умолчанию выполнит «откат DNS-запроса (fallback)»: DNS-серверы, которые не использовались в предыдущем неудачном запросе и для которых
skipFallback
имеет значение по умолчаниюfalse
, будут использоваться для запроса по очереди. Если запрос не удался илиexpectIPs
не совпадает, то возвращается пустое разрешение; в противном случае возвращается разрешенный IP-адрес. - Если
disableFallback
установлен вtrue
, то «откат DNS-запроса (fallback)» выполняться не будет.
- По умолчанию выполнит «откат DNS-запроса (fallback)»: DNS-серверы, которые не использовались в предыдущем неудачном запросе и для которых
- Не совпадает ни с
hosts
, ни со списками доменовdomains
на DNS-серверах, то:- По умолчанию DNS-серверы, для которых
skipFallback
имеет значение по умолчаниюfalse
, будут использоваться для запроса по очереди. Если запрос к первому выбранному DNS-серверу не удался илиexpectIPs
не совпадает, то для запроса будет использоваться следующий выбранный DNS-сервер. В противном случае возвращается разрешенный IP-адрес. Если запрос ко всем выбранным DNS-серверам не удался илиexpectIPs
не совпадает, то возвращается пустое разрешение. - Если количество DNS-серверов, для которых
skipFallback
имеет значение по умолчаниюfalse
, равно 0 илиdisableFallback
установлен вtrue
, то для запроса будет использоваться первый DNS-сервер в конфигурации DNS. Если запрос не удался илиexpectIPs
не совпадает, то возвращается пустое разрешение; в противном случае возвращается разрешенный IP-адрес.
- По умолчанию DNS-серверы, для которых
DnsObject
DnsObject
соответствует элементу dns
в файле конфигурации.
{
"dns": {
"hosts": {
"baidu.com": "127.0.0.1",
"dns.google": ["8.8.8.8", "8.8.4.4"]
},
"servers": [
"8.8.8.8",
"8.8.4.4",
{
"address": "1.2.3.4",
"port": 5353,
"domains": ["domain:xray.com"],
"expectIPs": ["geoip:cn"],
"skipFallback": false,
"clientIP": "1.2.3.4"
},
{
"address": "https://8.8.8.8/dns-query",
"domains": [
"geosite:netflix"
],
"skipFallback": true,
"queryStrategy": "UseIPv4"
},
{
"address": "https://1.1.1.1/dns-query",
"domains": [
"geosite:openai"
],
"skipFallback": true,
"queryStrategy": "UseIPv6"
},
"localhost"
],
"clientIp": "1.2.3.4",
"queryStrategy": "UseIP",
"disableCache": false,
"disableFallback": false,
"disableFallbackIfMatch": false,
"tag": "dns_inbound"
}
}
hosts
: map{string: address} | map{string: [address]}
Статический список IP-адресов, значением которого является серия "доменное имя": "адрес" или "доменное имя": ["адрес 1","адрес 2"]. Где адрес может быть IP-адресом или доменным именем. При разрешении доменного имени, если доменное имя соответствует элементу в этом списке:
- Если адрес элемента является IP-адресом, то результатом разрешения будет IP-адрес этого элемента.
- Если адрес элемента является доменным именем, то для разрешения IP-адреса будет использоваться это доменное имя, а не исходное доменное имя.
- Если в адресе установлено несколько IP-адресов и доменных имен, то будет возвращено только первое доменное имя, остальные IP-адреса и доменные имена будут проигнорированы.
Формат доменного имени может быть следующим:
- Простая строка: правило вступает в силу, если эта строка полностью совпадает с целевым доменным именем. Например, "xray.com" соответствует "xray.com", но не соответствует "www.xray.com".
- Регулярное выражение: начинается с
"regexp:"
, остальная часть является регулярным выражением. Правило вступает в силу, если это регулярное выражение соответствует целевому доменному имени. Например, "regexp:\\.goo.*\\.com$" соответствует "www.google.com", "fonts.googleapis.com", но не соответствует "google.com". - Поддомен (рекомендуется): начинается с
"domain:"
, остальная часть является доменным именем. Правило вступает в силу, если это доменное имя является целевым доменным именем или его поддоменом. Например, "domain:xray.com" соответствует "www.xray.com" и "xray.com", но не соответствует "wxray.com". - Подстрока: начинается с
"keyword:"
, остальная часть является строкой. Правило вступает в силу, если эта строка соответствует любой части целевого доменного имени. Например, "keyword:sina.com" может соответствовать "sina.com", "sina.com.cn" и "www.sina.com", но не соответствует "sina.cn". - Предопределенный список доменов: начинается с
"geosite:"
, остальная часть является именем, например,geosite:google
илиgeosite:cn
. Имена и списки доменов см. в разделе Предопределенные списки доменов.
servers
: [string | DnsServerObject ]
Список DNS-серверов, поддерживается два типа: DNS-адрес (в виде строки) и DnsServerObject.
Значение "localhost"
означает использование предустановленной конфигурации DNS на локальной машине.
Если значением является DNS-адрес "IP:Порт"
, например, "8.8.8.8:53"
, Xray будет использовать указанный UDP-порт этого адреса для DNS-запросов. Этот запрос следует правилам маршрутизации. Если порт не указан, по умолчанию используется порт 53.
Если значение имеет вид "tcp://хост:порт"
, например, "tcp://8.8.8.8:53"
, Xray будет использовать DNS over TCP
для запроса. Этот запрос следует правилам маршрутизации. Если порт не указан, по умолчанию используется порт 53.
Если значение имеет вид "tcp+local://хост:порт"
, например, "tcp+local://8.8.8.8:53"
, Xray будет использовать локальный режим TCP (TCPL)
для запроса. Это означает, что DNS-запрос не будет проходить через компонент маршрутизации, а будет отправляться непосредственно через исходящее подключение Freedom, чтобы сократить время ожидания. Если порт не указан, по умолчанию используется порт 53.
Если значение имеет вид "https://хост:порт/dns-query"
, например, "https://dns.google/dns-query"
, Xray будет использовать DNS over HTTPS
(RFC8484, сокращенно DOH) для запроса. Некоторые провайдеры имеют сертификаты с псевдонимами IP-адресов, можно напрямую указывать IP-адрес, например, https://1.1.1.1/dns-query
. Также можно использовать нестандартные порты и пути, например, "https://a.b.c.d:8443/my-dns-query"
.
Если значение имеет вид "https+local://хост:порт/dns-query"
, например, "https+local://dns.google/dns-query"
, Xray будет использовать локальный режим DOH (DOHL)
для запроса. Это означает, что DOH-запрос не будет проходить через компонент маршрутизации, а будет отправляться непосредственно через исходящее подключение Freedom, чтобы сократить время ожидания. Обычно подходит для использования на сервере. Также можно использовать нестандартные порты и пути.
Если значение имеет вид "quic+local://хост"
, например, "quic+local://dns.adguard.com"
, Xray будет использовать локальный режим DNS over QUIC (DOQL)
для запроса. Это означает, что DNS-запрос не будет проходить через компонент маршрутизации, а будет отправляться непосредственно через исходящее подключение Freedom. Этот метод требует, чтобы DNS-сервер поддерживал DNS over QUIC. По умолчанию для запроса используется порт 853, можно использовать нестандартный порт.
Если значением является fakedns
, то для запроса будет использоваться функция FakeDNS.
СОВЕТ 1
При использовании localhost
DNS-запросы локальной машины не контролируются Xray, для того чтобы DNS-запросы перенаправлялись Xray, требуется дополнительная настройка.
СОВЕТ 2
Инициализированные DNS-клиенты для различных правил отображаются в журнале запуска Xray с уровнем info
, например, режимы local DOH
, remote DOH
и udp
.
СОВЕТ 3
(v1.4.0+) Вы можете включить ведение журнала DNS-запросов в журнале.
clientIp
: string
Используется для указания IP-адреса клиента при отправке DNS-запросов на сервер. Не может быть приватным адресом.
СОВЕТ 1
Требуется, чтобы DNS-сервер поддерживал EDNS Client Subnet.
СОВЕТ 2
Вы можете указать clientIp
для всех DNS-серверов в DnsObject, а также указать clientIp
для каждого DNS-сервера в конфигурации DnsServerObject (приоритет выше, чем у конфигурации DnsObject).
queryStrategy
: "UseIP" | "UseIPv4" | "UseIPv6"
Значение по умолчанию UseIP
запрашивает как записи A, так и записи AAAA. UseIPv4
запрашивает только записи A; UseIPv6
запрашивает только записи AAAA.
Новая функция в Xray-core v1.8.6: queryStrategy
можно установить отдельно для каждого DNS
сервера.
"dns": {
"servers": [
"https://1.1.1.1/dns-query",
{
"address": "https://8.8.8.8/dns-query",
"domains": [
"geosite:netflix"
],
"skipFallback": true,
"queryStrategy": "UseIPv4" // запрос записей A для домена netflix
},
{
"address": "https://1.1.1.1/dns-query",
"domains": [
"geosite:openai"
],
"skipFallback": true,
"queryStrategy": "UseIPv6" // запрос записей AAAA для домена openai
}
],
"queryStrategy": "UseIP" // запрос записей A и AAAA для всех остальных доменов
}
СОВЕТ 1
Глобальное значение "queryStrategy"
имеет приоритет. Если значение "queryStrategy"
в дочернем элементе конфликтует с глобальным значением "queryStrategy"
, запрос дочернего элемента вернет пустой ответ.
СОВЕТ 2
Если параметр "queryStrategy"
не указан в дочернем элементе, используется значение глобального параметра "queryStrategy"
. Поведение аналогично версиям Xray-core до v1.8.6.
Например:
Глобальное значение "queryStrategy": "UseIPv6"
конфликтует с дочерним значением "queryStrategy": "UseIPv4"
.
Глобальное значение "queryStrategy": "UseIPv4"
конфликтует с дочерним значением "queryStrategy": "UseIPv6"
.
Глобальное значение "queryStrategy": "UseIP"
не конфликтует с дочерним значением "queryStrategy": "UseIPv6"
.
Глобальное значение "queryStrategy": "UseIP"
не конфликтует с дочерним значением "queryStrategy": "UseIPv4"
.
"dns": {
"servers": [
"https://1.1.1.1/dns-query",
{
"address": "https://8.8.8.8/dns-query",
"domains": [
"geosite:netflix"
],
"skipFallback": true,
"queryStrategy": "UseIPv6" // конфликт между глобальным значением "UseIPv4" и дочерним значением "UseIPv6"
}
],
"queryStrategy": "UseIPv4"
}
Запрос домена netflix вернет пустой ответ из-за конфликта значений "queryStrategy"
. Запись A для домена netflix будет получена от https://1.1.1.1/dns-query
.
disableCache
: true | false
true
отключает кэширование DNS, по умолчанию false
, то есть кэширование включено.
disableFallback
: true | false
true
отключает откат DNS-запросов (fallback), по умолчанию false
, то есть откат включен.
disableFallbackIfMatch
: true | false
true
отключает откат DNS-запросов (fallback), если сработал список доменов с приоритетным сопоставлением для DNS-сервера, по умолчанию false
, то есть откат включен.
tag
: string
Трафик запросов, отправляемых встроенным DNS, за исключением режимов localhost
, fakedns
, TCPL
, DOHL
и DOQL
, можно сопоставить в маршрутизации с помощью inboundTag
по этому тегу.
DnsServerObject
{
"address": "1.2.3.4",
"port": 5353,
"domains": ["domain:xray.com"],
"expectIPs": ["geoip:cn"],
"skipFallback": false,
"clientIP": "1.2.3.4"
}
address
: address
Список DNS-серверов, поддерживается два типа: DNS-адрес (в виде строки) и DnsServerObject.
Значение "localhost"
означает использование предустановленной конфигурации DNS на локальной машине.
Если значением является DNS-адрес "IP"
, например, "8.8.8.8"
, Xray будет использовать указанный UDP-порт этого адреса для DNS-запросов. Этот запрос следует правилам маршрутизации. По умолчанию используется порт 53.
Если значение имеет вид "tcp://хост"
, например, "tcp://8.8.8.8"
, Xray будет использовать DNS over TCP
для запроса. Этот запрос следует правилам маршрутизации. По умолчанию используется порт 53.
Если значение имеет вид "tcp+local://хост"
, например, "tcp+local://8.8.8.8"
, Xray будет использовать локальный режим TCP (TCPL)
для запроса. Это означает, что DNS-запрос не будет проходить через компонент маршрутизации, а будет отправляться непосредственно через исходящее подключение Freedom, чтобы сократить время ожидания. Если порт не указан, по умолчанию используется порт 53.
Если значение имеет вид "https://хост:порт/dns-query"
, например, "https://dns.google/dns-query"
, Xray будет использовать DNS over HTTPS
(RFC8484, сокращенно DOH) для запроса. Некоторые провайдеры имеют сертификаты с псевдонимами IP-адресов, можно напрямую указывать IP-адрес, например, https://1.1.1.1/dns-query
. Также можно использовать нестандартные порты и пути, например, "https://a.b.c.d:8443/my-dns-query"
.
Если значение имеет вид "https+local://хост:порт/dns-query"
, например, "https+local://dns.google/dns-query"
, Xray будет использовать локальный режим DOH (DOHL)
для запроса. Это означает, что DOH-запрос не будет проходить через компонент маршрутизации, а будет отправляться непосредственно через исходящее подключение Freedom, чтобы сократить время ожидания. Обычно подходит для использования на сервере. Также можно использовать нестандартные порты и пути.
Если значение имеет вид "quic+local://хост:порт"
, например, "quic+local://dns.adguard.com"
, Xray будет использовать локальный режим DOQ (DOQL)
для запроса. Это означает, что DNS-запрос не будет проходить через компонент маршрутизации, а будет отправляться непосредственно через исходящее подключение Freedom. Этот метод требует, чтобы DNS-сервер поддерживал DNS over QUIC. По умолчанию для запроса используется порт 853, можно использовать нестандартный порт.
Если значением является fakedns
, то для запроса будет использоваться функция FakeDNS.
port
: number
Порт DNS-сервера, например, 53
. Если этот элемент не указан, по умолчанию используется значение 53
. Этот элемент не используется в режимах DOH, DOHL, DOQL, нестандартный порт должен быть указан в URL.
domains
: [string]
Список доменов. Домены из этого списка будут в первую очередь запрашиваться через этот сервер. Формат доменного имени такой же, как и в конфигурации маршрутизации.
expectIPs
:[string]
Список диапазонов IP-адресов, формат такой же, как и в конфигурации маршрутизации.
Если этот элемент настроен, Xray DNS будет проверять возвращаемые IP-адреса и возвращать только адреса, входящие в список expectIPs
.
Если этот элемент не настроен, IP-адреса будут возвращены как есть.
skipFallback
: true | false
true
- этот сервер будет пропущен при выполнении отката DNS-запроса (fallback), по умолчанию false
, то есть сервер не будет пропущен.