Tailscale serve और Funnel में क्या अंतर है?
Tailscale serve केवल आपके tailnet के लिए HTTPS URL बनाता है, जबकि Funnel उसे सार्वजनिक इंटरनेट पर खोलता है। जानें कि कब किसका उपयोग करें और Funnel के लिए जरूरी ACL पॉलिसी क्या है।
tailscale serve और funnel के बीच अंतर: URL तक कौन पहुँच सकता है
tailscale serve और tailscale funnel के बीच एकमात्र अंतर यह है कि इसे कौन देख सकता है। serve एक local port पर HTTPS (hypertext transfer protocol secure) front end लगाता है और इसे केवल आपके tailnet पर प्रकाशित करता है। funnel उसी local port को Tailscale द्वारा संचालित relay servers के माध्यम से पूरे सार्वजनिक internet पर प्रकाशित करता है। दोनों commands में समान flags और समान targets का उपयोग होता है। एक निजी dashboard और दुनिया भर में सुलभ dashboard के बीच केवल एक शब्द का अंतर है।
दोनों आपको एक ऐसा certificate देते हैं जिस पर browsers पहले से भरोसा करते हैं, जिसका नाम ts.net पर समाप्त होता है, और किसी को भी अपने VPS firewall पर inbound port खोलने की आवश्यकता नहीं होती है। आपका tailscaled daemon पहले से ही tailnet से एक connection बनाए रखता है, इसलिए traffic उसी के माध्यम से आता है। किसी सर्वर को tailnet पर लाना एक अलग कार्य है, और VPS को Tailscale exit node के रूप में चलाना या निजी नेटवर्क के लिए subnet router का विज्ञापन करना इस विषय को कवर करता है। पहले से ही tailnet पर मौजूद किसी service को प्रकाशित करना यह कार्य है।
किसी भी कमांड के काम करने से पहले आपकी आवश्यकताएं
- VPS पर Tailscale 1.38.3 या उससे नया वर्ज़न, जो आपके tailnet में लॉग इन हो।
tailscale versionऔरtailscale statusके साथ इसकी जाँच करें। - MagicDNS सक्षम होना चाहिए। MagicDNS, Tailscale का इन-बिल्ट DNS (डोमेन नेम सिस्टम) है, और यही मशीन को केवल
100.xपते के बजायblog-vps.your-tailnet.ts.netजैसा नाम देता है। - एडमिन कंसोल के DNS पेज पर, tailnet के लिए HTTPS सर्टिफिकेट सक्षम होने चाहिए। इसके बिना आपके पोर्ट के सामने लगाने के लिए कोई सर्टिफिकेट नहीं होगा।
- केवल
funnelके लिए, tailnet पॉलिसी फ़ाइल मेंfunnelनोड एट्रिब्यूट आवश्यक है। अधिकांश लोग पहली बार में यहीं अटकते हैं, और इसे नीचे समझाया गया है।
यहाँ हर कमांड sudo से शुरू होती है, क्योंकि CLI एक ऐसे सॉकेट के माध्यम से tailscaled से बात करती है जिसे केवल root ही लिख सकता है। किसी एक यूज़र को इसे छोड़ने का अधिकार दें:
sudo tailscale set --operator=$USERTailscale serve के साथ अपने tailnet पर पब्लिश करें
serve को एक local port पर पॉइंट करें और बाकी काम यह खुद कर लेता है।
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 पर listen करता है, ts.net certificate के साथ TLS (transport layer security) को terminate करता है, और plain HTTP को आपके local port पर forward कर देता है। आपके application को यह जानने की आवश्यकता नहीं होती कि कोई certificate मौजूद है, और यही मुख्य कारण है कि आप इसे ऐसे admin panel के सामने उपयोग करते हैं जिसे आप अन्यथा plain HTTP पर छोड़ देते।
अब अंतिम पंक्ति पढ़ें: Press Ctrl+C to exit. यह command foreground में चलती है, और mapping उस process के भीतर ही रहती है। terminal बंद करें और URL काम करना बंद कर देगा, क्योंकि डिस्क पर कुछ भी नहीं लिखा गया था। --bg जोड़ें और mapping node के serve config में चली जाएगी, जो terminal बंद होने और reboot होने के बाद भी बनी रहती है।
sudo tailscale serve --bg 3000Serve केवल port number से अधिक स्वीकार करता है। --set-path एक service को subpath के अंतर्गत mount करता है, ताकि कई apps एक ही hostname साझा कर सकें:
sudo tailscale serve --bg --set-path=/grafana 3000
sudo tailscale serve --bg --set-path=/metrics 9090Target एक static files की directory भी हो सकता है, या ऐसा backend जो पहले से ही TLS का उपयोग कर रहा हो और आप उसके certificate की जाँच नहीं करना चाहते:
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 को समाप्त करके plaintext को आगे भेज देता है, जो एक trusted certificate को ऐसी service के सामने रखता है जो HTTP का उपयोग नहीं करती है:
sudo tailscale serve --bg --tls-terminated-tcp=443 tcp://127.0.0.1:9899Funnel यह क्यों कहता है कि node attribute सेट नहीं है?
Funnel डिफ़ॉल्ट रूप से पूरे tailnet के लिए बंद रहता है। पहली बार चलाने पर यह संदेश दिखाई देता है और प्रक्रिया रुक जाती है:
Funnel not available; "funnel" node attribute not set. See https://tailscale.com/kb/1223/tailscale-funnel/.कमांड सही थी। tailnet policy ने इस node को publish करने की अनुमति नहीं दी है, इसलिए relay से संपर्क करने से पहले ही client इसे अस्वीकार कर देता है। admin console में Access Controls के अंतर्गत tailnet policy फ़ाइल को edit करें और यह attribute जोड़ें:
"nodeAttrs": [
{
"target": ["autogroup:member"],
"attr": ["funnel"],
},
],autogroup:member इसे tailnet के प्रत्येक सदस्य को अनुमति देता है। यदि केवल एक machine को ही publish करना चाहिए, तो उस machine को tag करें और उस tag को target करें, उदाहरण के लिए tag:public। Policy को save करें, और फिर funnel कमांड को दोबारा चलाएँ।
यदि आपका account tailnet admin का है, तो हाल के clients एक शॉर्टकट प्रदान करते हैं: CLI login.tailscale.com पर एक consent URL प्रिंट करता है, और उस पर जाने से HTTPS certificates सक्षम हो जाते हैं और यह attribute आपके लिए जुड़ जाता है। यदि आप admin नहीं हैं, तो वह URL आपकी मदद नहीं करेगा। किसी ऐसे व्यक्ति को, जिसके पास policy access है, यह बदलाव करना होगा।
Tailscale funnel के साथ इंटरनेट पर पब्लिश करना
एक बार attribute सेट हो जाने के बाद, कमांड वही है जिसे आप पहले से जानते हैं, बस इसमें 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 के बीच एकमात्र दृश्य अंतर हैं, और उन्हें उत्पन्न करने वाले कमांड्स में केवल एक शब्द का अंतर होता है।
अगस्त 2026 तक, funnel केवल port 443, 8443 या 10000 पर listen करता है, और किसी अन्य पर नहीं। डिफ़ॉल्ट port 443 है, और --https=8443 या --https=10000 इसके विकल्प हैं। किसी भी अन्य port को अस्वीकार कर दिया जाता है, क्योंकि funnel relays केवल इन्हीं पर connections स्वीकार करते हैं। यही कारण है कि एक funnel URL हमेशा केवल hostname होता है, या फिर अंत में :8443 के साथ जुड़ा हुआ hostname होता है।
वर्तमान में क्या पब्लिश है, यह कैसे देखें?
अनुमान लगाने से डैशबोर्ड महीनों तक पब्लिक रह सकता है। इसके बजाय सीधे नोड से पूछें।
tailscale serve status
tailscale funnel status
tailscale serve status --jsonदोनों status कमांड एक ही कॉन्फ़िगरेशन को पढ़ते हैं, इसलिए कोई भी कमांड आपको पूरी स्थिति दिखा देगा। स्क्रिप्ट या निर्धारित चेक के भीतर --json फॉर्म का उपयोग करें, क्योंकि सामान्य आउटपुट मनुष्यों के पढ़ने के लिए लिखा गया है। जब कुछ भी कॉन्फ़िगर नहीं होता है, तो आपको एक लाइन दिखाई देगी:
No serve configसेटअप के बाद इसे देखने का मतलब है कि मैपिंग फोरग्राउंड में बनाई गई थी और प्रोसेस अब समाप्त हो चुकी है। इसे --bg के साथ दोबारा बनाएँ।
एक मैपिंग को हटाने के लिए, उसे बनाने वाले कमांड को दोहराएँ और अंत में off लगाएँ। नोड पर सभी serve और funnel मैपिंग को हटाने के लिए, reset का उपयोग करें।
sudo tailscale funnel --https=443 3000 off
sudo tailscale serve resetइनमें से किसी भी कमांड के बाद tailscale serve status को दोबारा चलाएँ और देखें कि क्या बचा है, बजाय इसके कि आप मान लें कि उसने वही किया जो आप चाहते थे।
आपको क्या मिलता है, और आप क्या छोड़ते हैं
इसके लाभ वास्तविक हैं, और यही कारण है कि लोग reverse proxy के बजाय इसे चुनते हैं।
- ब्राउज़र द्वारा विश्वसनीय certificate, जो आपके लिए स्वतः 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) के पीछे स्थित मशीन के लिए पूरी कहानी है, न कि public IP वाले VPS के लिए।
इसकी लागत भी उतनी ही वास्तविक है, और funnel इन सभी को वहन करता है।
- यह नाम आपका नहीं है। सार्वजनिक आगंतुक
host.your-tailnet.ts.netदेखते हैं। Funnel में custom domain का समर्थन नहीं है, इसलिए आप इसके सामनेapp.example.comनहीं लगा सकते। - यह path आपका नहीं है। Traffic पहले एक Tailscale relay तक पहुँचता है, और relay उस stream को tailnet के माध्यम से आपके node तक proxy करता है। Tailscale का कहना है कि funnel traffic उन bandwidth सीमाओं के अधीन है जो प्रकाशित नहीं हैं और जिन्हें configure नहीं किया जा सकता है, इसलिए किसी संख्या पर निर्भर होने से पहले अपने throughput को स्वयं मापें।
- इसमें controls का अभाव है। आपके द्वारा चलाए जाने वाले reverse proxy में आपको access logs, rate limits, request size caps और authentication लगाने की सुविधा मिलती है। Funnel आपको केवल एक URL देता है। बाकी सब कुछ आपके application के भीतर ही होना चाहिए।
- ऊपर बताए अनुसार, port list निश्चित है।
ये दोनों सुविधाएँ Tailscale द्वारा संचालित infrastructure पर भी निर्भर करती हैं: ts.net नाम के लिए certificate जारी करना, और स्वयं funnel relays। यदि आप self-hosted Headscale control server पर विचार कर रहे हैं, तो यह न मानें कि ये दोनों सुविधाएँ आपके साथ काम करेंगी। उस Headscale version के release notes देखें जिसे आप चलाने की योजना बना रहे हैं।
मुझे किसका उपयोग करना चाहिए?
नियम संक्षिप्त है।
किसी भी आंतरिक चीज़ के लिए serve का उपयोग करें: एडमिन इंटरफेस, डैशबोर्ड, ऐसी मेट्रिक्स UI जिसे आप इंडेक्स नहीं करना चाहते, या किसी साइट की स्टेजिंग कॉपी। Tailnet की सदस्यता ही एक्सेस कंट्रोल है, और यह एक प्रभावी तरीका है। जो डिवाइस Tailnet पर नहीं है, वह नाम को रिजॉल्व भी नहीं कर सकता।
डेमो लिंक, किसी थर्ड पार्टी द्वारा POST किए जाने वाले वेबहुक रिसीवर, या डेवलपमेंट के दौरान OAuth कॉलबैक के लिए funnel का उपयोग करें। यह सार्वजनिक HTTPS URL प्राप्त करने का सबसे तेज़ तरीका है, और एक off कमांड इसे समाप्त कर देती है। हालाँकि, सार्वजनिक का अर्थ सार्वजनिक ही है: होस्टनेम कोई गुप्त जानकारी नहीं है, और बिना लॉगिन वाली ऐप के सामने फनल एक खुली सेवा है। इसके पीछे जो कुछ भी है, उसे अपने अनुरोधों को प्रमाणित करना चाहिए, उसी सावधानी के साथ जिसकी एक एक्सपोज़्ड Ollama API एंडपॉइंट को आवश्यकता होती है।
जिसे आप प्रोडक्शन कहेंगे, उसके लिए एक वास्तविक रिवर्स प्रॉक्सी का उपयोग करें। आपका डोमेन, आपका सर्टिफिकेट, आपके लॉग्स, आपकी रेट लिमिट्स, और रिक्वेस्ट पाथ में आपके अलावा कोई और नहीं। रिवर्स प्रॉक्सी के रूप में nginx, Caddy और Traefik की तुलना एक को चुनने में मदद करती है।
विफलता के प्रकार और दिखाई देने वाले संदेश
Funnel शुरू होने से मना कर देता है। Funnel not available; "funnel" node attribute not set. एक policy संबंधी समस्या है, न कि 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 पर ss -ltnp | grep 3000 के साथ पुष्टि करें जो tailscaled चलाती है। इसका सामान्य कारण यह है कि container अपना port 127.0.0.1 के बजाय Docker bridge address पर publish कर रहा है, जिसका अर्थ है कि host को वहाँ कोई listener नहीं दिखता जहाँ आपने उम्मीद की थी। Docker Compose networking कैसे काम करती है दिखाता है कि एक published port वास्तव में कहाँ पहुँचता है।
ts.net नाम पर certificate त्रुटियाँ। संभवतः tailnet के लिए HTTPS certificates सक्षम नहीं हैं। उन्हें admin console में चालू करें, फिर certificate step को अलग से चलाएँ ताकि इसकी त्रुटियाँ serve output के साथ न उलझें:
sudo tailscale cert your-host.your-tailnet.ts.netFunnel mobile data पर लोड होता है लेकिन आपके laptop पर अलग व्यवहार करता है। आपका laptop tailnet पर है, इसलिए MagicDNS नाम को 100.x address पर resolve करता है और आप relay को छुए बिना सीधे service तक पहुँच जाते हैं। यह सही व्यवहार है, और इसका मतलब है कि आपका laptop public reachability का परीक्षण बिल्कुल नहीं कर सकता। ऐसी machine से curl का उपयोग करें जो tailnet पर नहीं है।
FAQ
tailscale serve और tailscale funnel में क्या अंतर है?
यह इस पर निर्भर करता है कि परिणाम तक कौन पहुँच सकता है। tailscale serve एक local port को HTTPS URL पर प्रकाशित करता है जिसे केवल आपके tailnet पर मौजूद डिवाइस ही एक्सेस कर सकते हैं। tailscale funnel उसी port को एक ऐसे URL पर प्रकाशित करता है जिसे इंटरनेट पर कोई भी एक्सेस कर सकता है, जिसे Tailscale द्वारा संचालित relay servers के माध्यम से रूट किया जाता है। इनके flags और targets समान होते हैं। आउटपुट की पहली पंक्ति आपको बताती है कि आपको क्या मिला है: Available within your tailnet या Available on the internet।
tailscale funnel यह क्यों कहता है कि node attribute सेट नहीं है?
क्योंकि funnel तब तक tailnet के लिए अक्षम रहता है जब तक कोई इसे सक्षम न करे। यह संदेश Funnel not available; "funnel" node attribute not set. है और यह आपके अपने क्लाइंट से आता है, इससे पहले कि किसी relay से संपर्क किया जाए। Access Controls के अंतर्गत tailnet policy फ़ाइल में एक nodeAttrs प्रविष्टि जोड़ें जो autogroup:member को, या यदि केवल एक मशीन को प्रकाशित करना है तो किसी tag को, funnel attribute प्रदान करे। एक tailnet एडमिन CLI द्वारा प्रिंट किए गए consent URL का पालन भी कर सकता है।
Tailscale Funnel किन ports का उपयोग कर सकता है?
केवल 443, 8443 और 10000। डिफ़ॉल्ट 443 है, और आप --https=8443 या --https=10000 के साथ दूसरा चुन सकते हैं। यह funnel relays की सीमा है, न कि आपके सर्वर की, इसलिए VPS पर कोई firewall परिवर्तन या कॉन्फ़िगरेशन परिवर्तन इसे नहीं हटा सकता। tailscale serve में ऐसी कोई सीमा नहीं है, क्योंकि यह कभी भी आपके tailnet से बाहर नहीं जाता है।
क्या serve या funnel URL रीबूट के बाद भी बने रहते हैं?
केवल तभी यदि आपने --bg का उपयोग किया हो। इसके बिना कमांड foreground में चलती है, Press Ctrl+C to exit. प्रिंट करती है, और प्रक्रिया के साथ ही मैपिंग समाप्त हो जाती है। --bg के साथ मैपिंग नोड के serve कॉन्फ़िगरेशन में लिखी जाती है और रीबूट के बाद tailscaled के साथ वापस आ जाती है। tailscale serve status के साथ जाँचें, जो कुछ भी सेट न होने पर No serve config प्रिंट करता है।
क्या funnel को चालू छोड़ना सुरक्षित है?
यह ट्रांसपोर्ट के अर्थ में सुरक्षित है: कनेक्शन HTTPS है और आपके firewall पर कोई port खुला नहीं है। यह उस अर्थ में सुरक्षित नहीं है जिसका लोग आमतौर पर मतलब निकालते हैं, क्योंकि URL सार्वजनिक है, इसलिए इसके पीछे का एप्लिकेशन भी सार्वजनिक है। funnel को केवल उसी चीज़ के सामने चालू रखें जो अपने स्वयं के अनुरोधों को प्रमाणित (authenticate) करती है, और जब डेमो या webhook टेस्ट समाप्त हो जाए, तो इसे उस कमांड का उपयोग करके बंद कर दें जिसके अंत में off लगा हो।
उपरोक्त कमांड व्यवहार के स्रोत: Tailscale Serve और Funnel दस्तावेज़ीकरण और tailscale.com/docs पर CLI संदर्भ।