27 KiB
Встроенный DNS-сервер
DNS-сервер
Встроенный DNS-модуль Xray имеет два основных назначения:
-
Разрешение доменных имен в IP-адреса на этапе маршрутизации и сопоставление правил с полученными IP-адресами для разделения трафика.
Разрешение доменных имен и разделение трафика зависят от значения параметраdomainStrategy
в модуле конфигурации маршрутизации.
Встроенный DNS-сервер будет использоваться для DNS-запросов только при следующих значениях:- "IPIfNonMatch": при запросе доменного имени Xray сопоставляет его с доменами, указанными в правилах маршрутизации.
Если совпадение не найдено, встроенный DNS-сервер используется для разрешения доменного имени, а затем полученный IP-адрес снова сопоставляется с правилами маршрутизации на основе IP-адресов. - "IPOnDemand": при сопоставлении правил, основанных на IP-адресах, доменное имя немедленно разрешается в IP-адрес для сопоставления.
- "IPIfNonMatch": при запросе доменного имени Xray сопоставляет его с доменами, указанными в правилах маршрутизации.
-
Разрешение целевого адреса для подключения.
- Например, в исходящем подключении
freedom
, если параметрdomainStrategy
установлен вUseIP
, исходящие запросы будут сначала разрешать доменное имя в IP-адрес с помощью встроенного DNS-сервера, а затем устанавливать соединение. - Например, в
sockopt
, если параметрdomainStrategy
установлен вUseIP
, системные соединения, инициированные этим исходящим подключением, будут сначала разрешать доменное имя в IP-адрес с помощью встроенного DNS-сервера, а затем устанавливать соединение.
- Например, в исходящем подключении
::: tip Совет 1 DNS-запросы, отправляемые встроенным DNS-сервером, автоматически перенаправляются в соответствии с конфигурацией маршрутизации. :::
::: tip Совет 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:- По умолчанию выполняет "резервный (fallback) запрос DNS": запросы отправляются на "DNS-серверы, которые не использовались в предыдущем раунде неудачных запросов и для которых
skipFallback
имеет значение по умолчаниюfalse
".
Если запрос завершается неудачей илиexpectIPs
не совпадает, возвращается пустой результат.
В противном случае возвращается полученный IP-адрес. - Если
disableFallback
установлен вtrue
, "резервный (fallback) запрос DNS" не выполняется.
- По умолчанию выполняет "резервный (fallback) запрос DNS": запросы отправляются на "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 | ServerObject ]
Список DNS-серверов, поддерживаются два типа: адрес DNS (в виде строки) и ServerObject.
Значение "localhost"
означает использование локальных настроек DNS.
Если значение - это адрес DNS "IP:Port"
, например "8.8.8.8:53"
, Xray будет использовать указанный UDP-порт этого адреса для DNS-запросов.
Запрос будет следовать правилам маршрутизации.
Если порт не указан, по умолчанию используется порт 53.
Если значение имеет вид "tcp://host:port"
, например "tcp://8.8.8.8:53"
, Xray будет использовать DNS over TCP
для запросов.
Запрос будет следовать правилам маршрутизации.
Если порт не указан, по умолчанию используется порт 53.
Если значение имеет вид "tcp+local://host:port"
, например "tcp+local://8.8.8.8:53"
, Xray будет использовать локальный режим TCP (TCPL)
для запросов.
Это означает, что DNS-запросы не будут проходить через компонент маршрутизации, а будут отправляться непосредственно через исходящее подключение Freedom для сокращения времени ожидания.
Если порт не указан, по умолчанию используется порт 53.
Если значение имеет вид "https://host:port/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://host:port/dns-query"
, например "https+local://dns.google/dns-query"
, Xray будет использовать локальный режим DOH (DOHL)
для запросов.
Это означает, что DOH-запросы не будут проходить через компонент маршрутизации, а будут отправляться непосредственно через исходящее подключение Freedom для сокращения времени ожидания.
Обычно этот режим подходит для использования на сервере.
Также можно использовать нестандартные порты и пути.
Если значение имеет вид "quic+local://host"
, например "quic+local://dns.adguard.com"
, Xray будет использовать локальный режим DNS over QUIC (DOQL)
для запросов.
Это означает, что DNS-запросы не будут проходить через компонент маршрутизации, а будут отправляться непосредственно через исходящее подключение Freedom.
Этот режим требует, чтобы DNS-сервер поддерживал DNS over QUIC.
По умолчанию для запросов используется порт 853, можно использовать нестандартный порт.
Если значение равно fakedns
, для запросов будет использоваться FakeDNS.
::: tip Совет 1
При использовании localhost
локальные DNS-запросы не контролируются Xray.
Для того, чтобы DNS-запросы перенаправлялись через Xray, требуется дополнительная настройка.
:::
::: tip Совет 2
Разные DNS-клиенты, инициализированные разными правилами, будут отображаться в журнале запуска Xray с уровнем info
, например, local DOH
, remote DOH
, udp
и т.д.
:::
::: tip Совет 3 (v1.4.0+) Можно включить ведение журнала DNS-запросов в настройках журнала. :::
clientIp
: string
IP-адрес, который будет сообщаться серверу при выполнении DNS-запросов.
Не может быть частным IP-адресом.
::: tip Совет 1 Требуется, чтобы DNS-сервер поддерживал EDNS Client Subnet. :::
::: tip Совет 2
Можно указать clientIp
для всех DNS-серверов в DnsObject или для каждого DNS-сервера в ServerObject (настройка в ServerObject имеет приоритет над настройкой в 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 для всех доменов
}
::: tip Совет 1
Глобальное значение "queryStrategy"
имеет приоритет.
Если значение "queryStrategy"
в дочернем элементе конфликтует с глобальным значением "queryStrategy"
, дочерний запрос вернет пустой ответ.
:::
::: tip Совет 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"
.
Домены netflix будут разрешены с помощью https://1.1.1.1/dns-query
, и будут получены записи A.
disableCache
: true | false
true
- отключить кэширование DNS, по умолчанию false
(кэширование включено).
disableFallback
: true | false
true
- отключить резервные (fallback) DNS-запросы, по умолчанию false
(резервные запросы включены).
disableFallbackIfMatch
: true | false
true
- отключить резервные (fallback) DNS-запросы, если совпадает приоритетный список доменов DNS-сервера, по умолчанию false
(резервные запросы включены).
tag
: string
Трафик запросов, отправляемых встроенным DNS-сервером (кроме режимов localhost
, fakedns
, TCPL
, DOHL
и DOQL
), можно сопоставить с помощью этого тега, используя inboundTag
в правилах маршрутизации.
ServerObject
{
"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 (в виде строки) и ServerObject.
Значение "localhost"
означает использование локальных настроек DNS.
Если значение - это адрес DNS "IP"
, например "8.8.8.8"
, Xray будет использовать указанный UDP-порт этого адреса для DNS-запросов.
Запрос будет следовать правилам маршрутизации.
По умолчанию используется порт 53.
Если значение имеет вид "tcp://host"
, например "tcp://8.8.8.8"
, Xray будет использовать DNS over TCP
для запросов.
Запрос будет следовать правилам маршрутизации.
По умолчанию используется порт 53.
Если значение имеет вид "tcp+local://host"
, например "tcp+local://8.8.8.8"
, Xray будет использовать локальный режим TCP (TCPL)
для запросов.
Это означает, что DNS-запросы не будут проходить через компонент маршрутизации, а будут отправляться непосредственно через исходящее подключение Freedom для сокращения времени ожидания.
Если порт не указан, по умолчанию используется порт 53.
Если значение имеет вид "https://host:port/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://host:port/dns-query"
, например "https+local://dns.google/dns-query"
, Xray будет использовать локальный режим DOH (DOHL)
для запросов.
Это означает, что DOH-запросы не будут проходить через компонент маршрутизации, а будут отправляться непосредственно через исходящее подключение Freedom для сокращения времени ожидания.
Обычно этот режим подходит для использования на сервере.
Также можно использовать нестандартные порты и пути.
Если значение имеет вид "quic+local://host:port"
, например "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-адресов, формат такой же, как и в конфигурации маршрутизации.
Если этот параметр настроен, DNS Xray будет проверять возвращаемые IP-адреса и возвращать только те, которые входят в список expectIPs
.
Если этот параметр не настроен, IP-адреса возвращаются без изменений.
skipFallback
: true | false
true
- пропустить этот сервер при выполнении резервных (fallback) DNS-запросов, по умолчанию false
(не пропускать).