Маршрутизация — 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`. |
final | string | (unset) | <outbound tag> | Исходящий по умолчанию, когда ни одно правило не совпало. Если не задан, используется первый исходящий в `outbounds`. |
find_process | bool | false | true | false | Определять процесс-источник для каждого соединения. Требуется правилам `process_name` / `process_path`. |
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> | Задержка перед переключением на резервную сеть. |
Исходный код: option/route.go:5-21 · зафиксировано на v1.13.15 (3708fa1)
Правила
Каждая запись в rules[] — полиморфный объект Rule. Поле type определяет форму:
type: "default"(или опущено) — плоскоеRawDefaultRuleс полями сопоставления +RuleAction.type: "logical"— булев комбинатор над вложенными правилами.
Правило default — поля сопоставления
RawDefaultRule содержит 41 поле; все необязательны и объединяются по И, когда задано несколько. Самые используемые:
| Поле | Тип | Описание |
|---|---|---|
inbound | []string | Сопоставление по тегу входящего. |
network | []string | tcp, 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_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). |
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*. |
route-options | Применить параметры маршрута к последующему сопоставлению, не покидая цепочку правил. |
direct | Прямое подключение — полностью в обход исходящих (использует default_interface и т. д.). |
bypass | Той же формы, что route; намеренно выделено отдельно для журналирования. |
reject | Отклонить соединение. С method: "drop" или method: "default". |
hijack-dns | Перехватить соединение как DNS и направить его в DNS-движок. |
sniff | Выполнить сниффинг протокола на соединении. |
resolve | Разрешить домен назначения через указанный DNS-сервер до выполнения последующих правил. |
Наборы правил
| Поле | Тип | По умолчанию | Допустимые значения | Описание |
|---|---|---|---|---|
type | string | inline | inline | local | remote | Где находится набор правил. `inline` хранит правила прямо в этой конфигурации; `local` читает из файла по пути; `remote` скачивает по URL. |
tag | string | (required) | <string> | Имя, на которое ссылается ключ сопоставления `rule_set` в правилах. |
format | string | (inferred) | source | binary | Формат файла. `source` — JSON; `binary` — скомпилированный формат `.srs`. Если не задан, определяется по расширению файла. |
Исходный код: option/rule_set.go:20-27 · зафиксировано на v1.13.15 (3708fa1)
Локальный набор правил
{ "type": "local", "tag": "cn", "format": "binary", "path": "geosite-cn.srs" }Удалённый набор правил
{
"type": "remote",
"tag": "cn",
"format": "binary",
"url": "https://example.com/geosite-cn.srs",
"download_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"] },
{ "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)
