Skip to content

Маршрутизация — sing-box ​

Блок route в sing-box содержит правила, наборы правил и несколько переключателей интерфейса по умолчанию / определения процессов. Правила полиморфны (default + logical) и несут явное действие action, выбирающее одно из восьми поведений.

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

ПолеТипПо умолчаниюДопустимые значенияОписание
geoip*GeoIPOptions(ignored)GeoIPOptionsБаза GeoIP не поддерживается: поле разбирается, но игнорируется; используйте наборы правил.
geosite*GeositeOptions(ignored)GeositeOptionsБаза GeoSite не поддерживается: поле разбирается, но игнорируется; используйте наборы правил.
rules[]Rule[][Rule]Правила маршрутизации; вычисляются по порядку.
rule_set[]RuleSet[][RuleSet]Именованные наборы правил — на них ссылаются правила через ключ сопоставления rule_set. Три типа: inline, local, remote.
finalstring(unset)<outbound tag>Исходящий по умолчанию, когда ни одно правило не совпало. Если не задан, используется первый исходящий в outbounds.
find_processboolfalsetrue | falseОпределять процесс-источник для каждого соединения. Требуется правилам process_name / process_path.
find_neighborboolfalsetrue | falseLinux / macOS. Принудительно включает определение соседей (MAC-адрес / имя хоста клиентов LAN) для журналирования, даже без правил source_mac_address / source_hostname.
dhcp_lease_filesbadoption.Listable[string](auto-detected)[<file path>]Linux / macOS. Файлы аренды DHCP для сопоставления клиентов LAN с именами хостов и MAC-адресами. Если пусто, определяются автоматически для dnsmasq, odhcpd, ISC dhcpd и Kea.
auto_detect_interfaceboolfalsetrue | falseАвтоматически определять системный интерфейс по умолчанию для исходящего трафика — используется исходящими Direct без bind_interface.
override_android_vpnboolfalsetrue | falseТолько Android — обходить системный VPN-сервис при исходящих подключениях.
default_interfacestring(auto)<interface>Переопределить интерфейс по умолчанию для исходящих. Имеет приоритет над auto_detect_interface.
default_markFwMark0<uint32>SO_MARK в Linux, применяемый к исходящим сокетам.
default_domain_resolver*DomainResolveOptions(none)DomainResolveOptionsРезолвер по умолчанию для доменов назначения, когда правило его не задаёт.
default_network_strategy*NetworkStrategy(unset)NetworkStrategyСетевая стратегия по умолчанию для гонок подключения Happy Eyeballs / выбора между сотовой сетью и Wi-Fi.
default_network_typebadoption.Listable[InterfaceType][]<InterfaceType>Предпочитаемые типы сети для исходящего по умолчанию.
default_fallback_network_typebadoption.Listable[InterfaceType][]<InterfaceType>Резервные типы сети на случай отказа предпочитаемого.
default_fallback_delaybadoption.Duration0<duration>Задержка перед переключением на резервную сеть.
default_http_clientstring(first http_clients entry)<http client tag>Тег записи верхнего уровня http_clients, используемой удалёнными наборами правил без http_client. Если http_clients нет вовсе, используется устаревший неявный клиент, подключающийся через исходящий по умолчанию.

Исходный код: option/route.go:5-24 · зафиксировано на v1.14.2 (af6e64c)

Правила ​

Каждая запись в rules[] — полиморфный объект Rule. Поле type определяет форму:

  • type: "default" (или опущено) — плоское RawDefaultRule с полями сопоставления + RuleAction.
  • type: "logical" — булев комбинатор над вложенными правилами.

Правило default — поля сопоставления ​

RawDefaultRule содержит 44 поля; все необязательны и объединяются по И, когда задано несколько. Самые используемые:

ПолеТипОписание
inbound[]stringСопоставление по тегу входящего.
network[]stringtcp, udp или tcp,udp.
protocol[]stringОпределённый сниффингом прикладной протокол.
domain / domain_suffix / domain_keyword / domain_regex[]stringСопоставители доменов.
geosite / geoip / source_geoip[]stringНе поддерживаются — правило с ними вызывает ошибку при запуске. Используйте rule_set.
ip_cidr / source_ip_cidr[]stringСопоставление по CIDR.
ip_is_private / source_ip_is_privateboolСовпадает с RFC1918 / link-local / loopback.
port / source_port[]uint16Сопоставление по отдельным портам.
port_range / source_port_range[]stringСопоставление по диапазонам портов (80:90, 1024: и т. д.).
process_name / process_path / process_path_regex[]stringСопоставление по процессу (нужен find_process: true).
package_name[]stringИмя пакета Android (UID определяется через системный API). package_name_regex сопоставляет по регулярному выражению.
source_mac_address / source_hostname[]stringMAC-адрес / имя хоста DHCP устройства-источника через определение соседей (Linux, macOS или графические клиенты Android / macOS).
user / user_id[]string / []int32Локальный пользователь / UID.
clash_modestringСовпадает, только когда режим времени выполнения (управляемый через Clash API) равен этой строке.
wifi_ssid / wifi_bssid[]stringМаршрутизация с учётом Wi-Fi (только мобильные платформы).
network_is_expensive / network_is_constrainedboolФлаги типа сети iOS/macOS.
rule_set[]stringСовпадает, если совпал любой из названных наборов правил.
invertboolИнвертировать результат сопоставления всего правила.

Логическое правило ​

json
{
  "type": "logical",
  "mode": "and",
  "rules": [ <Rule>, <Rule>, … ],
  "invert": false,
  "action": "..."
}

mode — and (по умолчанию) или or. Вложенные правила сами могут быть логическими.

Действие правила ​

Каждое правило несёт действие, определяющее, что происходит при совпадении. Восемь значений действия:

ДействиеЗначение
route (по умолчанию)Отправить в outbound. Дополнительные поля: override_address, override_port, network_strategy, udp_*, tls_fragment*, tls_spoof / tls_spoof_method.
route-optionsПрименить параметры маршрута к последующему сопоставлению, не покидая цепочку правил.
directПрямое подключение — полностью в обход исходящих (использует default_interface и т. д.).
bypassТой же формы, что route; намеренно выделено отдельно для журналирования.
rejectОтклонить соединение. С method: "drop" или method: "default".
hijack-dnsПерехватить соединение как DNS и направить его в DNS-движок.
sniffВыполнить сниффинг протокола на соединении. Для UDP-соединений от L3-входящих (TUN, WireGuard, Tailscale) выполняется и при предварительном сопоставлении — по первому пакету.
resolveРазрешить домен назначения через указанный DNS-сервер до выполнения последующих правил. Необязательные timeout и disable_optimistic_cache.

Наборы правил ​

ПолеТипПо умолчаниюДопустимые значенияОписание
typestringinlineinline | local | remoteГде находится набор правил. inline хранит правила прямо в этой конфигурации; local читает из файла по пути; remote скачивает по URL.
tagbadoption.Listable[string](required)<string> | [<string>]Имя, на которое ссылается ключ сопоставления rule_set в правилах. Список задаёт несколько наборов правил с общими остальными параметрами; {tag} в path, url или initial_path заменяется каждым тегом (обязателен при нескольких тегах; несовместим с type: inline).
formatstring(inferred)source | binaryФормат файла. source — JSON; binary — скомпилированный формат .srs. Если не задан, определяется по расширению файла.

Исходный код: option/rule_set.go:22-29 · зафиксировано на v1.14.2 (af6e64c)

Локальный набор правил ​

json
{ "type": "local", "tag": "cn", "format": "binary", "path": "geosite-cn.srs" }

Удалённый набор правил ​

json
{
  "type": "remote",
  "tag": "cn",
  "format": "binary",
  "url": "https://example.com/geosite-cn.srs",
  "http_client": { "detour": "direct" },
  "update_interval": "168h"
}

Встроенный набор правил ​

json
{
  "type": "inline",
  "tag": "block",
  "rules": [
    { "domain_keyword": ["ads", "tracker"] }
  ]
}

rules встроенной формы — это HeadlessRule: структурно они идентичны правилам маршрутизации, но без поля action (действием становится то, что делает ссылающееся правило).

Примеры ​

CN напрямую + всё остальное через proxy:

json
{
  "route": {
    "rule_set": [
      { "type": "remote", "tag": "geoip-cn", "format": "binary",
        "url": "https://github.com/SagerNet/sing-geoip/raw/rule-set/geoip-cn.srs" },
      { "type": "remote", "tag": "geosite-cn", "format": "binary",
        "url": "https://github.com/SagerNet/sing-geosite/raw/rule-set/geosite-cn.srs" }
    ],
    "rules": [
      { "ip_is_private": true, "outbound": "direct" },
      { "rule_set": ["geoip-cn", "geosite-cn"], "outbound": "direct" },
      { "action": "sniff" },
      { "protocol": "dns", "action": "hijack-dns" }
    ],
    "final": "proxy",
    "find_process": false,
    "auto_detect_interface": true
  }
}

Отклонение рекламы встроенным набором правил:

json
{
  "route": {
    "rule_set": [
      {
        "type": "inline",
        "tag": "ads",
        "rules": [
          { "domain_keyword": ["doubleclick", "googlesyndication"] }
        ]
      }
    ],
    "rules": [
      { "rule_set": "ads", "action": "reject" }
    ]
  }
}

Логическое правило OR:

json
{
  "type": "logical",
  "mode": "or",
  "rules": [
    { "domain_suffix": [".onion"] },
    { "rule_set": ["tor-exit"] }
  ],
  "outbound": "tor"
}

Примечания ​

  • geoip / geosite не поддерживаются: блоки верхнего уровня разбираются, но игнорируются, а элементы правил geoip / geosite / source_geoip приводят к ошибке при запуске. Загружайте эквивалентные данные через rule_set (удалённые файлы .srs) и ссылайтесь на них через поле сопоставления rule_set в правиле.
  • Удалённые наборы правил загружаются через HTTP-клиент: http_client принимает встроенный объект (движок, TLS и поля подключения вроде detour) или тег записи верхнего уровня http_clients; без него используется route.default_http_client или первая запись http_clients. download_detour устарел в пользу http_client. initial_path заполняет набор правил из локального файла, чтобы запуск не ждал первой загрузки.
  • Семантика сопоставления наборов правил: поля набора сливаются со ссылающимся правилом, только если он содержит ровно одно правило default без invert; любой другой набор вычисляется как отдельное условие, которое истинно, если совпало любое из его правил.
  • source_mac_address / source_hostname опираются на определение соседей, которое включается автоматически при наличии таких правил (или neighbor_domain у локального DNS-сервера); find_neighbor включает его принудительно для журналирования, а dhcp_lease_files даёт имена хостов на Linux / macOS.
  • rule_set_ip_cidr_match_source (в структуре — snake_case) управляет тем, сопоставляются ли IP-CIDR-правила набора с источником или с назначением. Псевдоним rule_set_ipcidr_match_source устарел.
  • Действия sniff и resolve обычно ставят в начало списка правил, чтобы последующие правила видели полезные метаданные. DNS-движок полагается на hijack-dns для перехвата DNS-запросов, которые движок маршрутизации хочет обработать.
  • clash_mode действует, только если включён Clash API — именно оттуда берётся режим.

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

  • Xray-core использует единую полиморфную форму правил с именами полей в camelCase и гораздо меньшим набором ключей сопоставления. Перечисления action нет — каждое правило направляет в outboundTag или balancerTag. См. Маршрутизация — Xray-core.
  • mihomo использует компактные однострочные строковые правила (DOMAIN-SUFFIX,example.com,proxy) и отдельный механизм rule-providers: для удалённых списков правил. См. Маршрутизация — mihomo.

Исходный код: option/route.go:5-24 · v1.14.2 (af6e64c)

Core Tutorial от Argsment