|
|
# Встроенный DNS-сервер
|
|
|
|
|
|
## DNS-сервер
|
|
|
|
|
|
Встроенный DNS-модуль Xray имеет два основных назначения:
|
|
|
|
|
|
- Разрешение доменных имен в IP-адреса на этапе маршрутизации и сопоставление правил с полученными IP-адресами для разделения трафика.
|
|
|
Разрешение доменных имен и разделение трафика зависят от значения параметра `domainStrategy` в модуле конфигурации маршрутизации.
|
|
|
Встроенный DNS-сервер будет использоваться для DNS-запросов только при следующих значениях:
|
|
|
|
|
|
- "IPIfNonMatch": при запросе доменного имени Xray сопоставляет его с доменами, указанными в правилах маршрутизации.
|
|
|
Если совпадение не найдено, встроенный DNS-сервер используется для разрешения доменного имени, а затем полученный IP-адрес снова сопоставляется с правилами маршрутизации на основе IP-адресов.
|
|
|
- "IPOnDemand": при сопоставлении правил, основанных на IP-адресах, доменное имя немедленно разрешается в IP-адрес для сопоставления.
|
|
|
|
|
|
- Разрешение целевого адреса для подключения.
|
|
|
- Например, в исходящем подключении `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" не выполняется.
|
|
|
- Не соответствует `hosts` и не соответствует списку доменов `domains` ни одного DNS-сервера, то:
|
|
|
- По умолчанию запросы отправляются на "DNS-серверы, для которых `skipFallback` имеет значение по умолчанию `false`".
|
|
|
Если запрос к первому выбранному DNS-серверу завершается неудачей или `expectIPs` не совпадает, используется следующий выбранный DNS-сервер.
|
|
|
В противном случае возвращается полученный IP-адрес.
|
|
|
Если запросы ко всем выбранным DNS-серверам завершаются неудачей или `expectIPs` не совпадает, возвращается пустой результат.
|
|
|
- Если количество "DNS-серверов, для которых `skipFallback` имеет значение по умолчанию `false`", равно 0 или `disableFallback` установлен в `true`, используется первый DNS-сервер в конфигурации DNS.
|
|
|
Если запрос завершается неудачей или `expectIPs` не совпадает, возвращается пустой результат.
|
|
|
В противном случае возвращается полученный IP-адрес.
|
|
|
|
|
|
## DnsObject
|
|
|
|
|
|
`DnsObject` соответствует полю `dns` в конфигурационном файле.
|
|
|
|
|
|
```json
|
|
|
{
|
|
|
"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`.
|
|
|
Список имен и доменов см. в разделе [Предопределенные списки доменов](./routing.md#предопределенные-списки-доменов).
|
|
|
|
|
|
> `servers`: \[string | [ServerObject](#serverobject) \]
|
|
|
|
|
|
Список DNS-серверов, поддерживаются два типа: адрес DNS (в виде строки) и [ServerObject](#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-запросов в [настройках журнала](./log.md).
|
|
|
:::
|
|
|
|
|
|
> `clientIp`: string
|
|
|
|
|
|
IP-адрес, который будет сообщаться серверу при выполнении DNS-запросов.
|
|
|
Не может быть частным IP-адресом.
|
|
|
|
|
|
::: tip Совет 1
|
|
|
Требуется, чтобы DNS-сервер поддерживал EDNS Client Subnet.
|
|
|
:::
|
|
|
|
|
|
::: tip Совет 2
|
|
|
Можно указать `clientIp` для всех DNS-серверов в [DnsObject](#dnsobject) или для каждого DNS-сервера в [ServerObject](#serverobject) (настройка в ServerObject имеет приоритет над настройкой в DnsObject).
|
|
|
:::
|
|
|
|
|
|
> `queryStrategy`: "UseIP" | "UseIPv4" | "UseIPv6"
|
|
|
|
|
|
Значение по умолчанию - `UseIP`, запрашиваются как записи A, так и записи AAAA.
|
|
|
`UseIPv4` - запрашиваются только записи A; `UseIPv6` - запрашиваются только записи AAAA.
|
|
|
|
|
|
Новая функция в Xray-core v1.8.6: `queryStrategy` можно настроить для каждого `DNS`-сервера.
|
|
|
|
|
|
```json
|
|
|
"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.
|
|
|
:::
|
|
|
|
|
|
Например:<br>
|
|
|
Глобальное значение `"queryStrategy": "UseIPv6"` конфликтует с дочерним значением `"queryStrategy": "UseIPv4"`.<br>
|
|
|
Глобальное значение `"queryStrategy": "UseIPv4"` конфликтует с дочерним значением `"queryStrategy": "UseIPv6"`.<br>
|
|
|
Глобальное значение `"queryStrategy": "UseIP"` не конфликтует с дочерним значением `"queryStrategy": "UseIPv6"`.<br>
|
|
|
Глобальное значение `"queryStrategy": "UseIP"` не конфликтует с дочерним значением `"queryStrategy": "UseIPv4"`.
|
|
|
|
|
|
```json
|
|
|
"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
|
|
|
|
|
|
```json
|
|
|
{
|
|
|
"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\]
|
|
|
|
|
|
Список доменов, для которых в первую очередь будет использоваться этот сервер.
|
|
|
Формат доменных имен такой же, как и в [конфигурации маршрутизации](./routing.md#ruleobject).
|
|
|
|
|
|
> `expectIPs`: \[string\]
|
|
|
|
|
|
Список диапазонов IP-адресов, формат такой же, как и в [конфигурации маршрутизации](./routing.md#ruleobject).
|
|
|
|
|
|
Если этот параметр настроен, DNS Xray будет проверять возвращаемые IP-адреса и возвращать только те, которые входят в список `expectIPs`.
|
|
|
|
|
|
Если этот параметр не настроен, IP-адреса возвращаются без изменений.
|
|
|
|
|
|
> `skipFallback`: true | false
|
|
|
|
|
|
`true` - пропустить этот сервер при выполнении резервных (fallback) DNS-запросов, по умолчанию `false` (не пропускать).
|
|
|
|
|
|
|
|
|
|
|
|
|