Tailscale serve یا funnel: کون سا استعمال کریں؟
Tailscale serve صرف tailnet پر HTTPS URL بناتا ہے، جبکہ funnel وہی port public internet پر کھولتا ہے۔ جانیں کون سا منتخب کریں اور کون سی policy اسے روک سکتی ہے۔
tailscale serve بمقابلہ funnel: URL تک کون رسائی حاصل کر سکتا ہے
tailscale serve اور tailscale funnel کے درمیان فرق صرف audience کا ہے۔ serve مقامی port پر HTTPS (hypertext transfer protocol secure) front end لگاتا ہے اور اسے صرف آپ کے tailnet پر publish کرتا ہے۔ funnel اسی مقامی port کو Tailscale کے چلائے گئے relay servers کے ذریعے پورے public internet پر publish کرتا ہے۔ دونوں commands میں وہی flags اور وہی targets استعمال ہوتے ہیں۔ ایک لفظ private dashboard اور پوری دنیا سے قابل رسائی dashboard کے درمیان فرق پیدا کرتا ہے۔
دونوں آپ کو ایسے نام پر certificate فراہم کرتے ہیں جس کے آخر میں ts.net آتا ہے، اور دونوں کے لیے آپ کے VPS firewall پر inbound port کھولنے کی ضرورت نہیں ہوتی۔ آپ کا tailscaled daemon پہلے ہی tailnet سے باہر کی طرف connection برقرار رکھتا ہے، اس لیے traffic اسی connection کے ذریعے پہنچتا ہے۔ کسی server کو tailnet پر شامل کرنا ایک الگ کام ہے، اور VPS کو Tailscale exit node کے طور پر چلانا یا private network کے لیے subnet router advertise کرنا اسی کام کا احاطہ کرتا ہے۔ جو service پہلے ہی tailnet پر موجود ہو اسے publish کرنا اس حصے کا موضوع ہے۔
دونوں میں سے کوئی بھی command چلانے سے پہلے درکار چیزیں
- VPS پر Tailscale 1.38.3 یا اس کے بعد کا ورژن نصب ہو اور آپ اپنے tailnet میں logged in ہوں۔
tailscale versionاورtailscale statusسے تصدیق کریں۔ - MagicDNS enabled ہو۔ MagicDNS، Tailscale کا built-in DNS (domain name system) ہے۔ یہی مشین کو صرف
100.xaddress کے بجائےblog-vps.your-tailnet.ts.netجیسا نام دیتا ہے۔ - Admin console کے DNS page پر tailnet کے لیے HTTPS certificates enabled ہوں۔ اس کے بغیر آپ کے port کے سامنے رکھنے کے لیے کوئی certificate موجود نہیں ہوگا۔
- صرف
funnelکے لیے tailnet policy file میںfunnelnode attribute موجود ہو۔ زیادہ تر پہلی کوششیں اسی مرحلے پر رک جاتی ہیں۔ اس کی وضاحت نیچے دی گئی ہے۔
یہاں ہر command sudo سے شروع ہوتی ہے، کیونکہ CLI ایک ایسے socket کے ذریعے tailscaled سے رابطہ کرتا ہے جس پر صرف root لکھ سکتا ہے۔ ایک user کو اس پابندی سے بچنے کا اختیار دینے کے لیے یہ command چلائیں:
sudo tailscale set --operator=$USERاپنے tailnet پر tailscale serve کے ذریعے شائع کریں
serve کو مقامی port کی طرف point کریں، باقی کام یہ خود کر دے گا۔
sudo tailscale serve 3000Available within your tailnet:
https://amelie-workstation.pango-lin.ts.net
|-- / proxy http://127.0.0.1:3000
Press Ctrl+C to exit.صرف 3000 دراصل http://127.0.0.1:3000 کا مختصر طریقہ ہے۔ Tailscale مشین کے tailnet address کے port 443 پر listening کرتا ہے، ts.net certificate کے ذریعے TLS (transport layer security) terminate کرتا ہے، اور سادہ HTTP کو آپ کے مقامی port پر forward کرتا ہے۔ آپ کی application کو certificate کے موجود ہونے کا علم بھی نہیں ہونا چاہیے۔ یہی وجہ ہے کہ ایسے admin panel کے سامنے اسے استعمال کرنا مفید ہے، جسے بصورت دیگر plain HTTP پر چلانا پڑتا۔
اب آخری سطر دیکھیں: Press Ctrl+C to exit. یہ command foreground میں چلتی ہے، اور mapping اسی process کے اندر رہتی ہے۔ terminal بند کریں تو URL کام کرنا بند کر دیتا ہے، کیونکہ disk پر کچھ بھی نہیں لکھا گیا۔ --bg شامل کرنے سے mapping node کی serve config میں محفوظ ہو جاتی ہے، جو terminal بند ہونے اور reboot دونوں کے بعد برقرار رہتی ہے۔
sudo tailscale serve --bg 3000Serve صرف port number تک محدود نہیں۔ --set-path کسی service کو subpath کے تحت mount کرتا ہے، اس لیے کئی apps ایک ہی hostname share کر سکتی ہیں:
sudo tailscale serve --bg --set-path=/grafana 3000
sudo tailscale serve --bg --set-path=/metrics 9090target static files کی directory بھی ہو سکتا ہے، یا ایسا backend بھی جو پہلے ہی TLS استعمال کرتا ہو اور جس کا certificate آپ verify نہیں کرانا چاہتے:
sudo tailscale serve --bg /srv/reports
sudo tailscale serve --bg https+insecure://localhost:8443یہ صرف HTTP تک محدود نہیں۔ --tcp=<port> ایک raw TCP (transmission control protocol) stream کو forward کرتا ہے، جبکہ --tls-terminated-tcp=<port> آپ کے node پر TLS terminate کرکے plaintext آگے بھیجتا ہے۔ اس طرح ایسی service کے سامنے trusted certificate رکھا جا سکتا ہے جو HTTP بالکل نہیں بولتی:
sudo tailscale serve --bg --tls-terminated-tcp=443 tcp://127.0.0.1:9899فنل کیوں بتاتا ہے کہ node attribute سیٹ نہیں ہے؟
Funnel پورے tailnet کے لیے بطور ڈیفالٹ بند ہوتا ہے۔ پہلی بار چلانے پر یہ پیغام دکھا کر رک جاتا ہے:
Funnel not available; "funnel" node attribute not set. See https://tailscale.com/kb/1223/tailscale-funnel/.کمانڈ درست تھی۔ tailnet policy نے اس node کو publish کرنے کی اجازت نہیں دی، اس لیے client کسی relay سے رابطہ کرنے سے پہلے ہی انکار کر دیتا ہے۔ Admin console میں Access Controls کے تحت tailnet policy file میں ترمیم کریں اور یہ attribute شامل کریں:
"nodeAttrs": [
{
"target": ["autogroup:member"],
"attr": ["funnel"],
},
],autogroup:member اسے tailnet کے ہر member کے لیے فعال کرتا ہے۔ اگر صرف ایک machine کو publish کرنے کی اجازت ہونی چاہیے تو اس machine کو tag دیں اور اس کے بجائے اسی tag کو ہدف بنائیں، مثلاً tag:public۔ Policy محفوظ کریں، پھر Funnel command دوبارہ چلائیں۔
اگر آپ کا account tailnet admin ہے تو حالیہ clients ایک آسان طریقہ فراہم کرتے ہیں: CLI login.tailscale.com پر consent URL دکھاتا ہے۔ اس URL کو کھولنے سے HTTPS certificates فعال ہو جاتے ہیں اور attribute بھی شامل ہو جاتا ہے۔ اگر آپ admin نہیں ہیں تو یہ URL آپ کے لیے مفید نہیں ہوگا۔ جس شخص کو policy تک رسائی حاصل ہے، اسے یہ ترمیم کرنی ہوگی۔
انٹرنیٹ پر tailscale funnel کے ذریعے شائع کریں
attribute مقرر کرنے کے بعد command وہی ہے جسے آپ پہلے سے جانتے ہیں، صرف verb مختلف ہے۔
sudo tailscale funnel --bg 3000Available on the internet:
https://amelie-workstation.pango-lin.ts.net
|-- / proxy http://127.0.0.1:3000
Press Ctrl+C to exit.ہر بار وہ پہلی سطر ضرور پڑھیں۔ Available within your tailnet اور Available on the internet ہی private service اور public service کے درمیان واحد نمایاں فرق ہیں، اور انہیں بنانے والی commands میں صرف ایک لفظ کا فرق ہے۔
August 2026 تک، funnel صرف port 443، 8443 یا 10000 پر listen کرتا ہے، اور کسی دوسرے port پر نہیں۔ default port 443 ہے، جبکہ --https=8443 یا --https=10000 متبادل ہیں۔ کوئی بھی دوسرا port مسترد کر دیا جاتا ہے، کیونکہ funnel relays صرف انہی ports پر connections قبول کرتے ہیں۔ اسی لیے funnel URL ہمیشہ bare hostname ہوتا ہے، یا hostname کے آخر میں :8443 جڑا ہوتا ہے۔
ابھی کیا public طور پر published ہے، یہ کیسے دیکھوں؟
قیاس کرنا اس بات کا طریقہ ہے کہ کوئی dashboard ایک ماہ تک public رہے۔ node سے براہِ راست پوچھیں۔
tailscale serve status
tailscale funnel status
tailscale serve status --jsonدونوں status commands ایک ہی config پڑھتے ہیں، اس لیے دونوں میں سے کوئی بھی پوری صورتِ حال دکھا دیتا ہے۔ کسی script یا scheduled check میں --json form استعمال کریں، کیونکہ سادہ output لوگوں کے پڑھنے کے لیے ہوتا ہے۔ جب کچھ بھی configured نہ ہو تو ایک سطر دکھائی دیتی ہے:
No serve configSetup کے کامیاب ہونے کے بعد یہ output دیکھنے کا مطلب ہے کہ mapping foreground میں بنائی گئی تھی اور process ختم ہو چکا ہے۔ اسے --bg کے ذریعے دوبارہ بنائیں۔
ایک mapping ہٹانے کے لیے اسے بنانے والی command دوبارہ چلائیں اور آخر میں off شامل کریں۔ node پر موجود تمام serve اور funnel mappings صاف کرنے کے لیے reset استعمال کریں۔
sudo tailscale funnel --https=443 3000 off
sudo tailscale serve resetدونوں میں سے کوئی command چلانے کے بعد tailscale serve status دوبارہ چلائیں اور جو باقی رہ گیا ہے اسے پڑھیں۔ یہ فرض نہ کریں کہ command نے وہی کام کیا ہے جو آپ چاہتے تھے۔
آپ کو کیا حاصل ہوتا ہے، اور آپ کو کیا چھوڑنا پڑتا ہے
فوائد حقیقی ہیں، اور یہی وجہ ہے کہ لوگ اسے reverse proxy پر ترجیح دیتے ہیں۔
- ایسا certificate جس پر browsers اعتماد کرتے ہیں اور جو آپ کے لیے renew ہو جاتا ہے۔ ACME (automatic certificate management environment) client install کرنے کی ضرورت نہیں، اور نہ ہی renewal job بھولنے کا خطرہ ہے۔
- VPS firewall پر کوئی inbound port نہیں۔
tailscaledباہر کی طرف connection بناتا ہے، اس لیے آپ کے VPS پر default-deny ufw firewall پہلے کی طرح سخت رہ سکتا ہے۔ - کوئی DNS record خریدنے، point کرنے یا اس کے فعال ہونے کا انتظار کرنے کی ضرورت نہیں۔
- کوئی port forwarding نہیں، جو NAT (network address translation) کے پیچھے موجود machine کے لیے بنیادی مسئلہ ہوتا ہے، جبکہ VPS کے پاس public IP ہوتا ہے۔
اخراجات بھی اتنے ہی حقیقی ہیں، اور funnel کے تمام اخراجات یہی ہیں۔
- نام آپ کا نہیں ہوتا۔ Public visitors کو
host.your-tailnet.ts.netنظر آتا ہے۔ Funnel میں custom domain support نہیں، اس لیے آپ اس کے سامنےapp.example.comنہیں رکھ سکتے۔ - path آپ کا نہیں ہوتا۔ Traffic پہلے Tailscale relay تک پہنچتا ہے، اور relay tailnet کے ذریعے stream کو آپ کے node تک proxy کرتا ہے۔ Tailscale کے مطابق funnel traffic ایسی bandwidth limits کے تابع ہوتا ہے جو شائع نہیں کی جاتیں اور configure نہیں کی جا سکتیں، اس لیے کسی عدد پر انحصار کرنے سے پہلے اپنی throughput خود measure کریں۔
- controls دستیاب نہیں ہوتے۔ آپ خود چلانے والے reverse proxy میں access logs، rate limits، request size caps اور authentication رکھنے کی جگہ موجود ہوتی ہے۔ Funnel آپ کو صرف ایک URL دیتا ہے۔ باقی تمام انتظام آپ کی application کے اندر ہونا چاہیے۔
- port list اوپر بیان کیے گئے طریقے کے مطابق fixed ہے۔
دونوں features کا انحصار Tailscale کے زیر انتظام infrastructure پر بھی ہوتا ہے: ts.net نام کے لیے certificate issuance اور خود funnel relays۔ اگر آپ self-hosted Headscale control server استعمال کرنے پر غور کر رہے ہیں تو یہ فرض نہ کریں کہ ان میں سے کوئی feature آپ کے ساتھ منتقل ہو جائے گا۔ جس Headscale version کو چلانے کا ارادہ ہے، اس کی release notes دیکھیں۔
آپ کو کون سا استعمال کرنا چاہیے؟
اصول مختصر ہے۔
اندرونی استعمال کی ہر چیز کے لیے serve استعمال کریں: admin interfaces، dashboards، ایسی metrics UI جسے آپ index نہیں کروانا چاہتے، یا کسی site کی staging copy۔ access control کا معیار tailnet کی رکنیت ہے، اور یہ مؤثر ہے۔ جو device tailnet پر موجود نہ ہو، وہ نام کو resolve بھی نہیں کر سکتا۔
demo link، ایسے webhook receiver کے لیے جس پر کسی third party کو POST کرنا ہو، یا development کے دوران OAuth callback کے لیے funnel استعمال کریں۔ public HTTPS URL حاصل کرنے کا یہ تیز ترین طریقہ ہے، اور ایک off command اسے ختم کر دیتی ہے۔ لیکن public کا مطلب public ہی ہے: hostname کوئی secret نہیں، اور login کے بغیر کسی app کے سامنے funnel ایک کھلی service ہے۔ اس کے پیچھے موجود ہر چیز کو اپنی requests کی authentication خود کرنی چاہیے، بالکل اسی احتیاط کے ساتھ جس کی ضرورت exposed Ollama API endpoint کو ہوتی ہے۔
production کہلانے والی ہر چیز کے لیے حقیقی reverse proxy استعمال کریں۔ آپ کا domain، آپ کا certificate، آپ کے logs، آپ کی rate limits، اور request path میں کوئی دوسرا فریق نہیں۔ reverse proxy کے طور پر nginx، Caddy اور Traefik کا موازنہ میں کسی ایک کے انتخاب کا طریقہ بیان کیا گیا ہے۔
ناکامی کی صورتیں، ان پیغامات کے ساتھ جو آپ دیکھیں گے
Funnel شروع ہونے سے انکار کرتا ہے۔ Funnel not available; "funnel" node attribute not set. پالیسی کا مسئلہ ہے، command کا نہیں۔ tailnet policy file میں funnel attribute شامل کریں، اسے save کریں، اور دوبارہ کوشش کریں۔
یہ کام کر رہا تھا، لیکن اب tailscale serve status، No serve config کہتا ہے۔ mapping foreground میں بنائی گئی تھی اور وہ process ختم ہو گیا۔ اسی command کو --bg کے ساتھ دوبارہ چلائیں۔
نام resolve ہو جاتا ہے، لیکن کوئی جواب نہیں آتا۔ Serve آپ کے بتائے گئے target کو proxy کرتا ہے۔ اس لیے اگر وہاں کچھ بھی listening نہیں کر رہا تو proxy کرنے کے لیے کچھ موجود نہیں۔ اسی machine پر tailscaled چل رہا ہے، وہاں ss -ltnp | grep 3000 سے تصدیق کریں۔ عام وجہ یہ ہے کہ کوئی container اپنا port Docker bridge address پر publish کر رہا ہوتا ہے، 127.0.0.1 پر نہیں۔ اس کا مطلب ہے کہ host کو اس جگہ کوئی listener نظر نہیں آتا جہاں آپ اس کی توقع کر رہے تھے۔ Docker Compose networking کیسے کام کرتی ہے میں بتایا گیا ہے کہ published port حقیقت میں کہاں پہنچتا ہے۔
ts.net نام پر certificate errors آتے ہیں۔ غالب امکان ہے کہ tailnet کے لیے HTTPS certificates enabled نہیں ہیں۔ انہیں admin console میں enable کریں، پھر certificate step الگ سے چلائیں تاکہ اس کے errors serve output کے ساتھ خلط ملط نہ ہوں:
sudo tailscale cert your-host.your-tailnet.ts.netFunnel mobile data پر load ہوتا ہے، لیکن آپ کے laptop سے مختلف رویہ دکھاتا ہے۔ آپ کا laptop tailnet پر ہے، اس لیے MagicDNS نام کو 100.x address پر resolve کرتا ہے اور آپ relay استعمال کیے بغیر service تک براہ راست پہنچتے ہیں۔ یہ درست رویہ ہے، اور اس کا مطلب ہے کہ آپ کا laptop public reachability کی جانچ بالکل نہیں کر سکتا۔ curl ایسی machine سے استعمال کریں جو tailnet پر نہ ہو۔
FAQ
tailscale serve اور tailscale funnel میں کیا فرق ہے؟
نتیجہ تک کون پہنچ سکتا ہے۔ tailscale serve مقامی port کو ایسے HTTPS URL پر شائع کرتا ہے جس تک صرف آپ کے tailnet کے devices پہنچ سکتے ہیں۔ tailscale funnel اسی port کو ایسے URL پر شائع کرتا ہے جس تک internet پر موجود ہر شخص پہنچ سکتا ہے، اور اس traffic کو Tailscale کے چلائے ہوئے relay servers کے ذریعے route کیا جاتا ہے۔ دونوں کے flags اور targets ایک جیسے ہوتے ہیں۔ output کی پہلی سطر بتاتی ہے کہ آپ کو کون سا حاصل ہوا: Available within your tailnet یا Available on the internet۔
tailscale funnel یہ کیوں کہتا ہے کہ node attribute set نہیں ہے؟
کیونکہ کوئی شخص اسے enable نہ کرے تو tailnet کے لیے funnel disabled رہتا ہے۔ پیغام Funnel not available; "funnel" node attribute not set. ہے، اور یہ آپ کے اپنے client سے آتا ہے، اس سے پہلے کہ کسی relay سے رابطہ کیا جائے۔ Access Controls کے تحت tailnet policy file میں nodeAttrs entry شامل کریں، جو funnel attribute autogroup:member کو، یا کسی tag کو دے، اگر صرف ایک machine کو publish کرنا ہو۔ tailnet admin اس کے بجائے CLI کے دکھائے ہوئے consent URL کو follow کر سکتا ہے۔
Tailscale Funnel کون سے ports استعمال کر سکتا ہے؟
صرف 443، 8443 اور 10000۔ default 443 ہے، اور آپ --https=8443 یا --https=10000 کے ذریعے دوسرا port منتخب کرتے ہیں۔ یہ funnel relays کی حد ہے، آپ کے server کی نہیں؛ اس لیے VPS پر firewall یا configuration تبدیل کرنے سے یہ حد ختم نہیں ہوتی۔ tailscale serve پر ایسی کوئی پابندی نہیں، کیونکہ وہ کبھی آپ کے tailnet سے باہر نہیں جاتا۔
کیا serve یا funnel URL reboot کے بعد بھی برقرار رہتا ہے؟
صرف اس صورت میں جب آپ نے --bg استعمال کیا ہو۔ اس کے بغیر command foreground میں چلتی ہے، Press Ctrl+C to exit. دکھاتی ہے، اور process ختم ہوتے ہی mapping بھی ختم ہو جاتی ہے۔ --bg کے ساتھ mapping node کے serve config میں لکھی جاتی ہے اور reboot کے بعد tailscaled کے ساتھ واپس آ جاتی ہے۔ tailscale serve status سے تصدیق کریں؛ جب کچھ set نہ ہو تو یہ No serve config دکھاتا ہے۔
کیا funnel کو چلتا چھوڑنا محفوظ ہے؟
Transport کے لحاظ سے یہ محفوظ ہے: connection HTTPS ہوتی ہے اور آپ کے firewall پر کوئی port open نہیں ہوتا۔ عام مفہوم میں یہ محفوظ نہیں، کیونکہ URL public ہوتا ہے اور اس کے پیچھے موجود application بھی public ہو جاتی ہے۔ Funnel صرف ایسی سروس کے سامنے چلتا چھوڑیں جو اپنی requests کی authentication خود کرتی ہو، اور demo یا webhook test مکمل ہونے پر اسے بند کر دیں۔ اس کے لیے اسے بنانے والی command کے آخر میں off استعمال کریں۔
اوپر بیان کردہ command behavior کے ذرائع Tailscale Serve اور Funnel کی documentation اور CLI reference ہیں، جو tailscale.com/docs پر دستیاب ہیں۔