zapret-kvn/docs/sing-box/reference/route-rules.md
2026-03-27 14:15:12 +03:00

14 KiB
Raw Permalink Blame History

Route -- справочник полей

Целевая версия: sing-box 1.14.x | Платформа: Windows


Route (верхний уровень)

Структура

{
  "route": {
    "rules": [],
    "rule_set": [],
    "final": "",
    "auto_detect_interface": false,
    "default_interface": "",
    "default_domain_resolver": "",
    "find_process": false
  }
}

Поля

Поле Тип Описание По умолчанию
rules Rule[] Список правил маршрутизации []
rule_set RuleSet[] Список наборов правил (inline/local/remote) []
final string Тег outbound по умолчанию; если пусто -- первый outbound ""
auto_detect_interface bool Привязка к NIC по умолчанию; предотвращает петли при TUN false
default_interface string Привязка к конкретному NIC (альтернатива auto_detect_interface) ""
default_domain_resolver string или object DNS-резолвер для outbound по умолчанию (с 1.12) ""
find_process bool Поиск процесса для логов, когда нет process-правил false

Rule-set (краткая справка)

{
  "route": {
    "rule_set": [
      {
        "type": "remote",
        "tag": "geosite-ru",
        "format": "binary",
        "url": "https://example.com/geosite-ru.srs",
        "download_detour": "proxy",
        "update_interval": "24h"
      },
      {
        "type": "local",
        "tag": "my-rules",
        "format": "source",
        "path": "ruleset/my-rules.json"
      }
    ]
  }
}
Поле Тип Описание
type string "inline" (с 1.10), "local", "remote"
tag string Уникальный тег для ссылки из правил
format string "source" (JSON) или "binary" (SRS)
path string Путь к файлу (для local)
url string URL для скачивания (для remote)
download_detour string Outbound для скачивания
update_interval string Интервал обновления, например "24h"

Для кеширования remote rule-set необходимо experimental.cache_file.enabled: true.


Правила маршрутизации (route rules)

Структура правила

{
  "route": {
    "rules": [
      {
        "domain_suffix": [".ru", ".su"],
        "action": "route",
        "outbound": "proxy"
      }
    ]
  }
}

Формула матчинга

Внутри одной группы условий действует логика OR (любое совпадение). Между группами действует логика AND (все группы должны совпасть).

(domain || domain_suffix || domain_keyword || domain_regex) &&
(ip_cidr || ip_is_private) &&
(port || port_range) &&
(source_ip_cidr || source_ip_is_private) &&
(source_port || source_port_range) &&
остальные_поля

Ветки внутри подключённого rule-set объединяются по OR, но каждая ветка мержится с внешним правилом.

Match-условия (Windows)

Поле Тип Описание С версии
inbound string[] Теги inbound --
ip_version int 4 или 6 --
network string[] "tcp", "udp", "icmp" (icmp с 1.13, только из TUN) --
protocol string[] Sniffed-протокол: http, tls, quic, dns, stun, bittorrent, dtls, ssh, rdp, ntp --
client string[] Sniffed-клиент: chromium, safari, firefox, quic-go 1.10
domain string[] Полное совпадение домена --
domain_suffix string[] Суффикс домена (.ru, .example.com) --
domain_keyword string[] Ключевое слово в домене --
domain_regex string[] Регулярное выражение для домена --
ip_cidr string[] CIDR назначения (10.0.0.0/8, 192.168.0.1) --
ip_is_private bool Не-публичный IP назначения 1.8
source_ip_cidr string[] CIDR источника --
source_ip_is_private bool Не-публичный IP источника 1.8
port int[] Порт(ы) назначения --
port_range string[] Диапазон портов: "1000:2000", ":3000", "4000:" --
source_port int[] Порт(ы) источника --
source_port_range string[] Диапазон портов источника --
process_name string[] Имя исполняемого файла (chrome.exe) --
process_path string[] Полный путь к исполняемому файлу --
process_path_regex string[] Regex для пути процесса 1.10
clash_mode string Режим Clash API (direct, global, rule) --
interface_address object Совпадение по адресу интерфейса {"eth0": ["10.0.0.0/8"]} 1.13
default_interface_address string[] Совпадение по адресу интерфейса по умолчанию 1.13
rule_set string[] Теги rule-set 1.8
rule_set_ip_cidr_match_source bool IP-правила в rule-set матчат source IP 1.10
invert bool Инвертировать результат матча --

Массивы с одним элементом можно писать как строку: "domain": "example.com".

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

{
  "type": "logical",
  "mode": "and",
  "rules": [
    {"domain_suffix": ".example.com"},
    {"port": [80, 443]}
  ],
  "invert": false,
  "action": "route",
  "outbound": "proxy"
}
Поле Тип Описание
type string "logical"
mode string "and" или "or" (обязательно)
rules Rule[] Вложенные правила (обязательно)
invert bool Инвертировать результат

Действия (rule actions)

route (финальное)

Маршрутизация к указанному outbound.

{
  "action": "route",
  "outbound": "proxy"
}
Поле Тип Описание Обязательно
outbound string Тег outbound да

Может включать поля route-options (см. ниже) для inline-настроек.

reject (финальное)

Отклонение соединения.

{
  "action": "reject",
  "method": "default",
  "no_drop": false
}
Поле Тип Описание По умолчанию
method string TCP/UDP: "default" (RST + ICMP unreachable), "drop" (тихо). ICMP echo: "default" (unreachable), "drop", "reply" (с 1.13) "default"
no_drop bool Если false, после 50 срабатываний за 30 сек method переключается на "drop" false

hijack-dns (финальное)

Перенаправляет DNS-запросы в DNS-модуль sing-box. Дополнительных полей нет.

{
  "action": "hijack-dns"
}

sniff (нефинальное)

Определение протокола соединения.

{
  "action": "sniff",
  "sniffer": ["tls", "http", "quic"],
  "timeout": "300ms"
}
Поле Тип Описание По умолчанию
sniffer string[] Протоколы для определения; если пусто -- все включены все
timeout string Таймаут определения "300ms"

resolve (нефинальное)

Резолв домена в IP-адреса перед маршрутизацией.

{
  "action": "resolve",
  "server": "bootstrap",
  "strategy": "prefer_ipv4",
  "disable_cache": false,
  "rewrite_ttl": null,
  "client_subnet": null
}
Поле Тип Описание По умолчанию
server string Тег DNS-сервера ""
strategy string prefer_ipv4, prefer_ipv6, ipv4_only, ipv6_only из dns.strategy
disable_cache bool Отключить кеш для этого запроса (с 1.12) false
rewrite_ttl int? Перезаписать TTL в ответе (с 1.12) null
client_subnet string? EDNS0-subnet (с 1.12) null

route-options (нефинальное)

Настройки маршрутизации. Можно использовать как самостоятельное действие или inline внутри route.

{
  "action": "route-options",
  "override_address": "",
  "override_port": 0,
  "udp_disable_domain_unmapping": false,
  "udp_connect": false,
  "udp_timeout": "",
  "tls_fragment": false,
  "tls_fragment_fallback_delay": "500ms",
  "tls_record_fragment": ""
}
Поле Тип Описание По умолчанию
override_address string Подменить адрес назначения ""
override_port int Подменить порт назначения 0
udp_disable_domain_unmapping bool Отправлять оригинальный адрес пакета в UDP-ответе false
udp_connect bool Подключаться к UDP-назначению вместо прослушивания false
udp_timeout string Таймаут UDP-соединений по протоколу
tls_fragment bool Фрагментация TLS handshake для обхода DPI (с 1.12) false
tls_fragment_fallback_delay string Задержка, если авто-определение времени недоступно (с 1.12) "500ms"
tls_record_fragment string Фрагментация на уровне TLS-записей -- лучше производительность (с 1.12) ""

Протоколы sniff

Сеть Протокол Извлекаемая информация
TCP http Host header -- домен
TCP tls SNI -- домен
UDP quic SNI + тип клиента (chromium/safari/firefox/quic-go) -- домен
UDP stun STUN binding
TCP/UDP dns DNS-запрос
TCP/UDP bittorrent Info hash
UDP dtls DTLS fingerprint
TCP ssh SSH-протокол
TCP rdp RDP-протокол
UDP ntp NTP-протокол

UDP-таймауты по протоколу: dns/ntp/stun -- 10s, quic/dtls -- 30s. Определение по порту (без sniff): 53 -- dns, 123 -- ntp, 443 -- quic, 3478 -- stun.


Не поддерживается на Windows

Следующие match-условия недоступны на Windows:

Поле Платформа
user, user_id Linux
package_name Android
wifi_ssid, wifi_bssid Android / Apple / Linux
network_type, network_is_expensive, network_is_constrained Android / Apple
network_interface_address Android / Apple
source_mac_address, source_hostname Linux / macOS (с 1.14)
preferred_by WireGuard / Tailscale outbound (с 1.13)

Недоступные поля верхнего уровня route:

Поле Платформа
default_mark Linux
override_android_vpn Android
find_neighbor, dhcp_lease_files Linux / macOS (с 1.14)
default_network_strategy, default_network_type, default_fallback_network_type, default_fallback_delay Android / Apple

Примеры

1. Sniff + DNS hijack (стандартные первые два правила)

{
  "route": {
    "rules": [
      {"action": "sniff"},
      {"protocol": "dns", "action": "hijack-dns"}
    ]
  }
}

2. Обход для защищённого процесса (прокси-клиент не проксирует себя)

{
  "process_name": ["xray.exe", "sing-box.exe"],
  "action": "route",
  "outbound": "direct"
}

3. Обход LAN-трафика

{
  "ip_is_private": true,
  "action": "route",
  "outbound": "direct"
}

4. Маршрутизация по процессу

{
  "process_name": "firefox.exe",
  "action": "route",
  "outbound": "proxy"
}
{
  "process_path_regex": "^C:\\\\Program Files\\\\Google\\\\.*",
  "action": "route",
  "outbound": "proxy"
}

5. Маршрутизация по домену

{
  "domain_suffix": [".ru", ".su"],
  "domain_keyword": ["yandex", "mail"],
  "action": "route",
  "outbound": "direct"
}

6. Логическое правило (AND)

{
  "type": "logical",
  "mode": "and",
  "rules": [
    {"process_name": "chrome.exe"},
    {"port": [80, 443]}
  ],
  "action": "route",
  "outbound": "proxy"
}

7. Правило с TLS-фрагментацией (обход DPI)

{
  "domain_suffix": ".blocked-site.com",
  "action": "route",
  "outbound": "proxy",
  "tls_fragment": true,
  "tls_fragment_fallback_delay": "400ms"
}