Skip to content

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_BOX

type: "tproxy" ​

فیلدنوعپیش‌فرضمقادیر مجازتوضیحات
networkNetworkList(tcp+udp)tcp | udp | محدودسازی به فقط TCP یا فقط UDP. TPROXY از هر دو پشتیبانی می‌کند؛ REDIRECT فقط TCP است.
udp_mappingUDPNATBehaviorendpoint_independentendpoint_independent | address_dependent | address_and_port_dependentرفتار نگاشت UDP NAT: برای هر آدرس و پورت مبدأ یک نگاشت برای همهٔ مقصدها (پیش‌فرض)، یا نگاشت جداگانه برای هر آدرس مقصد / هر آدرس و پورت مقصد.
udp_filteringUDPNATBehaviorendpoint_independentendpoint_independent | address_dependent | address_and_port_dependentرفتار فیلتر UDP NAT: پذیرفتن بسته از هر نقطهٔ دور (پیش‌فرض)، یا فقط از آدرس‌ها / جفت‌های آدرس و پورتی که پیش‌تر به آن‌ها بسته فرستاده شده است.
udp_nat_maxuint320 (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)

Core Tutorial اثر Argsment