#
Встроенный 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, но соответствует списку доменов в одном (или нескольких) DNS-серверах вdomains, то в соответствии с приоритетом правил, последовательно используются DNS-серверы, соответствующие этому правилу, для запроса. Если запрос на сервере DNS, соответствующем правилу, не удался илиexpectIPsне соответствует, используется следующий соответствующий сервер DNS; в противном случае возвращается разрешенный IP. Если все соответствующие серверы DNS не удались илиexpectIPsне соответствует, тогда компонент DNS:- По умолчанию проводит 'DNS-запрос с откатом (fallback)': использует серверы DNS, которые «не были использованы в предыдущем неудачном запросе и для которых
skipFallbackимеет значение false по умолчанию», для последовательного запроса. Если запрос не удался илиexpectIPsне соответствует, возвращается пустое разрешение; в противном случае возвращается разрешенный IP. - Если
disableFallbackустановлен вtrue, то 'DNS-запрос с откатом (fallback)' не проводится.
- По умолчанию проводит 'DNS-запрос с откатом (fallback)': использует серверы DNS, которые «не были использованы в предыдущем неудачном запросе и для которых
Не соответствует ни
hosts, ни списку доменов в DNS-серверахdomains, то:- **По умолчанию используются '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 | 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, что сокращает время ожидания"dns": {
"servers": [
"https://1.1.1.1/dns-query",
{
"address": "https://8.8.8.8/dns-query",
"domains": [
"geosite:netflix"
],
"
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.
port: number
- Порт сервера DNS, например 53. Если порт не указан, по умолчанию используется 53. При использовании DOH, DOHL, DOQL порт не учитывается, нестандартные порты должны быть указаны в URL.
domains: [string]
- Список доменных имен, запросы на которые будут направлены на этот сервер DNS. Формат доменных имен аналогичен тому, что используется в настройках маршрутизации.
expectIPs: [string]
- Список диапазонов IP-адресов, аналогичный тому, что используется в настройках маршрутизации. Когда задан, Xray DNS проверит IP-адреса в возвращаемом ответе и вернет только те, которые включены в список
expectIPs. Если этот параметр не задан, IP-адреса возвращаются без изменений.
skipFallback: true | false
trueозначает, что этот сервер DNS будет пропущен при запросах DNS с откатом (fallback). По умолчаниюfalse, то есть сервер не будет пропущен.
clientIP: string
IP-адрес клиента, используемый для запросов DNS. Этот параметр не должен быть частным адресом.clientIP: string
• IP-адрес клиента, используемый при DNS-запросах для информирования сервера о местоположении клиента. Это не должен быть частный IP-адрес.
ПОДСКАЗКА
Требуется поддержка EDNS Client Subnet со стороны DNS-сервера для использования этой функции.
ServerObject является более сложной конфигурацией для DNS-сервера, позволяя настроить не только адрес и порт, но и специфические домены для запросов, ожидаемые IP-адреса, а также определение поведения при fallback-запросах и указание клиентского IP.
Пример конфигурации ServerObject:
{ "address": "1.1.1.1", "port": 53, "domains": ["domain:xray.com"], "expectIPs": ["geoip:us"], "skipFallback": true, "clientIP": "2.2.2.2" }
В этом примере сервер DNS с адресом 1.1.1.1 и портом 53 будет использоваться для запросов доменов, соответствующих “domain:xray.com”. Он также будет проверять, соответствуют ли возвращаемые IP-адреса геолокации США (geoip:us). Если запрос не удастся или возвращаемые IP не соответствуют ожидаемым, запрос будет пропущен (skipFallback: true). Запрос будет отправлен, как если бы он происходил от IP-адреса 2.2.2.2.
Эта конфигурация позволяет тонко настраивать поведение DNS в Xray, обеспечивая большую гибкость в управлении сетевым трафиком и решении различных сетевых задач.
ПОДСКАЗКА
Эти настройки особенно полезны в сложных сетевых сценариях, где требуется точное управление DNS-запросами и их маршрутизацией.