Skip to content

Bridge — sing-box ​

bridge — это L3-аналог исходящего direct. Вместо открытия сокетов он пересылает L3-трафик — TCP, UDP и ICMP, — приходящий от входящего TUN или другой L3-конечной точки (WireGuard, Tailscale), прямо через сетевой интерфейс, не преобразуя его сначала в L4-соединения.

Привилегии и платформы

bridge требует повышенных привилегий и доступен только в Linux, macOS, Windows (x86 / x64, через WinDivert), на Android с root и на iOS с джейлбрейком; на других платформах исходящий завершается ошибкой при запуске. В графических клиентах нужна автономная сборка для macOS с её вспомогательной службой, root на Android или iOS-устройство с джейлбрейком.

Параметры исходящего ​

type: "bridge" в outbounds[]:

ПолеТипПо умолчаниюДопустимые значенияОписание
interfacestring(default interface)<interface name>Интерфейс выхода для пересылаемого трафика. Если не задан, используется интерфейс по умолчанию; пока выбранный интерфейс недоступен, трафик отбрасывается.
bridge_namestringbridge<name prefix>Префикс имени TUN-интерфейса bridge, который создаёт sing-box. На платформах Apple не действует.
iproute2_table_indexint2200 + instance index<int>Только Linux и только при заданном interface: индекс таблицы маршрутизации iproute2 для закреплённых маршрутов выхода.
iproute2_rule_indexint100<int>Только Linux: начальный индекс правил iproute2, которые устанавливает bridge.

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

Примеры ​

Пересылать на уровне L3 через bridge трафик в локальную сеть, перехваченный TUN, а всё остальное отправлять через direct:

json
{
  "inbounds": [
    {
      "type": "tun",
      "tag": "tun-in",
      "address": ["172.19.0.1/30"],
      "auto_route": true
    }
  ],
  "outbounds": [
    { "type": "direct", "tag": "direct" },
    { "type": "bridge", "tag": "bridge-out" }
  ],
  "route": {
    "rules": [
      {
        "ip_cidr": ["192.168.0.0/16"],
        "preferred_by": ["bridge-out"],
        "outbound": "bridge-out"
      }
    ],
    "final": "direct"
  }
}

Примечания ​

  • bridge переносит только L3-трафик. Он достигается через действие route, совпавшее на этапе предварительного сопоставления на L3-входящем (TUN, WireGuard, Tailscale). Соединения от L4-входящих (SOCKS, HTTP и т. д.) или направленные правилами, которые совпадают только после предварительного сопоставления, завершаются ошибкой only L3 traffic is supported by bridge.
  • Локальные для машины назначения — loopback, неопределённый адрес или любой адрес, назначенный её собственным интерфейсам, — отклоняются с предупреждением. Исключайте их в правилах.
  • Рекомендуемый фильтр — preferred_by: ["<bridge tag>"]: для bridge он совпадает с любым нелокальным назначением и только на этапе предварительного сопоставления, поэтому никогда не захватывает трафик, который bridge не может обработать.
  • bridge может быть и исходящим по умолчанию: если при предварительном сопоставлении ни одно правило не совпало, L3-пересылка всё равно применяется (для групп исходящих используется текущий выбранный участник). Дошедшие до него L4-соединения отклоняются.
  • Назначения FakeIP должны быть разрешены действием resolve на этапе предварительного сопоставления, иначе соединение отклоняется.
  • Для ICMP пересылать на уровне L3 может и direct; для TCP и UDP — только bridge и конечные точки WireGuard / Tailscale.

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

  • У Xray-core и mihomo нет исходящего с L3-пересылкой: их входящие TUN всегда завершают TCP / UDP и заново устанавливают соединение через исходящий (freedom в Xray, DIRECT в mihomo). См. TUN — Xray-core и TUN — mihomo.

Исходный код: option/bridge.go:3-8 · v1.14.2 (af6e64c)

Core Tutorial от Argsment