Skip to content

Tailscale — sing-box

sing-box می‌تواند به یک tailnet ‏Tailscale بپیوندد و آن را به‌عنوان یک نقطه‌انتهایی قابل‌مسیریابی در دسترس قرار دهد. این گره به‌طور پیش‌فرض روی پشتهٔ شبکهٔ gVisor در فضای کاربر اجرا می‌شود، بنابراین به دیمن سیستمی Tailscale نیازی نیست؛ برای استفاده از یک دستگاه TUN واقعی، system_interface را روی true بگذارید. برای استفاده از یک سرور هماهنگی جایگزین، control_url را به یک Headscale خودمیزبان اشاره دهید.

نقطه‌انتهایی، نه خروجی

در sing-box، ‏Tailscale به‌عنوان نقطه‌انتهایی پیکربندی می‌شود، نه خروجی. این بلوک زیر آرایهٔ ریشهٔ endpoints[] با type: "tailscale" قرار می‌گیرد و از قواعد مسیریابی مانند هر خروجی نام‌گذاری‌شده ارجاع داده می‌شود.

گزینه‌های نقطه‌انتهایی

type: "tailscale" زیر endpoints[]:

فیلدنوعپیش‌فرضمقادیر مجازتوضیحات
state_directorystringtailscale<directory path>پوشه‌ای که گره وضعیت و کلیدهای خود را در آن ماندگار می‌کند، نسبت به پوشهٔ کاری resolve می‌شود. استفادهٔ مجدد از آن در راه‌اندازی‌های مجدد، هویت tailnet را یکسان نگه می‌دارد.
auth_keystring(unset)<auth key>کلید احراز هویت Tailscale (یا Headscale) برای ورود بدون تعامل (headless). برای گره بدون نظارت الزامی است.
control_urlstringcontrolplane.tailscale.com<URL>نشانی سرور هماهنگی. آن را به یک Headscale خودمیزبان اشاره دهید تا از صفحهٔ کنترل جایگزین استفاده کنید.
ephemeralboolfalsetrue | falseثبت به‌عنوان گره موقت که سرور هماهنگی پس از آفلاین‌شدن آن را به‌طور خودکار حذف می‌کند.
hostnamestring(OS hostname)<string>نام گره برای ثبت روی tailnet. پیش‌فرض، نام میزبان سیستم‌عامل است.
accept_routesboolfalsetrue | falseپذیرش مسیرهای زیرشبکه که سایر گره‌های tailnet اعلام می‌کنند. اختیاری (نیازمند فعال‌سازی).
exit_nodestring(unset)<node name or IP>هدایت ترافیک از طریق این گره tailnet به‌عنوان گره خروجی.
exit_node_allow_lan_accessboolfalsetrue | falseاجازهٔ دسترسی مستقیم به LAN هنگام استفاده از گره خروجی.
advertise_routes[]netip.Prefix[][<CIDR>]مسیرهای زیرشبکه‌ای که به tailnet اعلام می‌شوند و این گره را به مسیریاب زیرشبکه تبدیل می‌کنند.
advertise_exit_nodeboolfalsetrue | falseاعلام این گره به‌عنوان گره خروجی که سایر اعضای tailnet می‌توانند از آن عبور کنند.
advertise_tagsbadoption.Listable[string](unset)[<tag>]برچسب‌های ACL که برای این گره اعلام می‌شوند (مثل tag:server) و سیاست‌های دسترسی tailnet از آن‌ها استفاده می‌کنند.
relay_server_port*uint16(unset)<port>اجرای سرور بازپخش همتای داخلی روی این پورت UDP برای کمک به سایر گره‌ها در عبور از NAT.
relay_server_static_endpoints[]netip.AddrPort(unset)[<ip:port>]نقاط‌انتهایی ip:port که برای سرور بازپخش به‌صورت ایستا اعلام می‌شوند، زمانی که نشانی عمومی آن به‌طور خودکار قابل کشف نیست.
system_interfaceboolfalsetrue | falseاستفاده از یک رابط TUN واقعی سیستم به‌جای پشتهٔ شبکهٔ gVisor در فضای کاربر. سریع‌تر، اما به امتیازات بالا نیاز دارد.
system_interface_namestring(auto)<string>نام رابط TUN سیستم هنگام فعال‌بودن system_interface.
system_interface_mtuuint32(auto)<bytes>‏MTU رابط TUN سیستم هنگام فعال‌بودن system_interface.
udp_timeoutUDPTimeoutCompat5m<duration>مهلت بیکاری برای نشست‌های UDP که توسط نقطه‌انتهایی مدیریت می‌شوند.

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

این ساختار همچنین DialerOptions را برای سوکت زیرین درون خود جای می‌دهد — bind_interface، routing_mark، detour و غیره.

مثال‌ها

کمینه نقطه‌انتهایی که با یک کلید احراز هویت headless به tailnet می‌پیوندد:

json
{
  "endpoints": [
    {
      "type": "tailscale",
      "tag": "ts-ep",
      "auth_key": "tskey-auth-xxxxxxxxxxxx"
    }
  ]
}

مسیریابی ترافیک منتخب از طریق یک گره خروجی tailnet:

json
{
  "endpoints": [
    {
      "type": "tailscale",
      "tag": "ts-ep",
      "auth_key": "tskey-auth-xxxxxxxxxxxx",
      "hostname": "sing-box-node",
      "exit_node": "us-exit-1",
      "exit_node_allow_lan_access": true,
      "accept_routes": true
    }
  ],
  "route": {
    "rules": [
      { "domain_suffix": [".example.com"], "outbound": "ts-ep" }
    ]
  }
}

در برابر یک سرور هماهنگی Headscale خودمیزبان، با یک پوشهٔ وضعیت اختصاصی:

json
{
  "endpoints": [
    {
      "type": "tailscale",
      "tag": "ts-headscale",
      "auth_key": "<headscale pre-auth key>",
      "control_url": "https://headscale.example.com",
      "state_directory": "tailscale-state"
    }
  ]
}

نکات

  • نقطه‌انتهایی Tailscale تنها در ساخت‌های دارای gVisor کامپایل می‌شود. در ساختی بدون gVisor، نوع tailscale ثبت نمی‌شود.
  • auth_key ورود بدون تعامل (headless) را فعال می‌کند — برای گره بدون نظارت الزامی است. بدون آن، گره نمی‌تواند خودش احراز هویت کند.
  • state_directory پیش‌فرض tailscale است و نسبت به پوشهٔ کاری resolve می‌شود. گره کلیدها و هویت ماشین خود را در آنجا ماندگار می‌کند، بنابراین استفادهٔ مجدد از همان پوشه هویت tailnet را در راه‌اندازی‌های مجدد یکسان نگه می‌دارد.
  • ephemeral: true گره‌ای را ثبت می‌کند که سرور هماهنگی پس از آفلاین‌شدن آن را به‌طور خودکار حذف می‌کند — مناسب برای نمونه‌های کوتاه‌عمر یا کانتینری.
  • accept_routes اختیاری است: مسیرهای زیرشبکهٔ اعلام‌شده توسط سایر گره‌ها نادیده گرفته می‌شوند مگر آنکه فعالش کنید. برعکس، advertise_routes / advertise_exit_node این گره را به مسیریاب زیرشبکه / گره خروجی برای بقیهٔ tailnet تبدیل می‌کنند.
  • system_interface: false (پیش‌فرض) کاملاً از طریق gVisor در فضای کاربر اجرا می‌شود — بدون امتیاز اما کندتر. system_interface: true یک دستگاه TUN واقعی را برای توان عبور بالاتر به قیمت امتیازات بالا متصل می‌کند.
  • ‏MagicDNS ‏Tailscale را می‌توان با افزودن یک سرور DNS از نوع tailscale به بلوک dns مصرف کرد، که نام‌های *.ts.net را از طریق این گره resolve می‌کند.

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

  • mihomo ‏Tailscale را به‌عنوان یک خروجی (proxies[] با type: tailscale) با نام‌فیلدهای خط‌فاصله‌دار به‌جای نقطه‌انتهایی در دسترس قرار می‌دهد. به Tailscale — mihomo مراجعه کنید.
  • Xray-core پشتیبانی Tailscale ندارد.

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

Core Tutorial اثر Argsment