Skip to content

Direct — sing-box ​

Direct — это сквозной исходящий sing-box и полезный входящий-«эхо» для тестов. Исходящая сторона намеренно минимальна: переопределение назначения — забота движка маршрутизации (route actions), а не полей исходящего.

Входящий ​

type: "direct":

ПолеТипПо умолчаниюДопустимые значенияОписание
networkNetworkList(tcp+udp)tcp | udp | Ограничение только TCP или только UDP.
override_addressstring(unset)<host>Переписывает адрес назначения каждого принятого соединения.
override_portuint16(unset)<port>Переписывает порт назначения каждого принятого соединения.

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

Встраивает ListenOptions (адрес прослушивания, порт, …). Входящий Direct чаще всего используется как перенаправитель портов: принять на одном порту, переписать назначение и провести трафик через любой исходящий.

Исходящий ​

type: "direct":

ПолеТипПо умолчаниюДопустимые значенияОписание
override_addressstring(rejected)(use route actions)На исходящем не поддерживается: установка приводит к ошибке запуска с отсылкой к действиям маршрутизации (route actions).
override_portuint16(rejected)(use route actions)То же, что override_address — не поддерживается; используйте route actions.
proxy_protocoluint8(unsupported)0Не поддерживается: любое ненулевое значение отклоняется при запуске.

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

Исходящий состоит только из встроенных DialerOptions (bind_interface, routing_mark, detour, …). Все три поля выше отклоняются при загрузке конфигурации; задавайте переопределение назначения через параметры правила маршрутизации (override_address / override_port в действии route).

Примеры ​

Голый исходящий direct (самый частый случай — просто дать трафику выход):

json
{
  "outbounds": [
    { "type": "direct", "tag": "direct" }
  ]
}

Исходящий direct, привязанный к конкретному интерфейсу:

json
{
  "outbounds": [
    {
      "type": "direct",
      "tag": "direct-eth0",
      "bind_interface": "eth0"
    }
  ]
}

Входящий перенаправитель портов (принимаем на 8080, переписываем назначение на internal:80):

json
{
  "inbounds": [
    {
      "type": "direct",
      "tag": "forward-8080",
      "listen": "0.0.0.0",
      "listen_port": 8080,
      "override_address": "10.0.0.5",
      "override_port": 80
    }
  ]
}

Примечания ​

  • Замена override_address / override_port через действие маршрута выглядит так:

    json
    {
      "route": {
        "rules": [
          {
            "inbound": ["forward-8080"],
            "action": "route",
            "outbound": "direct",
            "override_address": "10.0.0.5",
            "override_port": 80
          }
        ]
      }
    }

    Это переносит то же поведение с протокольного уровня в правило маршрутизации, что чище сочетается с остальной поверхностью маршрутизации.

  • Исходящий bridge — L3-аналог direct: пересылает L3-трафик (TCP, UDP, ICMP) из TUN или других L3-конечных точек напрямую через сетевой интерфейс. См. Исходящие.

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

  • Xray-core называет это Freedom. Его исходящий предоставляет куда более богатый набор возможностей — фрагментацию TCP/TLS, внесение шума, поле redirect — см. Freedom — Xray-core.
  • mihomo имеет ту же минимальную форму Direct и автоматически добавляет встроенный именованный прокси DIRECT. См. Direct — mihomo.

Исходный код: option/direct.go:10-25 · v1.14.2 (af6e64c)

Core Tutorial от Argsment