تصور کنید میخواهید یک محیط توسعه محلی یا یک پایگاهداده خصوصی را برای چند ساعت در اختیار همکارتان قرار دهید، اما نمیخواهید او را به کل شبکه داخلی خود دعوت کنید یا پورتهای فایروال را باز کنید. Tailcat دقیقاً برای حل همین سناریو طراحی شده است تا اتصال امن را به یک عملیات لحظهای تبدیل کند.
به نقل از مستندات رسمی این پروژه، Tailscale در ۲۶ اوت ۲۰۲۶ ابزار Tailcat را به صورت متنباز منتشر کرد. این ابزار در واقع نسخهای «بازسازیشده» از اجزای متنباز است که مانند یک نسخه مدرن و رمزنگاریشده از netcat عمل میکند. Tailcat به دو ماشین اجازه میدهد بدون تغییر در جداول مسیریابی سیستم یا نیاز به مجوزهای مدیر (Administrative Privileges)، یکدیگر را پیدا کرده و ترافیک خود را ایمن کنند. Tailscale این ابزار را به عنوان «Tailscale بدون Tailscale، توسط Tailscale» توصیف میکند. این ابزار راهی فراهم میکند تا از لایه داده (Data Plane) با کارایی بالای شرکت استفاده شود، بدون اینکه سربار لایه کنترل (Control Plane) وجود داشته باشد. در واقع، یک توکن اتصال واحد میتواند جایگزین نیاز به هماهنگی مرکزی و داشتن یک حساب VPN کامل شود.
برای سالها، صنعت شبکه یا به پیکربندیهای دستی و پیچیده WireGuard متکی بود و یا به شبکههای مش (Mesh) متمرکز که نیازمند یک ارائهدهنده هویت دائمی بودند. Tailcat به عنوان یک جایگزین مدرن وارد میشود تا ارتباطات را ساده کند.
همانطور که در تحلیلهای پیشین ما دربارهی امنیت مدلهای بازمتن و زیرساختهای توزیعشده اشاره کردیم، حذف وابستگی به یک مرکز کنترل واحد، گامی به سوی انعطافپذیری بیشتر در شبکههای خصوصی است. در Tailcat، لایه داده (Data Plane) — یعنی همان مسیری که بیتهای اطلاعات در آن جابهجا میشوند — از لایه کنترل (Control Plane) که مدیریت هویتها را بر عهده دارد، جدا شده است.
سازوکار فنی و هسته مرکزی
این ابزار به عنوان یک کتابخانه در فضای کاربر (Userspace) و یک ابزار خط فرمان (CLI) عمل میکند. کد مربوط به CLI در مسیر cmd/tailcat قرار دارد و بر پایه کتابخانه Go ساخته شده است که میتوان آن را از مسیر github.com/tailscale/tailcat وارد کرد. طبق اعلام توسعهدهندگان، Tailcat از magicsock (لایه انتقال داخلی Tailscale) برای ایجاد تونلهای رمزنگاریشده استفاده میکند.
برای عبور از NATها یا در مواردی که اتصال مستقیم ممکن نیست، از پروتکل DERP (Designated Encrypted Relay for Packets) به عنوان یک کانال ارتباطی جانبی یا رلهای برای آخرین تلاش (Relay of last resort) استفاده میشود. برخلاف تجربه استاندارد Tailscale، در اینجا هیچ سرور مرکزی برای مدیریت لیست گرههای شما وجود ندارد. در عوض، متادیتای اتصال به صورت «خارج از باند» (Out-of-band) و به هر روشی که کاربر ترجیح دهد (مثلاً پیامک یا ایمیل) مبادله میشود.
در این سیستم، یک طرف به عنوان سرور (شنونده) عمل کرده و یک توکن اتصال کوتاه دریافت میکند. طرف دیگر این توکن را به کلاینت میدهد تا اتصال برقرار شود. تمام ترافیک بین دو نقطه با استفاده از WireGuard به صورت سرتاسری رمزنگاری میشود.
جزئیات فنی و قابلیتها
- اتصال بدون پیکربندی (Zero-Config): کاربران به حساب کاربری Tailscale یا دسترسی root/admin نیاز ندارند، زیرا ابزار با پشته شبکه سیستمعامل تداخلی ندارد. این ابزار جداول مسیریابی یا DNS را تغییر نمیدهد.
- رمزنگاری سرتاسری: تمام دادهها توسط WireGuard رمزنگاری میشوند. آدرس سرور (که همان توکن اتصال است) مستقیماً از کلید عمومی WireGuard آن استخراج میشود.
- عبور از NAT: اتصال ابتدا از طریق رلههای DERP آغاز (Bootstrap) میشود. سپس magicsock از طریق کشف نقاط انتهایی مبتنی بر STUN و تکنیک UDP hole-punching تلاش میکند تا اتصال را به یک ارتباط مستقیم Peer-to-Peer ارتقا دهد.
- شبکهسازی در فضای کاربر: با استفاده از Netstack متعلق به gVisor، اتصالات TCP در داخل خودِ پروسه خاتمه مییابند و نه در هسته (Kernel) سیستمعامل. این قابلیت اجازه میدهد ابزار بدون پیکربندی شبکه در سطح OS، اتصالات ورودی را بپذیرد و اتصالات خروجی ایجاد کند.
- توکنهای اتصال (ConnBlobs): این توکنها در لایه داخلی
ConnBlobنامیده میشوند. آنها با پیشوند "tc" شروع شده و سپس شامل دادههای CBOR کدگذاری شده با base64 هستند. این توکنها حاوی کلید عمومی ۳۲ بایتی Curve25519 مربوط به WireGuard و اطلاعات DERP (یا یک عدد صحیح کوچک برای اشاره به منطقه پیشفرض یا متادیتای کامل سرور DERP) میباشند.
کالبدشکافی پشته شبکه
معماری Tailcat اجزای شبکهسازی کلاینت Tailscale را بازاستفاده میکند اما لایه کنترل را حذف میکند. این معماری بر چهار ستون اصلی استوار است:
۱. WireGuard: یک پیادهسازی در فضای کاربر که برای تمام رمزنگاریهای تونل استفاده میشود. چون از دستگاههای TUN/TAP هسته اجتناب میکند، به مجوزهای root نیاز ندارد.
۲. magicsock: لایه انتقالی که ترافیک را بین UDP مستقیم و رلههای DERP مالتیپلکس میکند و کارهای دشوار کشف STUN را مدیریت میکند.
۳. Netstack (gVisor): یک پشته TCP/IP در فضای کاربر. این حیاتیترین جزء است که اجازه میدهد Tailcat اتصالات TCP را کاملاً درون پروسه مدیریت کند.
۴. DERP relay: یک پروتکل رله رمزنگاریشده که به عنوان کانال ملاقات (Rendezvous) و مسیر جایگزین داده در صورت عدم امکان اتصال مستقیم عمل میکند.
جریان برقراری اتصال
بر اساس بررسی مستندات فنی، فرآیند اتصال به این ترتیب رخ میدهد:
۱. مقداردهی اولیه سرور: سرور یک جفت کلید WireGuard تولید یا بارگذاری میکند، به یک رله DERP متصل میشود و توکن اتصال خود را در stderr چاپ میکند. برای مثال، سرور ممکن است گزارش دهد: Selected bootstrap relay region 302, San Francisco و سپس توکنی مانند tcomFwWCCcjS5nKNqAod034nWoJZW0LZqDhhC8U_dKdnDRYQ8uNGFpGQEu را نمایش دهد.
۲. تحلیل کلاینت: کلاینت توکن را تحلیل میکند تا کلید عمومی سرور و منطقه DERP را شناسایی کند.
۳. دستتکانی کشف (Discovery Handshake): کلاینت یک جفت کلید موقت تولید کرده و یک پیام پینگ "Meow" را از طریق رله DERP به سرور ارسال میکند. این پیام شامل کلید عمومی گره کلاینت است.
۴. تاییدیه: سرور کلاینت را به لیست همتایان WireGuard و نقشه شبکه خود اضافه میکند، موتور WireGuard را بازپیکربندی کرده و با یک تاییدیه "Meowed" پاسخ میدهد.
۵. ایجاد تونل: دستتکانی استاندارد WireGuard آغاز میشود که در ابتدا از طریق DERP مسیریابی میگردد.
۶. ارتقای مسیر: هر دو طرف نقاط انتهایی UDP (آدرس IP عمومی و پورت از طریق STUN و آدرسهای رابط محلی) را با استفاده از پیامهای "disco call-me-maybe" اعلام میکنند. اگر hole-punching موفق باشد، ترافیک به مسیر مستقیم P2P ارتقا مییابد.
کاربردهای عملی برای توسعهدهندگان
Tailcat حالتهای کاربردی متنوعی را برای توسعهدهندگان و مدیران سیستم ارائه میدهد. شما میتوانید ورودی و خروجی استاندارد (stdin/stdout) را بین دو ماشین لوله (Pipe) کنید. برای مثال، سرور اجرا شده و یک آدرس موقت چاپ میکند. سپس کلاینت میتواند دستور echo hello | tailcat <token> را اجرا کند تا داده را ارسال کند. سرور سپس باز شده و عبارت "hello" دریافت شده را چاپ میکند.
همچنین میتواند پورتهای TCP محلی را اکسپوز کند. اجرای tailcat --serve=8080,8443 (یا --serve=all) این پورتها را به localhost فوروارد میکند. کلاینت سپس میتواند مستقیماً با پورت تعامل کند: tailcat <token> 8080. این امر اجازه میدهد درخواستهای HTTP خام، مانند GET / HTTP/1.1 از طریق تونل منتقل شوند.
در لینوکس و مک، این ابزار از سرور SSH بدون نیاز به احراز هویت از طریق tailcat --serve=no-auth-ssh پشتیبانی میکند که از طریق tailcat ssh <token> قابل دسترسی است. برای کسانی که به امنیت بیشتری نیاز دارند، ابزار میتواند به یک سرور SSH سیستمی پروکسی شود با استفاده از tailcat --serve=22؛ در این حالت، WireGuard کلاینت را تایید میکند پیش از آنکه حتی بسته SSH دیده شود.
مدیریت هویت و مسیریابی پیشرفته
هویت در Tailcat به کلیدهای WireGuard گره خورده است. این ابزار دو حالت اصلی مدیریت کلید را ارائه میدهد:
- کلیدهای موقت (Ephemeral Keys): رفتار پیشفرض است. هر بار اجرا یک کلید تازه در حافظه تولید میکند. وقتی پروسه بسته شود، آدرس برای همیشه از بین میرود. این امنترین حالت برای اشتراکگذاریهای یکباره است.
- کلیدهای ذخیره شده (Saved Keys): کاربران میتوانند
tailcat genkeyرا اجرا کنند تا یک کلید روی دیسک ذخیره شود (مثلاً در~/.config/tailcat/keys/default.private.json). این کار تضمین میکند آدرس در بازنشانیهای سیستم ثابت بماند. نام کلید جادوییdefaultبه طور خودکار استفاده میشود مگر اینکه--key=newمشخص شده باشد. کاربران میتوانند این کلیدها را باtailcat genkey --listمدیریت یا باtailcat genkey --delete --key=defaultحذف کنند.
برای استقرارهای دائمی، توکنها را میتوان به عنوان رکوردهای DNS TXT منتشر کرد. برای مثال، اگر example.com دارای رکورد TXT با مقدار tailcat=tc... باشد، کلاینت میتواند به سادگی دستور tailcat ssh example.com یا tailcat ping example.com را اجرا کند.
برای تضمین پایداری رکوردهای DNS، از فلگ --fixed-region در هنگام تولید کلید استفاده میشود. این کار شناسه نزدیکترین منطقه DERP را در توکن و فایل کلید میگنجاند و از تغییر توکن در صورت ریاستارت سرور و جستجوی مجدد برای منطقه متفاوت جلوگیری میکند. این با --region=auto که برای استفادههای یکباره است، تفاوت دارد. کاربران همچنین میتوانند یک منطقه صریح را با --region=<name> پین کنند یا گزینهها را با --region=list مشاهده کنند.
مثال: SSH محافظت شده روی DNS
برای راهاندازی یک سرور SSH امن بدون باز کردن پورتهای ورودی:
۱. سمت کلاینت: یک جفت کلید هویت کلاینت با tailcat genkey --client تولید کنید. این کار فایلی را در ~/.config/tailcat/keys/client-default.private.json ذخیره کرده و یک کلید عمومی (مثلاً nodekey:cfb6bf...) چاپ میکند.
۲. سمت سرور: یک جفت کلید سرور پین شده به نزدیکترین منطقه با tailcat genkey --fixed-region تولید کنید. سپس سرور را طوری اجرا کنید که فقط آن کلاینت خاص را بپذیرد: tailcat --serve=22 --allow=nodekey:cfb6bf....
۳. DNS: توکن حاصل را به عنوان یک رکورد TXT منتشر کنید: my-server.example.com. 300 IN TXT "tailcat=tcXXXXXXXXX".
۴. دسترسی: کلاینت به سادگی دستور tailcat ssh my-server.example.com را اجرا میکند. کلید client-default به طور خودکار استفاده شده و هرگونه دستتکانی غیرمجاز به طور بیصدا نادیده گرفته میشود.
ابزارهای کمکی و یکپارچگی
این ابزار دستورات تشخیصی مفیدی برای مدیریت و عیبیابی شبکه دارد:
- تست اتصال: دستور
tailcat ping <token>گزارش میدهد که آیا پاسخ (pong) از طریق رله DERP رسیده یا مسیر مستقیم. فلگ--until-directپینگ را ادامه میدهد (با تایماوت پیشفرض ۱۰ ثانیه) تا زمانی که یک مسیر مستقیم برقرار شود. - پروکسی SOCKS5: دستور
tailcat socks <token>دستورات را از طریق یک پروکسی SOCKS5 مسیریابی میکند. توکنها میتوانند به عنوان Hostname در URL استفاده شوند (مثلاًcurl http://<token>:8081/)، هرچند به دلیل تبدیل حروف بزرگ به کوچک در Hostnameها، این مورد توسط مرورگرها پشتیبانی نمیشود. - دستکاری توکن: دستور
tailcat parse <token>کلید عمومی سرور و منطقه را به صورت JSON چاپ میکند. دستورtailcat resolve <token>یک توکن کوتاه را به یک توکن بلند و خودکفا تبدیل میکند که اطلاعات کامل سرور DERP (شامل HostName، IPv4 و IPv6) را در خود دارد تا کلاینتها سریعتر و بدون دریافت نقشه DERP متصل شوند. سرور همچنین میتواند این فرم بلند را مستقیماً با فلگ--full-addressچاپ کند. - دسترسی به شبکه: فلگ
--serve=exit-nodeبه کلاینت اجازه میدهد به کل شبکه محلی سرور دسترسی پیدا کند.
یکپارچگی با کتابخانه Go
برای توسعهدهندگان، کتابخانه Go اجازه پیادهسازیهای مینیمال را میدهد. یک سرور را میتوان با تعریف tailcat.Server به همراه یک هندلر OnTCP ایجاد کرد. مقدار پیشفرض (zero value) سرور به طور خودکار یک کلید موقت تازه، نزدیکترین منطقه از نقشه پیشفرض DERP را انتخاب کرده و از log.Printf برای لاگها استفاده میکند (که با تنظیم Logf روی logger.Discard قابل خاموش کردن است).
یک کلاینت را میتوان با استفاده از tailcat.NewClient(tailcat.ConnBlob(token)) مقداردهی اولیه کرد. تونل به صورت تنبل (lazy) و در اولین فراخوانی DialTCPPort برقرار میشود.
موازنه زیرساختی و تاریخچه
Tailscale به طور پیشفرض رلههای DERP رایگان با محدودیت نرخ ارائه میدهد (نقشه در https://tailcat.dev/derpmap.json موجود است). با این حال، چون ابزار کاملاً متنباز است، کاربران میتوانند رلههای DERP شخصی خود را برای اجتناب از محدودیتها یا وابستگی به زیرساخت Tailscale میزبانی کنند.
باید توجه داشت که Tailcat هیچ وعدهای برای پایداری API یا CLI نمیدهد. APIهای Go، فلگهای CLI و فرمت دادهها ممکن است تغییر کنند. رلههای DERP عمومی هیچ SLA برای زمان فعال بودن یا اهداف پهنای باند ندارند و بر اساس «بهترین تلاش» (best-effort) ارائه میشوند. برای کسانی که به رلههای اختصاصی یا پشتیبانی نیاز دارند، Tailscale پیشنهاد میکند با تیم فروش آنها تماس بگیرند.
جالب است بدانید که این پروژه در سپتامبر ۲۰۲۳ با نام "derpcat" توسط یکی از مهندسان Tailscale در یک پرواز طولانی از پورتلند (PDX) به شیکاگو (ORD) در مسیر ایرلند آغاز شد تا او مجبور به خرید وایفای هواپیما نشود! اولین طرح اولیه در کامیت 9e4d925cc ("cmd/dc: start of derpcat tool") بود و اولین بار در کامیت 911915fbb ("derpcat: it's alive!") عملیاتی شد.
در ابتدا، این پروژه در یک فورک از مخزن tailscale.com زندگی میکرد و با تکامل داخلیهای سیستم دچار فرسودگی کد (bitrot) شد. در نهایت به یک ماژول منظم Go بازنویسی شد و در اوت ۲۰۲۶ در کنفرانس TailscaleUp به طور رسمی متنباز شد.
این چرخش راهبردی به سمت «اتصال غیرمتمرکز»، لایه داده را از لایه کنترل جدا میکند و به کاربران ابزاری برای شبکهسازی امن و لحظهای میدهد که نیازی به هویت سازمانی یا حسابهای پیچیده ندارد. برای کاربر نهایی، این به معنای توانایی اکسپوز کردن امن یک محیط توسعه محلی یا یک پایگاهداده خصوصی برای یک همکار در عرض چند ثانیه است، بدون اصطکاک دعوت به یک شبکه خصوصی یا باز کردن پورتهای فایروال.
گام بعدی شما
- اگر نیاز به اشتراکگذاری سریع یک پورت محلی با همکار دارید، Tailcat را نصب کرده و از توکنهای موقت استفاده کنید.
- برای دسترسیهای دائمی و امن به سرورهای بدون IP عمومی، توکن Tailcat را در رکوردهای TXT دامنه خود قرار دهید.
- اگر در محیطهای سازمانی با محدودیتهای شدید NAT هستید، رلههای DERP شخصی خود را برای پایداری بیشتر راهاندازی کنید.
اما داستان سختافزاری این تحول و نحوه بهینهسازی بستههای UDP در لایههای پایینتر حتی شگفتانگیزتر است — به تحلیل ما دربارهی تراشههای شبکه نسل جدید مراجعه کنید.




گفتگو