TUN — sing-box
ورودی TUN در sing-box پیادهسازی متعارف یک TUN در Go است — اکثر پیادهسازیهای دیگر (mihomo، Clash-Meta، سایرین) از آن مشتق شدهاند. این ورودی یک دستگاه TUN ایجاد میکند، بستههای خام را در پشتهٔ سیستم یا gVisor پارس میکند، و اتصالات حاصل را به موتور مسیریابی ارسال میکند.
ورودی
type: "tun":
| فیلد | نوع | پیشفرض | مقادیر مجاز | توضیحات |
|---|---|---|---|---|
interface_name | string | (auto) | <interface name> | نام دستگاه TUN. خالی یک پیشفرض سیستمعامل (tun0، utun5 و غیره) را انتخاب میکند. |
netns | string | (unset) | <network namespace tag / name / path> | فقط Linux. رابط TUN را درون این فضاینام شبکه ایجاد میکند — tag یکی از network_namespaces سطح بالا، یا نام یا مسیر یک فضاینام. در این حالت auto_route / auto_redirect درون فضاینام عمل میکنند و اگر فضاینام متعلق به کاربر فعلی باشد نیازی به root نیست. با platform در تضاد است. |
mtu | uint32 | 65535 | <bytes> | MTU برای دستگاه. در صورت تنظیمنشدن: 65535، یا 9000 در Android و 4064 درون Apple Network Extension. |
address | badoption.Listable[netip.Prefix] | [] | <CIDR> | آدرسهای رابط (معمولاً یک IPv4 + یک IPv6). فیلدهای قدیمی inet4_address / inet6_address هنگام راهاندازی رد میشوند. |
dns_mode | string | hijack | disabled | 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_address | badoption.Listable[netip.Addr] | (derived from address) | <IP> | آدرس(های) سرور DNS مورد استفادهٔ dns_mode. اگر تنظیم نشود، برای هر خانواده IP بعد از نخستین مدخل address برگزیده میشود و اتصالها به آن خودکار به ماژول DNS ربوده میشوند (مانند قاعدهٔ hijack-dns). با تنظیم آن این ربایش خودکار خاموش میشود — اگر هنوز لازم است، یک قاعدهٔ مسیر hijack-dns صریح بیفزایید. |
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. |
include_mac_address | badoption.Listable[string] | [] | <MAC address> | فقط Linux با auto_route و auto_redirect. فقط ترافیک این آدرسهای MAC مبدأ را مسیریابی میکند (مثلاً دستگاههای LAN روی روتر). با exclude_mac_address در تضاد است. |
exclude_mac_address | badoption.Listable[string] | [] | <MAC address> | فقط Linux با auto_route و auto_redirect. این آدرسهای MAC مبدأ را مستثنا میکند. با include_mac_address در تضاد است. |
udp_timeout | UDPTimeoutCompat | 5m | <duration or seconds> | مهلت بیکاری برای جریانهای UDP. |
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 اگر حافظه قابل تشخیص نباشد). |
stack | string | (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 از دو رویکرد مسیریابی پشتیبانی میکند:
auto_route: true(بینپلتفرمی). مسیرهای سیستمعامل را نصب میکند که تمام ترافیک را به TUN هدایت میکنند. در Linux، از اندیسهای جدول + قاعدهٔ iproute2 استفاده میکند. در macOS،route addرا برنامهریزی میکند. در Windows، جدول مسیریابی را بهطور مستقیم برنامهریزی میکند.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):
{
"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 — فقط بستههای فهرستشده را پراکسی کن:
{
"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_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)
