Перенаправление и 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, netns и т. д.). 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. |
udp_mapping | UDPNATBehavior | endpoint_independent | endpoint_independent | address_dependent | address_and_port_dependent | Сопоставление UDP NAT: одно сопоставление на адрес и порт источника для всех назначений (по умолчанию) либо отдельное для каждого адреса назначения / адреса и порта. |
udp_filtering | UDPNATBehavior | endpoint_independent | endpoint_independent | address_dependent | address_and_port_dependent | Фильтрация UDP NAT: принимать пакеты от любого удалённого узла (по умолчанию) либо только от адресов / пар адрес-порт, куда уже отправлялись пакеты. |
udp_nat_max | uint32 | 0 (auto) | <uint32> | Максимум сессий UDP NAT; при достижении лимита закрывается дольше всех не использовавшаяся. 0 — это 4096 на iOS, на других платформах от 4096 до 16384 в зависимости от объёма памяти (16384, если его не удалось определить). |
Исходный код: option/redir.go:7-13 · зафиксировано на v1.14.2 (af6e64c)
Плюс встроенные 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-13 · v1.14.2 (af6e64c)
