DNS
DNS — это исходящий протокол, который принимает DNS-запросы, переданные routing, и пересылает или обрабатывает их по правилам.
Этот outbound поддерживает только традиционный открытый DNS, то есть запросы по UDP и TCP; нестандартные для него варианты, такие как DoH, DoT и DoQ, к этому outbound не применимы. Типичные сценарии: TUN, прозрачный прокси или dokodemo-door принимают DNS-трафик, после чего routing направляет его в этот outbound.
По правилам он может пропускать запросы к целевому DNS-серверу, выполнять hijack во встроенный DNS-сервер для дальнейшей обработки, отбрасывать запросы или явно отказывать в них. Также он может изменять целевой адрес, порт и транспортный протокол.
OutboundConfigurationObject
{
"network": "udp",
"address": "1.1.1.1",
"port": 53,
"userLevel": 0,
"rules": [
{
"action": "reject",
"domain": ["domain:example.com"]
},
{
"action": "direct",
"qtype": 65,
"domain": ["geosite:geolocation-!cn"]
}
]
}2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
Пример выше только демонстрирует синтаксис полей. Полную конфигурацию см. в примере ниже.
network: [ "tcp" | "udp" ]
Изменяет транспортный протокол DNS-трафика. Допустимые значения: "tcp" и "udp". Если не указано, исходный транспортный способ сохраняется.
address: address
Изменяет адрес DNS-сервера. Если не указано, сохраняется адрес, указанный источником.
port: number
Изменяет порт DNS-сервера. Если не указано, сохраняется порт, указанный источником.
userLevel: number
Уровень пользователя. Соединения будут использовать локальную политику, соответствующую этому уровню пользователя.
Значение userLevel соответствует значению level в policy. Если не указано, по умолчанию используется 0.
rules: [RuleObject]
DNS-запросы сопоставляются с правилами по порядку; поддерживается детальное управление по qtype и domain.
Если ни одно правило не совпало, используется встроенное правило по умолчанию: запросы A и AAAA направляются во встроенный DNS-модуль, а запросы других типов явно отклоняются.
RuleObject
{
"action": "hijack",
"qtype": 1,
"domain": ["geosite:cn"]
}2
3
4
5
Все условия сопоставления внутри правила объединяются логикой AND. Если условие не указано, ограничение по этому условию не применяется.
action: [ "direct" | "hijack" | "drop" | "reject" ]
Определяет действие при совпадении правила.
direct: напрямую пропускает запрос к целевому DNS-серверу. Если на уровне outbound также настроеныnetwork,addressилиport, запрос пересылается к измененной цели.hijack: направляет запрос во встроенный DNS-сервер для дальнейшей обработки. Это можно использовать для дополнительного разделения трафика через конфигурацию встроенного DNS. В настоящее время поддерживаются только записи A и AAAA.drop: напрямую отбрасывает запрос и не возвращает ответ.reject: возвращает явный отказ. По сравнению с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.
domain: [string]
Сопоставляет список доменов. Синтаксис такой же, как у domain в правилах routing.