Redirect & 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: در iOS برابر 4096، و در دیگر پلتفرمها بر اساس کل حافظه بین 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 تنظیم شود.
نکات
- هر دو نوع ورودی به
CAP_NET_ADMINنیاز دارند. sing-box را بهعنوان root اجرا کنید یا با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)
