Skip to content

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

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

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

ПолеТипПо умолчаниюДопустимые значенияОписание
geoip*GeoIPOptions(legacy)GeoIPOptionsУстаревшие настройки расположения и загрузки базы GeoIP. Объявлены устаревшими в пользу наборов правил.
geosite*GeositeOptions(legacy)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`.
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>Задержка перед переключением на резервную сеть.

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

Правила

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

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

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

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

ПолеТипОписание
inbound[]stringСопоставление по тегу входящего.
network[]stringtcp, udp или tcp,udp.
protocol[]stringОпределённый сниффингом прикладной протокол.
domain / domain_suffix / domain_keyword / domain_regex[]stringСопоставители доменов.
geosite[]stringКатегория GeoSite — в современных конфигурациях читается из набора правил.
geoip / source_geoip[]stringКатегория GeoIP.
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).
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": "..."
}

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

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

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

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

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

ПолеТипПо умолчаниюДопустимые значенияОписание
typestringinlineinline | local | remoteГде находится набор правил. `inline` хранит правила прямо в этой конфигурации; `local` читает из файла по пути; `remote` скачивает по URL.
tagstring(required)<string>Имя, на которое ссылается ключ сопоставления `rule_set` в правилах.
formatstring(inferred)source | binaryФормат файла. `source` — JSON; `binary` — скомпилированный формат `.srs`. Если не задан, определяется по расширению файла.

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

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

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",
  "download_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"] },
    { "geoip": ["tor-exit"] }
  ],
  "outbound": "tor"
}

Примечания

  • Параметры верхнего уровня geoip и geositeнаследие прошлого. Современный подход — загружать эквивалентные данные через rule_set (удалённые файлы .srs) и ссылаться на них через поле сопоставления rule_set в правиле.
  • 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-21 · v1.13.15 (3708fa1)

Core Tutorial от Argsment