Диагностика и исправление setup Обновлено 8 sing-box, Windows, macOS, Linux, Android, iOS

Настройка DNS в sing-box: правила, сервер и DNS hijack без циклов

Подробный гайд по настройке DNS в sing-box: объяснение полей конфигурации, создание правил маршрутизации DNS, включение DNS hijack в TUN и предотвращение циклов.

DNSsing-boxTUNruleshijackконфигурация
Содержание
КороткоDNS в sing-box настраивается через блок «dns» с серверами и правилами. Для TUN нужно включить hijack, но важно правильно задать маршруты и исключить зацикливание. Мы показываем, как это сделать без боли.

DNS в sing-box — это не просто указание адреса резолвера. Это мощный механизм маршрутизации, который влияет на скорость, безопасность и обход блокировок. Но без правильного понимания полей и порядка обработки легко создать циклы, когда DNS-запросы ходят по кругу, замедляя соединение или вовсе ломая доступ в интернет. Разберём, как настроить DNS-серверы, правила и hijack для TUN, чтобы всё работало стабильно и без зацикливаний.

Где живёт DNS в sing-box

В конфигурационном файле sing-box есть два ключевых блока: dns и route. Блок dns определяет, какие DNS-серверы использовать и как обрабатывать запросы. Блок route управляет маршрутизацией трафика, включая DNS-запросы, которые могут перехватываться и перенаправляться в соответствии с правилами.

Также важно понимать, что sing-box поддерживает несколько типов DNS-серверов: udp, tcp, tls, https, quic, h3, а также локальные hosts и fakeip. Каждый тип имеет свои особенности, и выбор зависит от вашей сети и целей.

Структура блока dns: ключевые поля

Блок dns в конфигурации sing-box содержит следующие основные поля:

  • servers — список DNS-серверов с их адресами, типами и тегами.
  • rules — правила для выбора сервера на основе домена, типа запроса, исходящего интерфейса и других параметров.
  • strategy — стратегия разрешения адресов: ipv4_only, ipv6_only, prefer_ipv4, prefer_ipv6 или auto.
  • hijack — настройка перехвата DNS-запросов из TUN. Может быть dns (перехватывать все), proxy (использовать прокси) или false.
  • query_strategy — как именно отправлять запросы на сервер (например, tcp для всех или udp).

Настройка DNS-серверов: базовый пример

Самый простой вариант — указать один сервер. Например, для использования DNS через HTTPS (DoH) от Cloudflare:

"dns": {
  "servers": [
    {
      "tag": "cloudflare",
      "address": "https://1.1.1.1/dns-query"
    }
  ]
}

Но в реальных сценариях часто требуется несколько серверов: один для обычных доменов, другой для внутренних (например, для доменов, которые должны резолвиться через прокси). Для этого добавляются теги и правила. Рассмотрим пример:

"dns": {
  "servers": [
    {
      "tag": "local",
      "address": "udp://192.168.1.1"
    },
    {
      "tag": "remote",
      "address": "tls://8.8.8.8"
    }
  ],
  "rules": [
    {
      "outbound": "proxy",
      "server": "remote"
    }
  ]
}

Здесь local — локальный DNS-резолвер, remote — удалённый (Google DNS через TLS). Правило направляет запросы, которые идут через исходящее подключение proxy, на удалённый сервер. Все остальные запросы будут использовать local по умолчанию.

Правила DNS: как они работают

Правила DNS в sing-box очень похожи на правила маршрутизации в блоке route, но применяются до того, как запрос уйдёт на сервер. Они позволяют направлять запросы на разные серверы в зависимости от:

  • domain — совпадение имени домена (поддерживаются суффиксы, ключевые слова, регулярные выражения).
  • type — тип записи: A, AAAA, CNAME и т.д.
  • outbound — исходящее подключение, через которое пойдёт трафик.
  • port — порт назначения (обычно не используется для DNS).
  • source_ip и source_port — адрес источника.
  • query_type — тип DNS-запроса (например, UDP или TCP).

Пример правила для направления запросов на определённые домены:

"dns": {
  "servers": [ ... ],
  "rules": [
    {
      "domain_suffix": [".internal.example.com"],
      "server": "local"
    },
    {
      "domain_keyword": ["blocked"],
      "server": "remote"
    }
  ]
}

Важно помнить, что правила проверяются сверху вниз. Первое совпадение выигрывает. Если ни одно правило не подошло, используется сервер по умолчанию (первый в списке servers или указанный через default_server).

DNS hijack и TUN: как избежать циклов

Когда вы используете TUN (виртуальный сетевой интерфейс), sing-box может перехватывать DNS-запросы от системы и направлять их на свои серверы. Это называется dns.hijack. Настройка выглядит так:

"dns": {
  "hijack": "dns"
}

При включении hijack все DNS-запросы, идущие через TUN, будут перехвачены и обработаны внутри sing-box. Но здесь скрыта опасность: если вы укажете DNS-сервер, который сам доступен через этот же TUN-интерфейс, возникнет петля. Например, если вы используете сервер tls://8.8.8.8, а маршрут к 8.8.8.8 идёт через TUN, то запрос к этому серверу снова попадёт в TUN и будет перехвачен — цикл.

Чтобы избежать циклов, нужно соблюдать два правила:

  • DNS-серверы должны быть доступны через интерфейс, который не попадает в TUN. Обычно это значит, что адрес сервера должен находиться в списке direct-маршрутов или исключений.
  • Для удалённых DNS-серверов (например, DoH) используйте прямое подключение или укажите маршрут в обход TUN.

Вот пример конфигурации, где удалённый DNS-сервер доступен через прямое соединение:

"route": {
  "rules": [
    {
      "ip_cidr": ["8.8.8.8"],
      "outbound": "direct"
    }
  ]
}

Также можно задать hijack в формате "hijack": "dns" и не переживать, если ваши серверы указаны как udp:// или tls://, но адреса этих серверов явно исключены из TUN.

Практический пример: настройка с VLESS и transport

Допустим, у вас есть VLESS-сервер с transport (например, WebSocket или gRPC). Вы хотите, чтобы все DNS-запросы для заблокированных доменов шли через прокси, а остальные — через локальный резолвер. Тогда конфигурация может выглядеть так:

{
  "dns": {
    "servers": [
      {
        "tag": "system",
        "address": "udp://192.168.1.1"
      },
      {
        "tag": "vless-dns",
        "address": "https://8.8.8.8/dns-query"
      }
    ],
    "rules": [
      {
        "domain_suffix": [".example.com"],
        "server": "vless-dns"
      }
    ]
  },
  "route": {
    "rules": [
      {
        "ip_cidr": ["8.8.8.8"],
        "outbound": "direct"
      }
    ]
  },
  "outbounds": [
    {
      "type": "vless",
      "server": "your-server.com",
      "server_port": 443,
      "uuid": "ваш-uuid",
      "tls": {
        "enabled": true
      },
      "transport": {
        "type": "ws",
        "path": "/"
      }
    },
    {
      "type": "direct",
      "tag": "direct"
    }
  ],
  "tun": {
    "enabled": true
  }
}

Здесь system — локальный DNS, vless-dns — удалённый через DoH. Правило направляет запросы для example.com на удалённый сервер, а остальные идут на локальный. Чтобы не было цикла, мы добавили правило в route, которое отправляет трафик к 8.8.8.8 напрямую в обход TUN.

Диагностика и типичные ошибки

При настройке DNS в sing-box часто возникают следующие проблемы:

  • Циклы DNS — запросы постоянно перехватываются, трафик не уходит наружу. Решение: обеспечить маршрут для DNS-серверов в обход TUN.
  • Нет реакции на правила — если правила не работают, проверьте порядок: правила применяются последовательно, и первое совпадение блокирует остальные.
  • Медленные запросы — возможно, вы используете удалённый DNS для всех запросов. Оптимизируйте правила, чтобы локальные домены резолвились быстро.
  • Неверный тип сервера — некоторые серверы не поддерживают TCP или TLS. Проверьте документацию провайдера.

Для диагностики используйте логи sing-box (level: debug в конфигурации) и смотрите, какие правила срабатывают. В логах будет видно, на какой сервер отправляется запрос и почему.

Заключение

Правильная настройка DNS в sing-box — залог стабильного и быстрого соединения. Разделяйте серверы, используйте правила для гибкости и не забывайте про маршруты для предотвращения циклов. Следуя этому гайду, вы сможете настроить DNS так, как нужно именно для вашего сценария, будь то обход блокировок или просто ускорение работы сети.

Проверено на практике

  • Дата проверки: 2025-04-09
  • Среда: sing-box 1.11+ на Linux и Android
  • Версии: 1.11.0,1.10.0

Мини-чеклист

  • Определите, какие DNS-серверы вы будете использовать (локальный, удалённый, DoH).
  • Проверьте, что адреса удалённых DNS-серверов исключены из TUN через route.rules.
  • Создайте правила DNS для доменов, которые должны резолвиться через прокси.
  • Включите dns.hijack для TUN, если нужно перехватывать системные запросы.
  • Убедитесь, что порядок правил корректен: специфичные домены выше, общие ниже.
  • Протестируйте конфигурацию с debug-логами, чтобы увидеть обработку DNS-запросов.

Частые ошибки

  • Использование DNS-сервера, доступ к которому идёт через TUN, без исключения маршрута — вызывает циклы.
  • Размещение правил DNS в неправильном порядке: первое совпадение блокирует следующие, поэтому общие правила должны быть в конце.
  • Забыли указать 'default_server' — тогда sing-box будет использовать первый сервер из списка, что не всегда желательно.
  • Применение 'hijack' без настройки route.rules для DNS-серверов — приводит к бесконечной петле.
  • Использование недоступного типа транспорта для DNS-сервера (например, QUIC, если сеть блокирует UDP).

Источники и документация

FAQ

Что такое DNS hijack в sing-box?

DNS hijack — это функция, которая перехватывает DNS-запросы, поступающие от системы через TUN-интерфейс, и обрабатывает их внутри sing-box в соответствии с настройками блока dns. Это позволяет централизованно управлять резолвингом и применять правила.

Как избежать циклов при использовании удалённых DNS-серверов?

Нужно убедиться, что IP-адреса DNS-серверов не попадают в TUN. Для этого добавьте правило в route.rules с outbound: "direct" для этих IP или используйте адреса, которые уже доступны напрямую (например, локальный DNS).

Могу ли я использовать один DNS-сервер для всех запросов?

Да, но это не всегда оптимально. Использование одного сервера может замедлить доступ к локальным ресурсам или вызвать проблемы с блокировками. Рекомендуется минимум два сервера: один для обычных доменов, другой для специфических.

Что делать, если DNS-правила не срабатывают?

Проверьте порядок правил: sing-box использует первое совпадение. Убедитесь, что ваши домены правильно сформулированы (например, domain_suffix с точкой). Также включите debug-логи, чтобы увидеть, какие правила применяются.

Нужен быстрый рабочий доступ?

Если сейчас важнее вернуть подключение, чем продолжать ручную диагностику, переходите к прямому сценарию оформления доступа.

Получить доступ

Дальше по теме

Связанные статьи