Skip to content

Перенаправление и TProxy — sing-box

В sing-box есть два выделенных типа входящих для прозрачного проксирования в Linux: redirect (iptables REDIRECT, только TCP) и tproxy (iptables/nftables TPROXY, TCP+UDP).

type: "redirect"

json
{
  "inbounds": [{
    "type": "redirect",
    "tag": "redir-in",
    "listen": "127.0.0.1",
    "listen_port": 12345
  }]
}

Применяются только поля встроенных ListenOptions (listen, listen_port, tcp_fast_open, sniff и т. д.). REDIRECT работает только по TCP.

В паре с iptables:

sh
iptables -t nat -N SING_BOX
iptables -t nat -A SING_BOX -d 192.168.0.0/16 -j RETURN
iptables -t nat -A SING_BOX -d 10.0.0.0/8 -j RETURN
iptables -t nat -A SING_BOX -p tcp -j REDIRECT --to-ports 12345
iptables -t nat -A OUTPUT -p tcp -j SING_BOX

type: "tproxy"

ПолеТипПо умолчаниюДопустимые значенияОписание
networkNetworkList(tcp+udp)tcp | udp | Ограничить только TCP или только UDP. TPROXY поддерживает оба; REDIRECT — только TCP.

Исходный код: option/redir.go:7-10 · зафиксировано на v1.13.15 (3708fa1)

Плюс встроенные ListenOptions.

json
{
  "inbounds": [{
    "type": "tproxy",
    "tag": "tproxy-in",
    "listen": "0.0.0.0",
    "listen_port": 12345,
    "network": "tcp,udp"
  }]
}

Соответствующие правила iptables в таблице mangle:

sh
iptables -t mangle -N SING_BOX
iptables -t mangle -A SING_BOX -d 192.168.0.0/16 -j RETURN
iptables -t mangle -A SING_BOX -d 10.0.0.0/8 -j RETURN
iptables -t mangle -A SING_BOX -m mark --mark 0x100 -j RETURN
iptables -t mangle -A SING_BOX -p tcp -j TPROXY --on-port 12345 --tproxy-mark 0x1
iptables -t mangle -A SING_BOX -p udp -j TPROXY --on-port 12345 --tproxy-mark 0x1
iptables -t mangle -A PREROUTING -j SING_BOX

ip rule add fwmark 0x1 table 100
ip route add local 0.0.0.0/0 dev lo table 100

Обходная метка (0x100 выше) должна совпадать с соответствующим fwmark на исходящих сокетах sing-box — он задаётся полем routing_mark исходящего или route.default_mark.

Примечания

  • Обоим типам входящих нужна capability CAP_NET_ADMIN. Запускайте sing-box от root или установите capability на бинарный файл через setcap.
  • tproxy предпочтителен для новых конфигураций: он обрабатывает UDP и работает без NAT-трансляции (исходное назначение аккуратно читается из сокета).
  • Это типы входящих только для Linux. На других платформах для прозрачного проксирования используйте TUN.

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

  • Xray-core достигает того же входящим Dokodemo-door с streamSettings.sockopt.tproxy. См. Redirect/TProxy — Xray-core.
  • mihomo имеет ту же механику на стороне ядра в виде сокращений верхнего уровня redir-port / tproxy-port и записей listeners: с type: redir / type: tproxy. См. Redirect/TProxy — mihomo.

Исходный код: option/redir.go:7-10 · v1.13.15 (3708fa1)

Core Tutorial от Argsment