Маршрутизация — 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. |
final | string | (unset) | <outbound tag> | Исходящий по умолчанию, когда ни одно правило не совпало. Если не задан, используется первый исходящий в outbounds. |
find_process | bool | false | true | false | Определять процесс-источник для каждого соединения. Требуется правилам process_name / process_path. |
find_neighbor | bool | false | true | false | Linux / macOS. Принудительно включает определение соседей (MAC-адрес / имя хоста клиентов LAN) для журналирования, даже без правил source_mac_address / source_hostname. |
dhcp_lease_files | badoption.Listable[string] | (auto-detected) | [<file path>] | Linux / macOS. Файлы аренды DHCP для сопоставления клиентов LAN с именами хостов и MAC-адресами. Если пусто, определяются автоматически для dnsmasq, odhcpd, ISC dhcpd и Kea. |
auto_detect_interface | bool | false | true | false | Автоматически определять системный интерфейс по умолчанию для исходящего трафика — используется исходящими Direct без bind_interface. |
override_android_vpn | bool | false | true | false | Только Android — обходить системный VPN-сервис при исходящих подключениях. |
default_interface | string | (auto) | <interface> | Переопределить интерфейс по умолчанию для исходящих. Имеет приоритет над auto_detect_interface. |
default_mark | FwMark | 0 | <uint32> | SO_MARK в Linux, применяемый к исходящим сокетам. |
default_domain_resolver | *DomainResolveOptions | (none) | DomainResolveOptions | Резолвер по умолчанию для доменов назначения, когда правило его не задаёт. |
default_network_strategy | *NetworkStrategy | (unset) | NetworkStrategy | Сетевая стратегия по умолчанию для гонок подключения Happy Eyeballs / выбора между сотовой сетью и Wi-Fi. |
default_network_type | badoption.Listable[InterfaceType] | [] | <InterfaceType> | Предпочитаемые типы сети для исходящего по умолчанию. |
default_fallback_network_type | badoption.Listable[InterfaceType] | [] | <InterfaceType> | Резервные типы сети на случай отказа предпочитаемого. |
default_fallback_delay | badoption.Duration | 0 | <duration> | Задержка перед переключением на резервную сеть. |
default_http_client | string | (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 | []string | tcp, 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_private | bool | Совпадает с 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 | []string | MAC-адрес / имя хоста DHCP устройства-источника через определение соседей (Linux, macOS или графические клиенты Android / macOS). |
user / user_id | []string / []int32 | Локальный пользователь / UID. |
clash_mode | string | Совпадает, только когда режим времени выполнения (управляемый через Clash API) равен этой строке. |
wifi_ssid / wifi_bssid | []string | Маршрутизация с учётом Wi-Fi (только мобильные платформы). |
network_is_expensive / network_is_constrained | bool | Флаги типа сети iOS/macOS. |
rule_set | []string | Совпадает, если совпал любой из названных наборов правил. |
invert | bool | Инвертировать результат сопоставления всего правила. |
Логическое правило
{
"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. |
Наборы правил
| Поле | Тип | По умолчанию | Допустимые значения | Описание |
|---|---|---|---|---|
type | string | inline | inline | local | remote | Где находится набор правил. inline хранит правила прямо в этой конфигурации; local читает из файла по пути; remote скачивает по URL. |
tag | badoption.Listable[string] | (required) | <string> | [<string>] | Имя, на которое ссылается ключ сопоставления rule_set в правилах. Список задаёт несколько наборов правил с общими остальными параметрами; {tag} в path, url или initial_path заменяется каждым тегом (обязателен при нескольких тегах; несовместим с type: inline). |
format | string | (inferred) | source | binary | Формат файла. source — JSON; binary — скомпилированный формат .srs. Если не задан, определяется по расширению файла. |
Исходный код: option/rule_set.go:22-29 · зафиксировано на v1.14.2 (af6e64c)
Локальный набор правил
{ "type": "local", "tag": "cn", "format": "binary", "path": "geosite-cn.srs" }Удалённый набор правил
{
"type": "remote",
"tag": "cn",
"format": "binary",
"url": "https://example.com/geosite-cn.srs",
"http_client": { "detour": "direct" },
"update_interval": "168h"
}Встроенный набор правил
{
"type": "inline",
"tag": "block",
"rules": [
{ "domain_keyword": ["ads", "tracker"] }
]
}rules встроенной формы — это HeadlessRule: структурно они идентичны правилам маршрутизации, но без поля action (действием становится то, что делает ссылающееся правило).
Примеры
CN напрямую + всё остальное через proxy:
{
"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
}
}Отклонение рекламы встроенным набором правил:
{
"route": {
"rule_set": [
{
"type": "inline",
"tag": "ads",
"rules": [
{ "domain_keyword": ["doubleclick", "googlesyndication"] }
]
}
],
"rules": [
{ "rule_set": "ads", "action": "reject" }
]
}
}Логическое правило OR:
{
"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)
