Перенаправление и 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_BOXtype: "tproxy"
| Поле | Тип | По умолчанию | Допустимые значения | Описание |
|---|---|---|---|---|
network | NetworkList | (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)
