DNS
DNS — это исходящий протокол, который принимает DNS-запросы, переданные routing, и пересылает или обрабатывает их по правилам.
Этот outbound поддерживает только традиционный открытый DNS, то есть запросы по UDP и TCP; нестандартные для него варианты, такие как DoH, DoT и DoQ, к этому outbound не применимы. Типичные сценарии: TUN, прозрачный прокси или tunnel принимают DNS-трафик, после чего routing направляет его в этот outbound.
По правилам он может пропускать запросы к целевому DNS-серверу, выполнять hijack во встроенный DNS-сервер для дальнейшей обработки, отбрасывать запросы или возвращать ответы с указанным RCODE. Также он может изменять целевой адрес, порт и транспортный протокол.
OutboundConfigurationObject
OutboundConfigurationObject соответствует элементу settings в OutboundObject.
{
"outbounds": [
{
// ...
"protocol": "dns",
"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"]
}
]
}
}
]
}2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
Пример выше только демонстрирует синтаксис полей. Полную конфигурацию см. в примере ниже.
rewriteNetwork: [ "tcp" | "udp" ]
Изменяет транспортный протокол DNS-трафика. Допустимые значения: "tcp" и "udp". Если не указано, исходный транспортный способ сохраняется.
rewriteAddress: address
Изменяет адрес DNS-сервера. Если не указано, сохраняется адрес, указанный источником.
rewritePort: number
Изменяет порт DNS-сервера. Если не указано, сохраняется порт, указанный источником.
userLevel: number
Уровень пользователя. Соединения будут использовать локальную политику, соответствующую этому уровню пользователя.
Значение userLevel соответствует значению level в policy. Если не указано, по умолчанию используется 0.
rules: [RuleObject]
DNS-запросы сопоставляются с правилами по порядку; поддерживается детальное управление по qType и domain.
Если ни одно правило не совпало, используется встроенное правило по умолчанию: запросы A и AAAA направляются во встроенный DNS-модуль, а запросы других типов получают пустой ответ с RCODE 0.
RuleObject
{
"action": "return",
"qType": 65,
"rCode": 5,
"domain": ["domain:example.com"]
}2
3
4
5
6
Все условия сопоставления внутри правила объединяются логикой AND. Если условие не указано, ограничение по этому условию не применяется.
action: [ "direct" | "hijack" | "drop" | "return" ]
Определяет действие при совпадении правила.
direct: напрямую пропускает запрос к целевому DNS-серверу. Если на уровне outbound также настроеныrewriteNetwork,rewriteAddressилиrewritePort, запрос пересылается к измененной цели.hijack: направляет запрос во встроенный DNS-сервер для дальнейшей обработки. Это можно использовать для дополнительного разделения трафика через конфигурацию встроенного 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.
rCode: number
DNS RCODE, используемый при возврате ответа, в диапазоне от 0 до 65535. Действует только когда action имеет значение return; если не указан, по умолчанию используется 0.
domain: [string]
Сопоставляет список доменов. Синтаксис такой же, как у domain в правилах routing.