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

Совет 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:
    • По умолчанию выполняет "резервный (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 в конфигурационном файле.

{
  "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 | 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 для сокращения времени ожидания.
Если порт не указан, по умолчанию используется порт 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.

Совет 1

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

Совет 2

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

Совет 3

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

clientIp: string

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

Совет 1

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

Совет 2

Можно указать clientIp для всех DNS-серверов в DnsObject или для каждого DNS-сервера в ServerObject (настройка в ServerObject имеет приоритет над настройкой в 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".
Домены 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

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

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

expectIPs: [string]

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

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

Если этот параметр не настроен, IP-адреса возвращаются без изменений.

skipFallback: true | false

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