TUN — sing-box
ورودی TUN در sing-box پیادهسازی متعارف یک TUN در Go است — اکثر پیادهسازیهای دیگر (mihomo، Clash-Meta، سایرین) از آن مشتق شدهاند. این ورودی یک دستگاه TUN ایجاد میکند، بستههای خام را در پشتهٔ سیستم یا gVisor پارس میکند، و اتصالات حاصل را به موتور مسیریابی ارسال میکند.
ورودی
type: "tun":
| فیلد | نوع | پیشفرض | مقادیر مجاز | توضیحات |
|---|---|---|---|---|
interface_name | string | (auto) | <interface name> | نام دستگاه TUN. خالی یک پیشفرض سیستمعامل (`tun0`، `utun5` و غیره) را انتخاب میکند. |
mtu | uint32 | 9000 | <bytes> | MTU برای دستگاه. مقدار ۹۰۰۰ پیشفرض sing-box است — بالا برای کاهش سربار بستهها. |
address | badoption.Listable[netip.Prefix] | [] | <CIDR> | آدرسهای رابط (یک IPv4 + یک IPv6 معمول). جایگزین جفت منسوخشدهٔ `inet4_address` / `inet6_address`. |
auto_route | bool | false | true | false | نصب خودکار مسیرهای سیستمعامل که تمام ترافیک را به دستگاه TUN هدایت میکنند. |
iproute2_table_index | int | 2022 | <int> | اندیس جدول iproute2 لینوکس که توسط `auto_route` استفاده میشود. |
iproute2_rule_index | int | 9000 | <int> | اندیس قاعدهٔ iproute2 لینوکس. |
auto_redirect | bool | false | true | false | هدایت خودکار NFTables لینوکس — اتصال ترافیک به TUN بدون تغییر مسیرها. در مسیرهای loopback پرکار سریعتر از auto_route است. |
auto_redirect_input_mark | FwMark | 0 | <uint32> | fwmark اعمالشده روی بستههای مقصد TUN. |
auto_redirect_output_mark | FwMark | 0 | <uint32> | fwmark اعمالشده روی بستههای خروجی TUN. |
auto_redirect_reset_mark | FwMark | 0 | <uint32> | fwmark برای حذف پس از پردازش. |
auto_redirect_nfqueue | uint16 | 0 | <uint16> | شمارهٔ NFQUEUE برای مسیر auto-redirect. |
auto_redirect_iproute2_fallback_rule_index | int | 0 | <int> | اندیس قاعدهٔ پشتیبان وقتی auto-redirect قابل نصب نباشد. |
exclude_mptcp | bool | false | true | false | رد کردن جریانهای MPTCP (بگذار از مسیر عادی هسته استفاده کنند). |
loopback_address | badoption.Listable[netip.Addr] | [] | <IP> | آدرسهایی که بهعنوان loopback در نظر گرفته میشوند (از طریق TUN مسیریابی نشوند). |
strict_route | bool | false | true | false | جلوگیری از نشت ترافیک به دور دستگاه TUN (قواعد DROP روی مرز مسیر پیشفرض). |
route_address | badoption.Listable[netip.Prefix] | [] | <CIDR> | وقتی `auto_route` روشن است، فقط این CIDRها را از طریق TUN مسیریابی کن. پیشفرض همه چیز را مسیریابی میکند. |
route_address_set | badoption.Listable[string] | [] | <rule-set tag> | مسیریابی بر اساس ورودیهای IP-CIDR مجموعه قواعد بهجای فهرست صریح. |
route_exclude_address | badoption.Listable[netip.Prefix] | [] | <CIDR> | CIDRهایی که روی رابط پیشفرض نگه داشته میشوند (راه فرار). |
route_exclude_address_set | badoption.Listable[string] | [] | <rule-set tag> | حذف مبتنی بر مجموعه قواعد. |
include_interface | badoption.Listable[string] | [] | <interface> | فقط به این رابطها بپیوند (multi-NIC موبایل). |
exclude_interface | badoption.Listable[string] | [] | <interface> | این رابطها را مستثنی کن. |
include_uid | badoption.Listable[uint32] | [] | <uid> | گنجاندن UID لینوکس/macOS. |
include_uid_range | badoption.Listable[string] | [] | <from:to> | گنجاندن محدودهٔ UID. |
exclude_uid | badoption.Listable[uint32] | [] | <uid> | حذف UID. |
exclude_uid_range | badoption.Listable[string] | [] | <from:to> | حذف محدودهٔ UID. |
include_android_user | badoption.Listable[int] | [] | <user id> | گنجاندن چندکاربری Android. |
include_package | badoption.Listable[string] | [] | <package name> | گنجاندن بستهٔ Android. |
exclude_package | badoption.Listable[string] | [] | <package name> | حذف بستهٔ Android. |
udp_timeout | UDPTimeoutCompat | 5m | <duration or seconds> | مهلت بیکاری برای جریانهای UDP. |
stack | string | mixed | system | gvisor | mixed | پیادهسازی پشتهٔ TCP/IP. `system` از پشتهٔ شبکهٔ هسته استفاده میکند؛ `gvisor` یک پشتهٔ فضای کاربری اجرا میکند؛ `mixed` از gVisor برای TCP و از سیستم برای UDP استفاده میکند. |
platform | *TunPlatformOptions | (unset) | TunPlatformOptions | بازنویسیهای خاص پلتفرم (در حال حاضر فقط `http_proxy`). |
gso | bool | — | — | Deprecated: removed |
inet4_address | badoption.Listable[netip.Prefix] | — | — | Deprecated: merged to Address |
inet6_address | badoption.Listable[netip.Prefix] | — | — | Deprecated: merged to Address |
inet4_route_address | badoption.Listable[netip.Prefix] | — | — | Deprecated: merged to RouteAddress |
inet6_route_address | badoption.Listable[netip.Prefix] | — | — | Deprecated: merged to RouteAddress |
inet4_route_exclude_address | badoption.Listable[netip.Prefix] | — | — | Deprecated: merged to RouteExcludeAddress |
inet6_route_exclude_address | badoption.Listable[netip.Prefix] | — | — | Deprecated: merged to RouteExcludeAddress |
endpoint_independent_nat | bool | — | — | Deprecated: 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 از دو رویکرد مسیریابی پشتیبانی میکند:
auto_route: true(بینپلتفرمی). مسیرهای سیستمعامل را نصب میکند که تمام ترافیک را به TUN هدایت میکنند. در Linux، از اندیسهای جدول- قاعدهٔ iproute2 استفاده میکند. در macOS،
route addرا برنامهریزی میکند. در Windows، جدول مسیریابی را بهطور مستقیم برنامهریزی میکند.
- قاعدهٔ iproute2 استفاده میکند. در macOS،
auto_redirect: true(فقط Linux). بهجای تغییر مسیرها، قواعد redirect NFTables را نصب میکند. در مسیرهای loopback پرکار سریعتر است چون هاپ اضافی وجود ندارد. بهnftو ماژولهای هستهٔ متناظر نیاز دارد.
strict_route: true قواعد DROP را روی رابط پیرامون اضافه میکند تا از نشت ترافیک به دور TUN جلوگیری کند — برای معناشناسی kill-switch مهم است.
مثالها
راهاندازی استاندارد دسکتاپ (Linux/macOS):
{
"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 — فقط بستههای فهرستشده را پراکسی کن:
{
"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 ترجیح داده میشود):
{
"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)
