|
|
# Встроенный 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-адрес, а затем будет выполнено подключение.
|
|
|
|
|
|
::: 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:
|
|
|
- По умолчанию выполнит «откат DNS-запроса (fallback)»: DNS-серверы, которые не использовались в предыдущем неудачном запросе и для которых `skipFallback` имеет значение по умолчанию `false`, будут использоваться для запроса по очереди. Если запрос не удался или `expectIPs` не совпадает, то возвращается пустое разрешение; в противном случае возвращается разрешенный IP-адрес.
|
|
|
- Если `disableFallback` установлен в `true`, то «откат DNS-запроса (fallback)» выполняться не будет.
|
|
|
- Не совпадает ни с `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 | [DnsServerObject](#dnsserverobject) \]
|
|
|
|
|
|
Список DNS-серверов, поддерживается два типа: DNS-адрес (в виде строки) и [DnsServerObject](#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.
|
|
|
|
|
|
::: 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-запросов на сервер. Не может быть приватным адресом.
|
|
|
|
|
|
::: tip СОВЕТ 1
|
|
|
Требуется, чтобы DNS-сервер поддерживал EDNS Client Subnet.
|
|
|
:::
|
|
|
|
|
|
::: tip СОВЕТ 2
|
|
|
Вы можете указать `clientIp` для всех DNS-серверов в [DnsObject](#dnsobject), а также указать `clientIp` для каждого DNS-сервера в конфигурации [DnsServerObject](#dnsserverobject) (приоритет выше, чем у конфигурации [DnsObject](#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"`. Запись 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
|
|
|
|
|
|
```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-адрес (в виде строки) и 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\]
|
|
|
|
|
|
Список доменов. Домены из этого списка будут в первую очередь запрашиваться через этот сервер. Формат доменного имени такой же, как и в [конфигурации маршрутизации](./routing.md#ruleobject).
|
|
|
|
|
|
> `expectIPs`:\[string\]
|
|
|
|
|
|
Список диапазонов IP-адресов, формат такой же, как и в [конфигурации маршрутизации](./routing.md#ruleobject).
|
|
|
|
|
|
Если этот элемент настроен, Xray DNS будет проверять возвращаемые IP-адреса и возвращать только адреса, входящие в список `expectIPs`.
|
|
|
|
|
|
Если этот элемент не настроен, IP-адреса будут возвращены как есть.
|
|
|
|
|
|
> `skipFallback`: true | false
|
|
|
|
|
|
`true` - этот сервер будет пропущен при выполнении отката DNS-запроса (fallback), по умолчанию `false`, то есть сервер не будет пропущен.
|