# Встроенный DNS-сервер

Встроенный модуль DNS в Xray, в основном, используется для двух целей:

  • На этапе маршрутизации: Разрешает доменные имена в IP-адреса, и на основе полученных IP-адресов производит соответствие правилам для разделения трафика. Разрешение доменных имен и разделение трафика зависят от значения domainStrategy в модуле настройки маршрутизации. Встроенный DNS-сервер используется для DNS-запросов только при установке следующих значений:

    • "IPIfNonMatch": При запросе домена сначала производится попытка соответствия домену в маршрутизации. Если соответствие не найдено, то для этого домена используется встроенный DNS-сервер для DNS-запроса, и полученный IP-адрес снова используется для соответствия IP-маршрутизации.
    • "IPOnDemand": При соответствии на основе любых правил, основанных на IP, доменное имя немедленно разрешается в IP для соответствия.
  • Для разрешения целевых адресов при подключении:

    • Например, в настройках исходящего соединения freedom, если domainStrategy установлен в UseIP, запросы, исходящие от этого соединения, сначала разрешают доменное имя через встроенный сервер в IP, а затем подключаются.
    • Также, в настройках sockopt, если domainStrategy установлен в UseIP, системные соединения, инициированные этим выходом, сначала разрешаются через встроенный сервер в IP, а затем подключаются.

# Процесс обработки 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)' не проводится.
  • Не соответствует ни hosts, ни списку доменов в DNS-серверах domains, то:

    • **По умолчанию используются '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 | 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-адрес.

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, обеспечивая большую гибкость в управлении сетевым трафиком и решении различных сетевых задач.