Skip to content

TUN — sing-box ​

ورودی TUN در sing-box پیاده‌سازی متعارف یک TUN در Go است — اکثر پیاده‌سازی‌های دیگر (mihomo، Clash-Meta، سایرین) از آن مشتق شده‌اند. این ورودی یک دستگاه TUN ایجاد می‌کند، بسته‌های خام را در پشتهٔ سیستم یا gVisor پارس می‌کند، و اتصالات حاصل را به موتور مسیریابی ارسال می‌کند.

ورودی ​

type: "tun":

فیلدنوعپیش‌فرضمقادیر مجازتوضیحات
interface_namestring(auto)<interface name>نام دستگاه TUN. خالی یک پیش‌فرض سیستم‌عامل (tun0، utun5 و غیره) را انتخاب می‌کند.
netnsstring(unset)<network namespace tag / name / path>فقط Linux. رابط TUN را درون این فضای‌نام شبکه ایجاد می‌کند — tag یکی از network_namespaces سطح بالا، یا نام یا مسیر یک فضای‌نام. در این حالت auto_route / auto_redirect درون فضای‌نام عمل می‌کنند و اگر فضای‌نام متعلق به کاربر فعلی باشد نیازی به root نیست. با platform در تضاد است.
mtuuint3265535<bytes>MTU برای دستگاه. در صورت تنظیم‌نشدن: 65535، یا 9000 در Android و 4064 درون Apple Network Extension.
addressbadoption.Listable[netip.Prefix][]<CIDR>آدرس‌های رابط (معمولاً یک IPv4 + یک IPv6). فیلدهای قدیمی inet4_address / inet6_address هنگام راه‌اندازی رد می‌شوند.
dns_modestringhijackdisabled | native | hijackنحوهٔ رسیدگی به DNS روی رابط TUN. native DNS بومی رابط در پلتفرم را تنظیم می‌کند (systemd-resolved در Linux، DNS به ازای رابط در Windows / Apple)؛ hijack (پیش‌فرض) علاوه بر آن ترافیک پورت 53 را می‌رباید — با یک قاعدهٔ iproute2 در Linux، با DNAT در nftables به dns_address همراه با auto_redirect، و با فیلتر WFP در Windows همراه با strict_route؛ disabled هیچ‌کدام را انجام نمی‌دهد.
dns_addressbadoption.Listable[netip.Addr](derived from address)<IP>آدرس(های) سرور DNS مورد استفادهٔ dns_mode. اگر تنظیم نشود، برای هر خانواده IP بعد از نخستین مدخل address برگزیده می‌شود و اتصال‌ها به آن خودکار به ماژول DNS ربوده می‌شوند (مانند قاعدهٔ hijack-dns). با تنظیم آن این ربایش خودکار خاموش می‌شود — اگر هنوز لازم است، یک قاعدهٔ مسیر hijack-dns صریح بیفزایید.
auto_routeboolfalsetrue | falseنصب خودکار مسیرهای سیستم‌عامل که تمام ترافیک را به دستگاه TUN هدایت می‌کنند.
iproute2_table_indexint2022<int>اندیس جدول iproute2 لینوکس که توسط auto_route استفاده می‌شود.
iproute2_rule_indexint9000<int>اندیس قاعدهٔ iproute2 لینوکس.
auto_redirectboolfalsetrue | falseهدایت خودکار NFTables لینوکس — اتصال ترافیک به TUN بدون تغییر مسیرها. در مسیرهای loopback پرکار سریع‌تر از auto_route است.
auto_redirect_input_markFwMark0<uint32>fwmark اعمال‌شده روی بسته‌های مقصد TUN.
auto_redirect_output_markFwMark0<uint32>fwmark اعمال‌شده روی بسته‌های خروجی TUN.
auto_redirect_reset_markFwMark0<uint32>fwmark برای حذف پس از پردازش.
auto_redirect_nfqueueuint160<uint16>شمارهٔ NFQUEUE برای مسیر auto-redirect.
auto_redirect_iproute2_fallback_rule_indexint0<int>اندیس قاعدهٔ پشتیبان وقتی auto-redirect قابل نصب نباشد.
exclude_mptcpboolfalsetrue | falseرد کردن جریان‌های MPTCP (بگذار از مسیر عادی هسته استفاده کنند).
loopback_addressbadoption.Listable[netip.Addr][]<IP>آدرس‌هایی که به‌عنوان loopback در نظر گرفته می‌شوند (از طریق TUN مسیریابی نشوند).
strict_routeboolfalsetrue | falseجلوگیری از نشت ترافیک به دور دستگاه TUN (قواعد DROP روی مرز مسیر پیش‌فرض).
route_addressbadoption.Listable[netip.Prefix][]<CIDR>وقتی auto_route روشن است، فقط این CIDRها را از طریق TUN مسیریابی کن. پیش‌فرض همه چیز را مسیریابی می‌کند.
route_address_setbadoption.Listable[string][]<rule-set tag>مسیریابی بر اساس ورودی‌های IP-CIDR مجموعه قواعد به‌جای فهرست صریح.
route_exclude_addressbadoption.Listable[netip.Prefix][]<CIDR>CIDRهایی که روی رابط پیش‌فرض نگه داشته می‌شوند (راه فرار).
route_exclude_address_setbadoption.Listable[string][]<rule-set tag>حذف مبتنی بر مجموعه قواعد.
include_interfacebadoption.Listable[string][]<interface>فقط به این رابط‌ها بپیوند (multi-NIC موبایل).
exclude_interfacebadoption.Listable[string][]<interface>این رابط‌ها را مستثنی کن.
include_uidbadoption.Listable[uint32][]<uid>گنجاندن UID لینوکس/macOS.
include_uid_rangebadoption.Listable[string][]<from:to>گنجاندن محدودهٔ UID.
exclude_uidbadoption.Listable[uint32][]<uid>حذف UID.
exclude_uid_rangebadoption.Listable[string][]<from:to>حذف محدودهٔ UID.
include_android_userbadoption.Listable[int][]<user id>گنجاندن چندکاربری Android.
include_packagebadoption.Listable[string][]<package name>گنجاندن بستهٔ Android.
exclude_packagebadoption.Listable[string][]<package name>حذف بستهٔ Android.
include_mac_addressbadoption.Listable[string][]<MAC address>فقط Linux با auto_route و auto_redirect. فقط ترافیک این آدرس‌های MAC مبدأ را مسیریابی می‌کند (مثلاً دستگاه‌های LAN روی روتر). با exclude_mac_address در تضاد است.
exclude_mac_addressbadoption.Listable[string][]<MAC address>فقط Linux با auto_route و auto_redirect. این آدرس‌های MAC مبدأ را مستثنا می‌کند. با include_mac_address در تضاد است.
udp_timeoutUDPTimeoutCompat5m<duration or seconds>مهلت بیکاری برای جریان‌های UDP.
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 اگر حافظه قابل تشخیص نباشد).
stackstring(mixed / system)system | gvisor | mixedپیاده‌سازی پشتهٔ TCP/IP. system از پشتهٔ شبکهٔ هسته استفاده می‌کند؛ gvisor یک پشتهٔ فضای کاربری اجرا می‌کند؛ mixed از پشتهٔ سیستم برای TCP و از gVisor برای UDP استفاده می‌کند. پیش‌فرض در ساخت‌های دارای gVisor برابر mixed و در غیر این صورت system است.
platform*TunPlatformOptions(unset)TunPlatformOptionsبازنویسی‌های خاص پلتفرم (در حال حاضر فقط http_proxy).

منبع: option/tun.go:14-72 · ثابت‌شده در v1.14.2 (af6e64c)

این ساختار همچنین InboundOptions را تعبیه می‌کند (sniff، sniff_override_dest، domain_strategy، …)، اما فقط برای آنکه هنگام راه‌اندازی آن‌ها را رد کند — بخش «نکات» را ببینید.

انتخاب پشته ​

  • system — TCP/IP بومی هسته. سریع‌ترین. به سیستم‌عامل نیاز دارد که ioctlهای صحیح TUN را در دسترس قرار دهد (Linux: بله؛ macOS: utun بله؛ Windows: wintun از طریق DLL).
  • gvisor — پشتهٔ TCP/IP فضای کاربری گوگل. کندتر اما قابل‌حمل؛ تنها انتخاب در پلتفرم‌هایی بدون پشتیبانی خوب از TUN هسته.
  • mixed — پشتهٔ سیستم برای TCP (توان عملیاتی در سطح هسته در مسیر پراتصال)، gVisor برای UDP. پیش‌فرض در ساخت‌های دارای gVisor (در غیر این صورت system پیش‌فرض است) و چیزی که اکثر کاربران می‌خواهند.

مدل‌های مسیریابی ​

TUN در sing-box از دو رویکرد مسیریابی پشتیبانی می‌کند:

  1. auto_route: true (بین‌پلتفرمی). مسیرهای سیستم‌عامل را نصب می‌کند که تمام ترافیک را به TUN هدایت می‌کنند. در Linux، از اندیس‌های جدول + قاعدهٔ iproute2 استفاده می‌کند. در macOS، route add را برنامه‌ریزی می‌کند. در Windows، جدول مسیریابی را به‌طور مستقیم برنامه‌ریزی می‌کند.

  2. auto_redirect: true (فقط Linux، همراه با auto_route). قواعد nftables اضافه می‌کند که ترافیک را به sing-box هدایت می‌کنند — مسیریابی و کارایی بهتر از auto_route ساده یا tproxy، بدون تداخل با شبکه‌های bridge داکر، و یکپارچگی خودکار با fw4 در OpenWrt. به nft و ماژول‌های هستهٔ متناظر نیاز دارد.

strict_route: true قواعد DROP را روی رابط پیرامون اضافه می‌کند تا از نشت ترافیک به دور TUN جلوگیری کند — برای معناشناسی kill-switch مهم است.

مثال‌ها ​

راه‌اندازی استاندارد دسکتاپ (Linux/macOS):

json
{
  "inbounds": [{
    "type": "tun",
    "tag": "tun-in",
    "interface_name": "sing-tun",
    "mtu": 9000,
    "address": ["172.16.0.1/30", "fdfe:dcba:9876::1/126"],
    "auto_route": true,
    "strict_route": true,
    "stack": "mixed"
  }],
  "route": {
    "auto_detect_interface": true,
    "rules": [
      { "action": "sniff" },
      { "protocol": "dns", "action": "hijack-dns" },
      { "ip_is_private": true, "outbound": "direct" }
    ],
    "final": "proxy"
  }
}

فیلتر برنامهٔ Android — فقط بسته‌های فهرست‌شده را پراکسی کن:

json
{
  "inbounds": [{
    "type": "tun",
    "interface_name": "tun0",
    "mtu": 9000,
    "address": ["172.16.0.1/30"],
    "auto_route": true,
    "stack": "system",
    "include_package": ["com.netflix.mediaclient", "com.spotify.music"]
  }]
}

Linux با auto-redirect NFTables (در میزبان‌های پرکار به auto-route ترجیح داده می‌شود):

json
{
  "inbounds": [{
    "type": "tun",
    "auto_route": true,
    "auto_redirect": true,
    "auto_redirect_input_mark": "0x100",
    "auto_redirect_output_mark": "0x200",
    "address": ["172.16.0.1/30"]
  }]
}

نکات ​

  • dns_mode پیش‌فرض (hijack) وضعیت سیستم را تغییر می‌دهد: sing-box DNS بومی رابط TUN را تنظیم می‌کند و ربایش پورت 53 را نصب می‌کند. برای دست‌نخورده ماندن DNS رابط و دیوارهٔ آتش، "dns_mode": "disabled" را تنظیم کنید.
  • فیلدهای inet4_address / inet6_address، گونه‌های مسیر inet4_* / inet6_* آن‌ها و gso پارس می‌شوند اما هنگام راه‌اندازی رد می‌شوند؛ در جدول بالا پنهان شده‌اند. از address، route_address و route_exclude_address استفاده کنید.
  • فیلدهای ورودی که در این ساختار تعبیه شده‌اند (sniff، sniff_override_dest، domain_strategy، …) هنگام راه‌اندازی رد می‌شوند — به‌جای آن‌ها از کنش‌های قاعدهٔ مسیر sniff / resolve استفاده کنید.
  • endpoint_independent_nat پارس می‌شود اما نادیده گرفته می‌شود. رفتار UDP NAT با udp_mapping / udp_filtering (پیش‌فرض: مستقل از نقطه‌انتهایی) تنظیم و با udp_nat_max محدود می‌شود.
  • auto_redirect به auto_route نیاز دارد (فقط Linux) و با route.default_mark و routing_mark سطح شماره‌گیری در تضاد است.
  • وقتی auto_route فعال است، strict_route شبکه‌های پشتیبانی‌نشده را غیرقابل‌دسترس می‌کند؛ در Windows از نشت DNS ناشی از حل چندخانگی نیز جلوگیری می‌کند. در Linux همراه با auto_redirect، ترافیک SO_BINDTODEVICE را نیز از sing-box عبور می‌دهد.

نکات بین‌هسته‌ای ​

  • Xray-core یک ورودی TUN حداقلی دارد — می‌تواند با autoSystemRoutingTable مسیرها را نصب کند، اما ربایش DNS و فیلتر برنامه ندارد. بنگرید به TUN — Xray-core.
  • mihomo مجموعه ویژگی‌های تقریباً یکسانی زیر بلوک سطح بالای tun: دارد، با نام‌های فیلد kebab-case و یک فهرست dns-hijack اضافی. بنگرید به TUN — mihomo.

منبع: option/tun.go:14-72 · v1.14.2 (af6e64c)

Core Tutorial اثر Argsment