Skip to content

DNS — sing-box

DNS-движок sing-box — это список типизированных серверов плюс структурированная цепочка правил. Каждый сервер имеет type, выбирающий его транспорт (UDP, TLS, HTTPS, файл hosts, пул fake-ip, полученный по DHCP, systemd-resolved, встроенный Tailscale). Правила используют тот же набор полей сопоставления, что и правила маршрутизации, но с действиями, специфичными для DNS.

Параметры верхнего уровня

ПолеТипПо умолчаниюДопустимые значенияОписание
servers[]DNSServerOptions[][DNSServerOptions]Список DNS-серверов. Каждая запись имеет `type` (local, udp, tls, https, h3, dhcp, fakeip, hosts, resolved, tailscale) и соответствующий набор параметров.
rules[]DNSRule[][DNSRule]Правила маршрутизации на уровне DNS. Той же формы, что правила маршрутизации, но с набором действий, специфичных для DNS.
finalstring(unset)<server tag>DNS-сервер по умолчанию, когда ни одно правило не совпало. При пустом значении используется первый сервер из `servers[]`.
reverse_mappingboolfalsetrue | falseВести обратное отображение (IP → домен), чтобы правила могли сопоставляться с исходным доменом после того, как соединение разрешило назначение в IP.

Исходный код: option/dns.go:21-27 · зафиксировано на v1.13.15 (3708fa1)

Плюс встроенные DNSClientOptions:

ПолеТипПо умолчаниюДопустимые значенияОписание
strategyDomainStrategy(prefer_ipv4)prefer_ipv4 | prefer_ipv6 | ipv4_only | ipv6_onlyПредпочтение семейства адресов по умолчанию.
disable_cacheboolfalsetrue | falseОтключить кэш ответов в памяти.
disable_expireboolfalsetrue | falseНе вытеснять кэшированные записи по TTL — хранить их бессрочно.
independent_cacheboolfalsetrue | falseИспользовать отдельный кэш на каждый тег сервера (вместо одного глобального кэша).
cache_capacityuint32(unbounded)<int>Максимум кэшированных записей. 0 снимает ограничение.
client_subnet*badoption.Prefixable(unset)<CIDR>ECS (EDNS Client Subnet), объявляемый в исходящих запросах.

Исходный код: option/dns.go:105-112 · зафиксировано на v1.13.15 (3708fa1)

Типы серверов

Каждая запись в servers[] имеет поле type. Соответствующие поля:

type: "local"

Разрешение через резолвер ОС (удобно на macOS/iOS, где системный резолвер — авторитетный путь). Добавляет prefer_go для перехода на Go-резолвер без CGO.

ПолеТипПо умолчаниюДопустимые значенияОписание
prefer_goboolfalsetrue | falseИспользовать net.Resolver из Go (без CGO) вместо нативного резолвера платформы. Полезно на системах, где нативный резолвер сломан или ограничен по частоте запросов.

Исходный код: option/dns.go:376-379 · зафиксировано на v1.13.15 (3708fa1)

type: "udp" и type: "tcp" — RemoteDNSServerOptions

json
{ "type": "udp", "tag": "local-udp", "server": "8.8.8.8", "server_port": 53 }
ПолеТипПо умолчаниюДопустимые значенияОписание
serverstring(required)<host>Имя хоста или IP сервера.
server_portuint1653 (udp/tcp), 853 (tls), 443 (https/h3)<port>Порт сервера.

Исходный код: option/dns.go:332-335 · зафиксировано на v1.13.15 (3708fa1)

type: "tls" — DNS-over-TLS

Те же поля, что у udp/tcp, плюс стандартный блок tls:.

type: "https" и type: "h3" — DNS-over-HTTPS / -H3

ПолеТипПо умолчаниюДопустимые значенияОписание
pathstring/dns-query/<path>Путь конечной точки DoH.
methodstringPOSTPOST | GETHTTP-метод для DoH-запросов.
headersbadoption.HTTPHeader{}{<header>: <value>}Дополнительные HTTP-заголовки.

Исходный код: option/dns.go:394-399 · зафиксировано на v1.13.15 (3708fa1)

type: "hosts" — локальный файл hosts

ПолеТипПо умолчаниюДопустимые значенияОписание
pathbadoption.Listable[string][/etc/hosts][<file path>]Список путей hosts-файлов для объединения.
predefined*badjson.TypedMap[string, badoption.Listable[netip.Addr]]{}{<domain>: [<IP>]}Встроенная таблица hosts. Приоритет выше, чем у `path`.

Исходный код: option/dns.go:363-366 · зафиксировано на v1.13.15 (3708fa1)

type: "fakeip"

ПолеТипПо умолчаниюДопустимые значенияОписание
inet4_range*badoption.Prefix(required for v4)<CIDR>IPv4 CIDR, выделяемый под поддельные IP.
inet6_range*badoption.Prefix(required for v6)<CIDR>IPv6 CIDR, выделяемый под поддельные IP.

Исходный код: option/dns.go:401-404 · зафиксировано на v1.13.15 (3708fa1)

type: "dhcp"

ПолеТипПо умолчаниюДопустимые значенияОписание
interfacestring(auto)<interface>Интерфейс, чьи полученные по DHCP резолверы используются.

Исходный код: option/dns.go:406-409 · зафиксировано на v1.13.15 (3708fa1)

Прочие типы

  • type: "resolved" — читать серверы имён systemd-resolved, привязанные к сетевым интерфейсам (только Linux).
  • type: "tailscale" — использовать резолвер MagicDNS демона Tailscale.
  • type: "predefined" — возвращать жёстко заданный набор ответов.
  • type: "rcode" — возвращать фиксированный RCODE (NOERROR / NXDOMAIN / SERVFAIL и т. д.).

Правила DNS

Правила DNS используют ту же полиморфную форму _Rule, что и правила маршрутизации (type: "default" или type: "logical"), и тот же набор из 43 ключей сопоставления в RawDefaultDNSRule. Различия — на уровне действий:

DNS-действиеЗначение
route (по умолчанию)Отправить запрос в server: "<tag>". Необязательные поля: strategy, disable_cache, rewrite_ttl, client_subnet.
route-optionsПрименить параметры DNS-маршрута к последующим совпадениям правил.
rejectОтклонить запрос. С method: "default" (NXDOMAIN) или method: "drop" (без ответа).
predefinedВернуть жёстко заданный ответ (набор записей или RCODE).

Примеры

Разделение на два сервера — внутренние домены через локальный DoH, всё остальное через DoH Cloudflare:

json
{
  "dns": {
    "servers": [
      { "type": "https", "tag": "local",
        "server": "doh.pub", "path": "/dns-query" },
      { "type": "https", "tag": "remote",
        "server": "cloudflare-dns.com", "path": "/dns-query",
        "detour": "proxy" },
      { "type": "fakeip", "tag": "fakeip",
        "inet4_range": "198.18.0.0/15",
        "inet6_range": "fc00::/18" }
    ],
    "rules": [
      { "rule_set": ["geosite-cn"], "server": "local" },
      { "outbound": "any", "server": "remote" }
    ],
    "final": "remote",
    "strategy": "prefer_ipv4"
  }
}

Блокировка рекламы через DNS:

json
{
  "dns": {
    "servers": [
      { "type": "https", "tag": "main",
        "server": "cloudflare-dns.com" }
    ],
    "rules": [
      {
        "domain_keyword": ["ads", "doubleclick", "googlesyndication"],
        "action": "reject",
        "method": "default"
      }
    ],
    "final": "main"
  }
}

Примечания

  • Устаревший параметр верхнего уровня fakeip: {...} объявлен устаревшим — вместо него используйте запись сервера type: "fakeip". sing-box автоматически мигрирует старые конфигурации при загрузке, но выводит предупреждение об устаревании.
  • reverse_mapping: true позволяет последующим правилам маршрутизации сопоставляться с доменным именем даже после того, как сниффинг разрешил его в IP. Необходимо при использовании fake-ip вместе со сложными доменными правилами.
  • independent_cache: true полезен, когда есть серверы, легитимно возвращающие разные ответы для одного и того же домена (split-horizon-резолверы).
  • Правила DNS и правила маршрутизации разделяют один и тот же словарь ключей сопоставления, но работают в разное время: правила DNS выполняются на запросе к резолверу; правила маршрутизации — на итоговом соединении.
  • type: "resolved" читает данные через D-Bus API systemd-resolved — работает только на Linux-системах, где resolved действительно является запущенным резолвером.

Сравнение с другими ядрами

  • Xray-core использует плоский блок dns:, где servers[] содержит URL-строки (или объекты NameServerConfig) — поля type нет, транспорт определяется схемой URL. См. DNS — Xray-core.
  • mihomo имеет блок dns: из 25 полей с отдельными списками nameserver / fallback и отображением nameserver-policy. См. DNS — mihomo.

Исходный код: option/dns.go:21-409 · v1.13.15 (3708fa1)

Core Tutorial от Argsment