You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

345 lines
27 KiB

This file contains ambiguous Unicode characters!

This file contains ambiguous Unicode characters that may be confused with others in your current locale. If your use case is intentional and legitimate, you can safely ignore this warning. Use the Escape button to highlight these characters.

# Встроенный 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` (не пропускать).