Встроенный 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-адрес, а затем будет выполнено подключение.

СОВЕТ 1

DNS-запросы, отправляемые встроенным DNS-сервером, автоматически перенаправляются в соответствии с конфигурацией маршрутизации.

СОВЕТ 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 в файле конфигурации.

{
  "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 | DnsServerObject ]

Список DNS-серверов, поддерживается два типа: DNS-адрес (в виде строки) и 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.

СОВЕТ 1

При использовании localhost DNS-запросы локальной машины не контролируются Xray, для того чтобы DNS-запросы перенаправлялись Xray, требуется дополнительная настройка.

СОВЕТ 2

Инициализированные DNS-клиенты для различных правил отображаются в журнале запуска Xray с уровнем info, например, режимы local DOH, remote DOH и udp.

СОВЕТ 3

(v1.4.0+) Вы можете включить ведение журнала DNS-запросов в журнале.

clientIp: string

Используется для указания IP-адреса клиента при отправке DNS-запросов на сервер. Не может быть приватным адресом.

СОВЕТ 1

Требуется, чтобы DNS-сервер поддерживал EDNS Client Subnet.

СОВЕТ 2

Вы можете указать clientIp для всех DNS-серверов в DnsObject, а также указать clientIp для каждого DNS-сервера в конфигурации DnsServerObject (приоритет выше, чем у конфигурации 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 для всех остальных доменов
    }

СОВЕТ 1

Глобальное значение "queryStrategy" имеет приоритет. Если значение "queryStrategy" в дочернем элементе конфликтует с глобальным значением "queryStrategy", запрос дочернего элемента вернет пустой ответ.

СОВЕТ 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". Запись 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

{
  "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]

Список доменов. Домены из этого списка будут в первую очередь запрашиваться через этот сервер. Формат доменного имени такой же, как и в конфигурации маршрутизации.

expectIPs:[string]

Список диапазонов IP-адресов, формат такой же, как и в конфигурации маршрутизации.

Если этот элемент настроен, Xray DNS будет проверять возвращаемые IP-адреса и возвращать только адреса, входящие в список expectIPs.

Если этот элемент не настроен, IP-адреса будут возвращены как есть.

skipFallback: true | false

true - этот сервер будет пропущен при выполнении отката DNS-запроса (fallback), по умолчанию false, то есть сервер не будет пропущен.