مدتها تیلاسکیل را فقط ابزاری برای ساخت شبکه خصوصی میدانستم؛ نه بیشتر. همین تصور باعث شد دستوری را نادیده بگیرم که میتواند بسیاری از برنامههای وب محلی را، بدون ارسال پورت، DNS پویا، پراکسی معکوس یا نیاز به حساب تیلاسکیل در سمت مقابل، به یک نقطه پایانی HTTPS عمومی تبدیل کند.
نام این دستور Funnel است و وقتی از آن استفاده کنید، روش قدیمیِ در معرض اینترنت قرار دادن سرویسها فوراً بیدلیل پیچیده به نظر میرسد.
لینکی برای کسی فرستادم که هرگز با تیلاسکیل کار نکرده بود؛ بیدرنگ کار کرد
Funnel شبکهام را گسترش نداد؛ به یک برنامه مسیر خروجی داد

هفته گذشته متوجه شدم که شاید تمام این مدت، تیلاسکیل را بیش از حد پیچیده کرده بودم. لینکی از یک برنامه وب محلی که روی لپتاپم اجرا میشد برای یکی از مشتریان فرستادم و وقتی آن را روی گوشیاش باز کرد، برنامه دقیقاً مانند هر وبسایت دیگری بارگذاری شد. نه به دعوتنامه نیاز داشت، نه دانلود برنامه و نه توضیح اضافی. تا پیش از آن، تیلاسکیل را «شبکه خصوصیای که فقط دستگاههای من میتوانند ببینند» میدانستم؛ اما این لینک از آن محدوده فراتر رفت و بینقص کار کرد.
وقتی تیلاسکیل را نصب میکنید و دستگاههایتان — لپتاپ، NAS و گوشی — را در یک شبکه مش خصوصی به هم متصل میکنید، طبیعی است تصور کنید کل محصول همین است. اما آشنایی با Funnel چشمم را باز کرد؛ تیلاسکیل دستوری دارد که عمداً از مرز این مش خصوصی فراتر میرود. Tailscale Serve برنامه را درون tailnet نگه میدارد و معمولاً نخستین قابلیتی است که کاربران کشف میکنند. هرچند برای اشتراکگذاری سرویسها میان دستگاههایتان عالی است، تنها برای کسانی کار میکند که از پیش به tailnet شما دسترسی دارند.
Funnel، در مقابل، با اجرا روی یک پورت، به آن برنامه یک نشانی HTTPS عمومی واقعی میدهد. هیچ چیز دیگری در tailnet تغییر نمیکند و سایر دستگاهها همچنان به همان اندازه پیشین نامرئی میمانند. در عمل، بدون گسترش یا در معرض دید قرار دادن باقی tailnet، یک برنامه به نشانی HTTPS عمومی دست پیدا میکند.
کار واقعیای که Funnel مرا از آن نجات داد، ارسال پورت نبود
بار اشتراکگذاری بهطور چشمگیری سبکتر شد

Immich مدیریت نسخهپشتیبان عکسهایم را بر عهده دارد و روی یکی از دستگاههای قدیمیام اجرا میشود. پیش از Funnel، اجازه دادن به فردی بیرون از خانه برای دیدن آن فرایندی پیچیده بود. باید پورتی را روی روتر ارسال میکردم و با اتصال ISP خود که پشت CGNAT قرار داشت سر و کله میزدم؛ وضعیتی که اجازه ارسال پورت نمیدهد. از آنجا که این نشانی تغییر میکند، باید DNS پویا را نیز پیکربندی میکردم، گواهی میگرفتم و تمدید آن را به یاد میسپردم. هرکدام کار کوچکی است، اما مجموعهای از مراحل هستند که باید پیوسته نگهداری شوند.
با Funnel، این مراحل همچنان انجام میشوند، اما جایی انجام میگیرند که دیگر لازم نیست به آنها رسیدگی کنم. من ارسال پورت سنتی انجام نمیدهم؛ تیلاسکیل اتصال HTTPS را پیش از هدایت ترافیک به سرویس محلیام پایاندهی میکند.
| پیش از Funnel | پس از Funnel |
|---|---|
| ارسال پورت روی روتر | اجرای یک دستور |
| راهاندازی DNS پویا | نیازی نیست |
| دریافت و تمدید گواهی | خودکار انجام میشود |
| پیکربندی پراکسی معکوس | معمولاً بهکلی حذف میشود |
| نگرانی درباره IP عمومی | هرگز آن را نمیبینید |
با حذف این اصطکاک، توانستم سراغ کارهایی بروم که پیشتر امتحانشان نکرده بودم: هدایت وبهوکها به لپتاپم همراه با نوشتن کدی برای پردازش آنها، و دسترسی از راه دور به داشبورد Home Assistant بدون کلاینت VPN. اینها همان پروژههای کوچکی بودند که پیشتر به localhost محدود میماندند، چون هزینه راهاندازیشان از ارزش خود کار بیشتر بود.
دستور پنج ثانیه طول کشید؛ مسئولیت از میان نرفت
وقتی تیلاسکیل دیگر نقش نگهبان درگاه را ندارد، برنامهتان باید آن را بر عهده بگیرد





بخشی از این پیکربندی جدید بود که عادت کردن به آن برایم زمان برد. درون tailnet، Tailscale قوانین دسترسی خودش را دارد و تعیین میکند چه کسی میتواند وارد شود. اما وقتی Funnel را فعال میکنید، این قوانین دیگر برای هر کسی که به URL عمومی دسترسی دارد اعمال نمیشوند. چون بازدیدکنندگان عمومی بهعنوان اعضای tailnet شما احراز هویت نمیشوند، مسئولیت احراز هویت کاربر بر عهده برنامه شماست، نه Tailscale.
ابزار داخلی کوچکم برای پیگیری فاکتورهای فریلنسری هرگز با Funnel منتشر نمیشود، زیرا هیچ سازوکار احراز هویتی ندارد؛ این صفحه به هر کسی که در شبکهام باشد اعتماد میکند. اگر آن را در وضعیت فعلی با Funnel منتشر کنم، هر کسی که URL را پیدا کند به آن دسترسی خواهد داشت. قانون من ساده است: فقط چیزهایی با Funnel منتشر میشوند که پشت آنها سامانه ورود واقعی وجود داشته باشد.
همچنین باید توجه داشت که Funnel تا زمانی که آن را خاموش نکنید فعال میماند؛ این یک لینک یکبارمصرف نیست. عادت کردهام فرمان tailscale funnel status را اجرا کنم، زیرا فراموش کردن اینکه یک پورت حتی هنگام استفاده نشدن هم در دسترس باقی میماند، آسان است.
فاصله میان localhost و این فکر که «شاید این را مستقر کنم»
واقعیت کار من این است که چند پروژه کماهمیت میسازم؛ نرمافزارها، ابزارها یا وبسایتهایی که به VPS نیاز ندارند، چون قرار نیست کاربر واقعی داشته باشند. به تضمین آپتایم نیاز ندارند و اغلب راهاندازی میزبانی برایشان بیشتر از ساختن خودشان زمان میبرد. با این حال، رها کردنشان روی localhost هم مناسب نیست، زیرا بالاخره کسی بیرون از شبکه خانگیام باید آنها را ببیند.
Funnel این فاصله را پر میکند. تفاوت میان نشان دادن نسخه امروز به مشتری و توضیح بیپایان آن در دیسکورد یا اسلک است. میتوانم هنگام سفر داشبوردی را به اشتراک بگذارم و حدسزدن را با آزمودن یک وبهوک در برابر ترافیک واقعی جایگزین کنم. این کارهای ساده به زیرساختی جداگانه نیاز ندارند.
من محصولات واقعی را پشت Funnel قرار نمیدهم، اما دیگر برای پروژههای موقت پورت روتر باز نخواهم کرد.
منبع: این مطلب ترجمه و بومیسازی مقالهای از MakeUseOf به قلم Afam Onyimadu است. مشاهده مقاله اصلی