# DNS DNS — это исходящий протокол, который принимает DNS-запросы, переданные routing, и пересылает или обрабатывает их по правилам. Этот outbound поддерживает только традиционный открытый DNS, то есть запросы по UDP и TCP; нестандартные для него варианты, такие как DoH, DoT и DoQ, к этому outbound не применимы. Типичные сценарии: TUN, прозрачный прокси или `tunnel` принимают DNS-трафик, после чего routing направляет его в этот outbound. По правилам он может пропускать запросы к целевому DNS-серверу, выполнять `hijack` во встроенный [DNS-сервер](../dns.md) для дальнейшей обработки, отбрасывать запросы или возвращать ответы с указанным RCODE. Также он может изменять целевой адрес, порт и транспортный протокол. ## OutboundConfigurationObject `OutboundConfigurationObject` соответствует элементу `settings` в [`OutboundObject`](../outbound.md). ```json { "outbounds": [ { // ... "protocol": "dns", // [!code focus:18] "settings": { "rewriteNetwork": "udp", "rewriteAddress": "1.1.1.1", "rewritePort": 53, "userLevel": 0, "rules": [ { "action": "return", "rCode": 5, "domain": ["domain:example.com"] }, { "action": "direct", "qType": 65, "domain": ["geosite:geolocation-!cn"] } ] } } ] } ``` Пример выше только демонстрирует синтаксис полей. Полную конфигурацию см. в примере ниже. > `rewriteNetwork`: [ "tcp" | "udp" ] Изменяет транспортный протокол DNS-трафика. Допустимые значения: `"tcp"` и `"udp"`. Если не указано, исходный транспортный способ сохраняется. > `rewriteAddress`: address Изменяет адрес DNS-сервера. Если не указано, сохраняется адрес, указанный источником. > `rewritePort`: number Изменяет порт DNS-сервера. Если не указано, сохраняется порт, указанный источником. > `userLevel`: number Уровень пользователя. Соединения будут использовать [локальную политику](../policy.md#levelpolicyobject), соответствующую этому уровню пользователя. Значение `userLevel` соответствует значению `level` в [policy](../policy.md#policyobject). Если не указано, по умолчанию используется `0`. > `rules`: \[[RuleObject](#ruleobject)\] DNS-запросы сопоставляются с правилами по порядку; поддерживается детальное управление по `qType` и `domain`. Если ни одно правило не совпало, используется встроенное правило по умолчанию: запросы A и AAAA направляются во встроенный DNS-модуль, а запросы других типов получают пустой ответ с RCODE `0`. ### RuleObject ```json { "action": "return", "qType": 65, "rCode": 5, "domain": ["domain:example.com"] } ``` Все условия сопоставления внутри правила объединяются логикой AND. Если условие не указано, ограничение по этому условию не применяется. > `action`: [ "direct" | "hijack" | "drop" | "return" ] Определяет действие при совпадении правила. - `direct`: напрямую пропускает запрос к целевому DNS-серверу. Если на уровне outbound также настроены `rewriteNetwork`, `rewriteAddress` или `rewritePort`, запрос пересылается к измененной цели. - `hijack`: направляет запрос во встроенный [DNS-сервер](../dns.md) для дальнейшей обработки. Это можно использовать для дополнительного разделения трафика через конфигурацию встроенного DNS. В настоящее время поддерживаются только записи A и AAAA. - `drop`: напрямую отбрасывает запрос и не возвращает ответ. - `return`: возвращает DNS-ответ, код которого задается через `rCode`. По сравнению с `drop`, это может предотвратить долгое ожидание DNS timeout или повторные попытки у некоторых приложений. > `qType`: number | string Сопоставляет типы DNS-запросов. Формы записи: - Целое число: конкретный тип запроса, например `"qType": 1` соответствует запросу A, `"qType": 28` — запросу AAAA. - Строка: может быть строкой только из цифр, например `"qType": "28"`; или диапазоном значений, например `"qType": "5-10"` — это типы с 5 по 10, всего 6 типов. Можно использовать запятую для разделения, например `11,13,15-17` — это 5 типов: тип 11, тип 13 и типы с 15 по 17. Конкретные номера типов смотрите в [документации IANA](https://www.iana.org/assignments/dns-parameters/dns-parameters.xhtml). > `rCode`: number DNS RCODE, используемый при возврате ответа, в диапазоне от `0` до `65535`. Действует только когда `action` имеет значение `return`; если не указан, по умолчанию используется `0`. > `domain`: [string] Сопоставляет список доменов. Синтаксис такой же, как у [`domain` в правилах routing](../routing.md#ruleobject).