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` و غیره) را انتخاب می‌کند.
mtuuint329000<bytes>MTU برای دستگاه. مقدار ۹۰۰۰ پیش‌فرض sing-box است — بالا برای کاهش سربار بسته‌ها.
addressbadoption.Listable[netip.Prefix][]<CIDR>آدرس‌های رابط (یک IPv4 + یک IPv6 معمول). جایگزین جفت منسوخ‌شدهٔ `inet4_address` / `inet6_address`.
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.
udp_timeoutUDPTimeoutCompat5m<duration or seconds>مهلت بیکاری برای جریان‌های UDP.
stackstringmixedsystem | gvisor | mixedپیاده‌سازی پشتهٔ TCP/IP. `system` از پشتهٔ شبکهٔ هسته استفاده می‌کند؛ `gvisor` یک پشتهٔ فضای کاربری اجرا می‌کند؛ `mixed` از gVisor برای TCP و از سیستم برای UDP استفاده می‌کند.
platform*TunPlatformOptions(unset)TunPlatformOptionsبازنویسی‌های خاص پلتفرم (در حال حاضر فقط `http_proxy`).
gsoboolDeprecated: removed
inet4_addressbadoption.Listable[netip.Prefix]Deprecated: merged to Address
inet6_addressbadoption.Listable[netip.Prefix]Deprecated: merged to Address
inet4_route_addressbadoption.Listable[netip.Prefix]Deprecated: merged to RouteAddress
inet6_route_addressbadoption.Listable[netip.Prefix]Deprecated: merged to RouteAddress
inet4_route_exclude_addressbadoption.Listable[netip.Prefix]Deprecated: merged to RouteExcludeAddress
inet6_route_exclude_addressbadoption.Listable[netip.Prefix]Deprecated: merged to RouteExcludeAddress
endpoint_independent_natboolDeprecated: removed

منبع: option/tun.go:13-63 · ثابت‌شده در v1.13.11 (553cfa1)

این ساختار همچنین InboundOptions را تعبیه می‌کند (sniff، sniff_override_dest، domain_strategy، …).

انتخاب پشته

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

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

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

  1. auto_route: true (بین‌پلتفرمی). مسیرهای سیستم‌عامل را نصب می‌کند که تمام ترافیک را به TUN هدایت می‌کنند. در Linux، از اندیس‌های جدول

    • قاعدهٔ iproute2 استفاده می‌کند. در macOS، route add را برنامه‌ریزی می‌کند. در Windows، جدول مسیریابی را به‌طور مستقیم برنامه‌ریزی می‌کند.
  2. auto_redirect: true (فقط Linux). به‌جای تغییر مسیرها، قواعد redirect NFTables را نصب می‌کند. در مسیرهای loopback پرکار سریع‌تر است چون هاپ اضافی وجود ندارد. به 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",
    "sniff": true,
    "sniff_override_dest": true
  }],
  "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_redirect": true,
    "auto_redirect_input_mark": "0x100",
    "auto_redirect_output_mark": "0x200",
    "address": ["172.16.0.1/30"]
  }]
}

نکات

  • address قبلاً دو فیلد بود (inet4_address / inet6_address). هر دو هنوز پارس می‌شوند اما هشدار منسوخ‌شدن صادر می‌کنند — پیکربندی‌ها باید از فهرست ترکیبی جدید address استفاده کنند.
  • endpoint_independent_nat حذف شد. به‌جای آن، آن را روی کنش قاعدهٔ مسیر تنظیم کنید (از طریق udp_disable_domain_unmapping).
  • gso حذف شد — GSO هسته به‌طور خودکار شناسایی می‌شود.
  • auto_route و auto_redirect متقابلاً انحصاری هستند. یکی را انتخاب کنید.
  • strict_route در Linux وقتی در دسترس باشد از NFTables استفاده می‌کند، وگرنه به iptables بازمی‌گردد. هر دو به root نیاز دارند.

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

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

منبع: option/tun.go:13-63 · v1.13.11 (553cfa1)

Core Tutorial اثر Argsment