Skip to content

TUN — mihomo ​

tun: در mihomo یک بلوک پیکربندی سطح بالا است (نه یک ورودی listeners:). طرحواره تقریباً مشابه ورودی TUN در sing-box است (پیاده‌سازی mihomo از sing-box مشتق شده است) با چند افزودنی مخصوص mihomo: dns-hijack صریح، کلید حذف ICMP و پرچم‌های بهینه‌سازی recvmsg_x/sendmsg_x در Darwin.

بلوک سطح بالای tun: ​

فیلدنوعپیش‌فرضمقادیر مجازتوضیحات
enableboolfalsetrue | falseکلید اصلی. وقتی false باشد بقیهٔ بلوک نادیده گرفته می‌شود.
devicestring(auto)<interface name>نام دستگاه TUN.
stackC.TUNStackgvisorsystem | gvisor | mixed | mipsپشتهٔ TCP/IP. همان مقادیر sing-box به‌علاوهٔ mips (پشتهٔ فضای کاربری خود mihomo).
dns-hijack[]string[][<address>]آدرس‌هایی که باید به‌عنوان DNS ربوده شوند — UDP خروجی به این نقاط پایانی به موتور DNS داخلی تغییر مسیر داده می‌شود. مقدار استاندارد: [any:53] (همه را بگیرد).
auto-routeboolfalsetrue | falseنصب خودکار مسیرهای سیستم‌عامل.
auto-detect-interfaceboolfalsetrue | falseکشف خودکار رابط خروجی پیش‌فرض — برای حذف ترافیک متصل به TUN از ورود مجدد به TUN استفاده می‌شود.
mtuuint320 (auto)<bytes>MTU دستگاه. ۰ یک مقدار پیش‌فرض معقول را انتخاب می‌کند (۹۰۰۰ در اکثر سکوها).
gsoboolfalsetrue | falseGeneric Segmentation Offload (Linux). وقتی کرنل پشتیبانی می‌کند بازدهی را بهبود می‌بخشد.
gso-max-sizeuint3265536<bytes>حداکثر اندازهٔ سگمنت وقتی GSO فعال است.
inet6-address[]netip.Prefix[]<CIDR>آدرس‌های IPv6 برای اختصاص به دستگاه. IPv4 از فیلد inet4-address سطح بالا استفاده می‌کند (در حال حاضر در منبع کامنت شده — به config/config.go:283 مراجعه کنید).
iproute2-table-indexint2022<int>شاخص جدول iproute2 در Linux.
iproute2-rule-indexint9000<int>شاخص قاعدهٔ iproute2 در Linux.
auto-redirectboolfalsetrue | falseauto-redirect مبتنی بر NFTables در Linux (مسیر سریع‌تر برای TCP). به auto-route: true نیاز دارد — در غیر این صورت راه‌اندازی شکست می‌خورد.
auto-redirect-input-markuint320<uint32>fwmark روی بسته‌های متصل به TUN.
auto-redirect-output-markuint320<uint32>fwmark روی بسته‌های خروجی TUN.
auto-redirect-iproute2-fallback-rule-indexint0<int>شاخص قاعدهٔ جایگزین وقتی auto-redirect نمی‌تواند نصب شود.
loopback-address[]netip.Addr[]<IP>آدرس‌هایی که به‌عنوان loopback در نظر گرفته می‌شوند.
strict-routeboolfalsetrue | falseترافیکی را که در غیر این صورت TUN را دور می‌زند مسدود می‌کند (معنای kill-switch).
route-address[]netip.Prefix[]<CIDR>وقتی auto-route فعال است، فقط این CIDRها از طریق TUN مسیریابی می‌شوند.
route-address-set[]string[]<rule-provider name>گنجاندن از طریق rule-provider.
route-exclude-address[]netip.Prefix[]<CIDR>CIDRهایی که باید روی رابط پیش‌فرض باقی بمانند.
route-exclude-address-set[]string[]<rule-provider name>حذف از طریق rule-provider.
include-interface[]string[]<interface>فقط به این رابط‌ها متصل شو.
exclude-interface[]string[]<interface>این رابط‌ها را حذف کن.
include-uid[]uint32[]<uid>گنجاندن UID.
include-uid-range[]string[]<from:to>گنجاندن بازهٔ UID.
exclude-uid[]uint32[]<uid>حذف UID.
exclude-uid-range[]string[]<from:to>حذف بازهٔ UID.
exclude-src-port[]uint16[]<port>حذف پورت منبع.
exclude-src-port-range[]string[]<from:to>حذف بازهٔ پورت منبع.
exclude-dst-port[]uint16[]<port>حذف پورت مقصد.
exclude-dst-port-range[]string[]<from:to>حذف بازهٔ پورت مقصد.
include-android-user[]int[]<user id>گنجاندن کاربر چندگانهٔ Android.
include-package[]string[]<package name>گنجاندن بستهٔ Android.
exclude-package[]string[]<package name>حذف بستهٔ Android.
include-mac-address[]string[]<MAC>گنجاندن مبتنی بر MAC.
exclude-mac-address[]string[]<MAC>حذف مبتنی بر MAC.
endpoint-independent-natboolfalsetrue | falseفعال‌سازی endpoint-independent NAT برای UDP. توسط برخی بازی‌ها / برنامه‌های VoIP الزامی است.
udp-timeoutint64300<seconds>زمان انتظار بیکاری UDP بر حسب ثانیه.
icmp-timeoutint640 (10s built-in)<seconds>زمان انتظار بیکاری نشست‌های ICMP بازارسال‌شده، بر حسب ثانیه. 0 پیش‌فرض داخلی ۱۰ ثانیه‌ای را حفظ می‌کند.
disable-icmp-forwardingboolfalsetrue | falseبسته‌های ICMP را در لایهٔ TUN رها کن (مخصوص mihomo).
file-descriptorint0<fd>به‌جای ایجاد دستگاه TUN، از یک file descriptor از پیش بازشده استفاده کن. برای ادغام با سرویس VPN که سیستم‌عامل fd را به شما می‌دهد مفید است.
inet4-route-address[]netip.Prefix——
inet6-route-address[]netip.Prefix——
inet4-route-exclude-address[]netip.Prefix——
inet6-route-exclude-address[]netip.Prefix——
recvmsgxboolfalsetrue | falseفقط Darwin — از syscall recvmsg_x برای batching استفاده کن.
sendmsgxboolfalsetrue | falseفقط Darwin — از sendmsg_x استفاده کن.

منبع: config/config.go:273-330 · ثابت‌شده در v1.19.31 (ab405ba)

انتخاب پشته ​

مشابه sing-box، به‌علاوهٔ پشتهٔ mips خود mihomo:

  • system — TCP/IP کرنل. سریع‌ترین، نیازمند پشتیبانی TUN در کرنل.
  • gvisor — پشتهٔ فضای کاربری. کندتر، قابل حمل. پیش‌فرض.
  • mixed — پشتهٔ system برای TCP، gVisor برای UDP.
  • mips — پشتهٔ IP فضای کاربری خود mihomo (MIPS یعنی mihomo IP stack و ربطی به معماری CPU ندارد).

DNS hijack ​

dns-hijack روش اصطلاحی mihomo برای مسیریابی پرس‌وجوهای DNS از طریق حل‌کنندهٔ داخلی است:

yaml
tun:
  enable: true
  dns-hijack:
    - any:53          # All UDP/53 traffic
    - tcp://any:53    # And TCP/53
    - 8.8.8.8:53      # Specific server only

این در لایهٔ TUN پیاده می‌شود — بسته‌های DNS قبل از رسیدن به قواعد مسیریابی متوقف می‌شوند. سریع‌تر از اجرای یک ورودی UDP روی ۵۳ و مسیریابی برگشتی از طریق قواعد است.

مثال‌ها ​

پراکسی شفاف رومیزی:

yaml
tun:
  enable: true
  device: mihomo-tun
  stack: mixed
  mtu: 9000
  dns-hijack:
    - any:53
    - tcp://any:53
  auto-route: true
  auto-detect-interface: true
  strict-route: true
  route-address:
    - 0.0.0.0/1
    - 128.0.0.0/1
    - ::/1
    - 8000::/1
  route-exclude-address:
    - 192.168.0.0/16
    - 10.0.0.0/8

auto-redirect مبتنی بر NFTables در Linux:

yaml
tun:
  enable: true
  device: utun0
  stack: system
  dns-hijack: [any:53]
  auto-route: true
  auto-redirect: true
  auto-redirect-input-mark: 0x100
  auto-redirect-output-mark: 0x200

تقسیم برنامه‌های Android — فقط برنامه‌های خاصی را پراکسی کن:

yaml
tun:
  enable: true
  stack: system
  mtu: 9000
  dns-hijack: [any:53]
  auto-route: true
  include-package:
    - com.netflix.mediaclient
    - com.spotify.music
  exclude-package:
    - com.google.android.gms

نکات ​

  • inet4-address در منبع کامنت شده است (config/config.go:283) — mihomo در حال حاضر از یک بازهٔ IPv4 پیش‌فرض هاردکدشده (198.18.0.1/30) استفاده می‌کند. IPv6 همچنان از فیلد صریح inet6-address استفاده می‌کند.
  • dns-hijack چند فرم خاص را می‌پذیرد:
    • any:53 با هر دوی TCP و UDP پورت ۵۳ تطبیق دارد.
    • با tcp:// یا udp:// پیشوند کنید تا محدوده تعیین شود.
    • IP:port خام برای حل‌کننده‌های بالادست خاص.
  • auto-redirect بر پایهٔ auto-route کار می‌کند و جایگزین آن نیست: فعال‌کردن آن بدون auto-route: true هنگام راه‌اندازی شکست می‌خورد (listener/sing_tun/server.go:428-430). در کرنل‌هایی که از NFTables پشتیبانی می‌کنند، آن را افزون بر auto-route فعال کنید تا تغییر مسیر TCP سریع‌تر شود.
  • پرچم‌های recvmsgx / sendmsgx بهینه‌سازی‌های مخصوص macOS هستند که از گونه‌های batching در هر syscall استفاده می‌کنند. برای بازدهی، آن‌ها را در macOS فعال کنید.
  • disable-icmp-forwarding مخصوص mihomo است — وقتی مسیر ICMP جداگانه‌ای دارید (مثلاً یک pinger مبتنی بر جدول مسیریابی) و نمی‌خواهید TUN pingها را بگیرد مفید است.

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

  • Xray-core یک ورودی TUN حداقلی دارد. به TUN — Xray-core مراجعه کنید.
  • sing-box همان مجموعهٔ ویژگی را تحت type: "tun" فهرست‌شده در inbounds[] با نام‌های snake_case دارد. به TUN — sing-box مراجعه کنید.

منبع: config/config.go:273-330 · v1.19.31 (ab405ba)

Core Tutorial اثر Argsment