SSD Nodes Learn 🎉 VPS $5.50/মাস থেকে
নির্দেশিকা Matt Connorদ্বারা Matt Connor

Tailscale serve বনাম funnel: কোনটি ব্যবহার করবেন

Tailscale serve tailnet-সীমিত HTTPS URL দেয়, আর funnel একই port public internet-এ খোলে। পার্থক্য, প্রয়োজনীয় policy gate এবং Tailscale 1.38.3+ শর্ত জানুন।

tailscale serve বনাম funnel: URL-এ কারা পৌঁছাতে পারবে

tailscale serve এবং tailscale funnel-এর মধ্যে পার্থক্য হলো কারা এটি ব্যবহার করতে পারবে, আর কিছু নয়। serve একটি স্থানীয় port-এর সামনে HTTPS (hypertext transfer protocol secure) front end বসায় এবং সেটি শুধু আপনার tailnet-এ প্রকাশ করে। funnel একই স্থানীয় port-কে Tailscale পরিচালিত relay server-এর মাধ্যমে সমগ্র public internet-এ প্রকাশ করে। দুটি command একই flag এবং একই target গ্রহণ করে। একটি শব্দই private dashboard এবং সবার জন্য উন্মুক্ত dashboard-এর মধ্যে পার্থক্য তৈরি করে।

উভয় পদ্ধতিতেই এমন একটি certificate পাওয়া যায়, যা browser আগে থেকেই trust করে এবং যার name ts.net-এ শেষ হয়। কোনো পদ্ধতির জন্যই আপনার VPS firewall-এ inbound port খোলার প্রয়োজন নেই। আপনার tailscaled daemon ইতিমধ্যে tailnet-এর দিকে একটি outgoing connection ধরে রাখে, তাই network traffic সেই connection দিয়েই আসে। কোনো server-কে tailnet-এ যুক্ত করা একটি আলাদা কাজ; VPS-কে Tailscale exit node হিসেবে চালানো বা private network-এর জন্য subnet router advertise করা সেই কাজের আওতায় পড়ে। ইতিমধ্যে tailnet-এ থাকা কোনো service প্রকাশ করা হলো এই কাজ।

যে বিষয়গুলো যেকোনো কমান্ড কাজ করার আগে প্রয়োজন

  • VPS-এ Tailscale 1.38.3 বা পরবর্তী সংস্করণ ইনস্টল থাকতে হবে এবং আপনার tailnet-এ লগ ইন করা থাকতে হবে। tailscale version এবং tailscale status দিয়ে পরীক্ষা করুন।
  • MagicDNS সক্রিয় থাকতে হবে। MagicDNS হলো Tailscale-এর বিল্ট-ইন DNS (domain name system)। এটি মেশিনটিকে শুধু 100.x address হিসেবে না দেখিয়ে blog-vps.your-tailnet.ts.net-এর মতো একটি নাম দেয়।
  • Admin console-এর DNS page থেকে tailnet-এর জন্য HTTPS certificate সক্রিয় থাকতে হবে। এটি না থাকলে আপনার port-এর সামনে বসানোর মতো কোনো certificate থাকবে না।
  • শুধু funnel-এর জন্য tailnet policy file-এ funnel node attribute থাকতে হবে। প্রথমবার চেষ্টা করার সময় অধিকাংশ ব্যবহারকারী এখানেই আটকে যান। নিচে এটি ব্যাখ্যা করা হয়েছে।

এখানে প্রতিটি command sudo দিয়ে শুরু হয়, কারণ CLI একটি socket-এর মাধ্যমে tailscaled-এর সঙ্গে যোগাযোগ করে, যেটিতে শুধু root লিখতে পারে। একজন user-কে এই prefix বাদ দেওয়ার অনুমতি দিতে নিচের কমান্ডটি ব্যবহার করুন:

sudo tailscale set --operator=$USER

tailscale serve ব্যবহার করে আপনার tailnet-এ প্রকাশ করুন

serve-কে একটি local port-এ নির্দেশ করুন। বাকি কাজ এটি নিজেই করবে।

sudo tailscale serve 3000
Available 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) termination করে এবং plain HTTP আপনার local port-এ forward করে। আপনার application-কে certificate থাকার বিষয়টি জানতেই হয় না। Plain HTTP-তে চালু রাখা admin panel-এর সামনে এটি ব্যবহার করার প্রধান কারণ এটাই।

এখন শেষ লাইনটি দেখুন: Press Ctrl+C to exit. কমান্ডটি foreground-এ চলে এবং mapping-টি ওই process-এর মধ্যেই থাকে। Terminal বন্ধ করলে URL কাজ করা বন্ধ করবে, কারণ disk-এ কিছু লেখা হয়নি। --bg যোগ করলে mapping-টি node-এর serve config-এ সংরক্ষিত হয়। এটি terminal বন্ধ হওয়া এবং reboot—উভয় অবস্থার পরেও কার্যকর থাকে।

sudo tailscale serve --bg 3000

Serve শুধু একটি port number গ্রহণ করে না। --set-path একটি service-কে subpath-এর অধীনে mount করে। ফলে একই hostname একাধিক app ভাগ করে ব্যবহার করতে পারে:

sudo tailscale serve --bg --set-path=/grafana 3000
sudo tailscale serve --bg --set-path=/metrics 9090

Target static file-এর একটি 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 termination করে এবং plaintext পরবর্তী service-এ পাঠায়। এর ফলে এমন একটি service-এর সামনে একটি trusted certificate বসানো যায়, যা HTTP একেবারেই সমর্থন করে না:

sudo tailscale serve --bg --tls-terminated-tcp=443 tcp://127.0.0.1:9899

Funnel বলছে node attribute সেট করা নেই কেন?

ডিফল্টভাবে পুরো tailnet-এর জন্য Funnel বন্ধ থাকে। প্রথমবার চালালে এটি নিচের বার্তা দেখিয়ে বন্ধ হয়ে যায়:

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 হয়, সাম্প্রতিক client-গুলোতে একটি সংক্ষিপ্ত পদ্ধতি রয়েছে। CLI login.tailscale.com-এ একটি consent URL দেখায়। সেই URL অনুসরণ করলে HTTPS certificate সক্রিয় হয় এবং আপনার জন্য attribute-টিও যোগ করা হয়। আপনি admin না হলে ওই URL কাজে আসবে না। Policy access থাকা কাউকে এই পরিবর্তনটি করতে হবে।

Tailscale Funnel দিয়ে Internet-এ প্রকাশ করুন

অ্যাট্রিবিউট সেট করার পর, কমান্ডটি আপনি আগে থেকেই জানেন; শুধু verb আলাদা।

sudo tailscale funnel --bg 3000
Available 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-এর মধ্যে একমাত্র দৃশ্যমান পার্থক্য। এগুলো তৈরি করার কমান্ডে শুধু একটি শব্দের পার্থক্য থাকে।

August 2026 অনুযায়ী, Funnel শুধু port 443, 8443 অথবা 10000-এ listen করে; অন্য কোনো port-এ নয়। ডিফল্ট হলো 443, আর --https=8443 অথবা --https=10000 হলো বিকল্প। অন্য যেকোনো port প্রত্যাখ্যান করা হয়, কারণ Funnel relay কেবল এই port-গুলোতেই connection গ্রহণ করে। তাই Funnel URL সবসময় শুধু hostname হয়, অথবা hostname-এর শেষে :8443 যুক্ত থাকে।

এখন কী প্রকাশিত আছে তা কীভাবে দেখব?

অনুমান করতে থাকলে একটি dashboard এক মাস public অবস্থায় থেকে যায়। তাই node-কে সরাসরি জিজ্ঞাসা করুন।

tailscale serve status
tailscale funnel status
tailscale serve status --json

দুটি status command একই config পড়ে, তাই যেকোনো একটি চালালেই পুরো চিত্র দেখা যায়। Script বা scheduled check-এর মধ্যে --json form ব্যবহার করুন, কারণ সাধারণ output মানুষের পড়ার উপযোগী করে লেখা। কিছু configured না থাকলে একটি line দেখাবে:

No serve config

Setup সফল হয়েছে জানার পরও এটি দেখা গেলে বুঝবেন mapping-টি foreground-এ তৈরি হয়েছিল এবং process-টি এখন আর চলছে না। --bg দিয়ে এটি আবার তৈরি করুন।

একটি mapping সরাতে, সেটি তৈরি করা command-টি আবার চালিয়ে শেষে off যোগ করুন। Node-এর সব serve এবং funnel mapping মুছে ফেলতে reset ব্যবহার করুন।

sudo tailscale funnel --https=443 3000 off
sudo tailscale serve reset

যেকোনো একটি command চালানোর পরে আবার tailscale serve status চালান এবং অবশিষ্ট তথ্য পড়ুন। এতে command-টি আপনার প্রত্যাশামতো কাজ করেছে কি না অনুমানের ওপর নির্ভর করতে হবে না।

আপনি কী পাবেন এবং কী ছাড় দিতে হবে

সুবিধাগুলো বাস্তব, এবং এই কারণেই অনেকে reverse proxy-এর পরিবর্তে এটি বেছে নেন।

  • Browser যে certificate বিশ্বাস করে, সেটি আপনার হয়ে নবায়ন করা হবে। কোনো ACME (automatic certificate management environment) client ইনস্টল করতে হবে না এবং renewal job চালানোর কথাও মনে রাখতে হবে না।
  • VPS firewall-এ কোনো inbound port খুলতে হবে না। tailscaled বাইরে থেকে সংযোগ করে, তাই আপনার VPS-এ default-deny ufw firewall আগের মতোই কঠোর রাখা যায়।
  • কোনো DNS record কিনতে, নির্দেশ করতে বা সক্রিয় হওয়ার জন্য অপেক্ষা করতে হবে না।
  • কোনো port forwarding লাগবে না। Public IP-যুক্ত VPS-এর পরিবর্তে NAT (network address translation)-এর পেছনে থাকা মেশিনের ক্ষেত্রে এটিই মূল বিষয়।

খরচগুলোও সমানভাবে বাস্তব, এবং funnel-এর ক্ষেত্রে এগুলো সবই প্রযোজ্য।

  • নামটি আপনার নয়। Public visitor-রা 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 limit আছে, তবে সেই limit প্রকাশ করা হয় না এবং configure করা যায় না। তাই কোনো নির্দিষ্ট throughput-এর ওপর নির্ভর করার আগে নিজের throughput মেপে নিন।
  • নিয়ন্ত্রণের সুবিধাগুলো নেই। আপনি নিজে চালানো reverse proxy থেকে access log, rate limit, request size cap এবং authentication রাখার জায়গা পান। Funnel আপনাকে শুধু একটি URL দেয়। বাকি সবকিছু আপনার application-এর ভেতরে রাখতে হবে।
  • উপরের মতো port list নির্দিষ্ট।

উভয় feature-ই Tailscale পরিচালিত infrastructure-এর ওপর নির্ভর করে: ts.net নামের জন্য certificate issuance এবং funnel relay-গুলো। আপনি যদি self-hosted Headscale control server ব্যবহারের কথা বিবেচনা করেন, তাহলে ধরে নেবেন না যে এই দুটিও আপনার সঙ্গে চলে আসবে। আপনি যে Headscale version চালানোর পরিকল্পনা করছেন, তার release notes পরীক্ষা করুন।

কোনটি ব্যবহার করবেন?

নিয়মটি সংক্ষিপ্ত।

অভ্যন্তরীণ যেকোনো কিছুর জন্য serve ব্যবহার করুন: admin interface, dashboard, এমন metrics UI যা search index-এ রাখতে চান না, অথবা কোনো site-এর staging copy। tailnet-এর সদস্যতাই access control হিসেবে কাজ করে, এবং এটি কার্যকর। tailnet-এ নেই এমন কোনো device নামটি resolve-ও করতে পারে না।

demo link, কোনো third party-কে POST করতে হবে এমন webhook receiver, অথবা development-এর সময় OAuth callback-এর জন্য funnel ব্যবহার করুন। এটি public HTTPS URL পাওয়ার দ্রুততম উপায়, এবং একটি off command দিয়ে এটি বন্ধ করা যায়। তবে public মানেই public: hostname কোনো secret নয়, এবং login ছাড়া কোনো app-এর সামনে funnel থাকলে সেটি একটি উন্মুক্ত service। এর পেছনে যা-ই থাকুক, সেটিকে নিজের request-গুলো authenticate করতে হবে, ঠিক exposed Ollama API endpoint-এর মতোই সতর্কতার সঙ্গে।

production হিসেবে যেকোনো কিছুর জন্য real reverse proxy ব্যবহার করুন। আপনার domain, আপনার certificate, আপনার log, আপনার rate limit থাকবে এবং request path-এ অন্য কেউ থাকবে না। কোনটি বেছে নেবেন, তা জানতে reverse proxy হিসেবে nginx, Caddy এবং Traefik-এর তুলনা দেখুন।

ব্যর্থতার ধরন এবং যে বার্তাগুলো আপনি দেখবেন

Funnel চালু হতে অস্বীকৃতি জানায়। Funnel not available; "funnel" node attribute not set. একটি policy সমস্যা, command-এর সমস্যা নয়। tailnet policy file-এ funnel attribute যোগ করে file-টি save করুন, তারপর আবার চেষ্টা করুন।

এটি কাজ করেছিল, কিন্তু এখন tailscale serve status-এ No serve config দেখাচ্ছে। Mapping-টি foreground-এ তৈরি হয়েছিল এবং সেই process শেষ হয়ে গেছে। একই command --bg সহ আবার চালান।

নামটি resolve হচ্ছে, কিন্তু কোনো response পাওয়া যাচ্ছে না। Serve আপনার নির্দিষ্ট করা target-এ proxy করে। তাই সেখানে কোনো service listening না করলে proxy করার মতো কিছু থাকে না। tailscaled চালানো একই machine-এ ss -ltnp | grep 3000 ব্যবহার করে বিষয়টি নিশ্চিত করুন। সাধারণ কারণ হলো, কোনো container তার port 127.0.0.1-এর পরিবর্তে Docker bridge address-এ publish করেছে। ফলে আপনি যে জায়গায় listener আশা করছেন, host সেখানে কোনো listener দেখতে পাচ্ছে না। Docker Compose networking কীভাবে কাজ করে-এ published port বাস্তবে কোথায় যায় তা দেখানো হয়েছে।

ts.net নামের ক্ষেত্রে certificate error। সম্ভবত tailnet-এর জন্য HTTPS certificate enabled করা হয়নি। Admin console-এ এটি চালু করুন। এরপর certificate step আলাদাভাবে চালান, যাতে এর error-গুলো serve output-এর সঙ্গে মিশে না যায়:

sudo tailscale cert your-host.your-tailnet.ts.net

Mobile data-তে Funnel load হয়, কিন্তু laptop থেকে ভিন্ন আচরণ করে। আপনার laptop tailnet-এ আছে। তাই MagicDNS নামটি 100.x address-এ resolve করে এবং relay ব্যবহার না করে সরাসরি service-এ পৌঁছে যায়। এটি সঠিক আচরণ। এর অর্থ হলো, আপনার laptop দিয়ে public reachability পরীক্ষা করা যাবে না। tailnet-এ যুক্ত নয় এমন কোনো machine থেকে curl ব্যবহার করুন।

FAQ

tailscale serve এবং tailscale funnel-এর মধ্যে পার্থক্য কী?

ফলাফলে কারা পৌঁছাতে পারবে, সেটিই মূল পার্থক্য। tailscale serve একটি local port-কে এমন একটি HTTPS URL-এ প্রকাশ করে, যেটিতে শুধু আপনার tailnet-এর device-গুলো পৌঁছাতে পারে। tailscale funnel একই port-কে এমন একটি URL-এ প্রকাশ করে, যেটিতে Internet-এর যেকোনো ব্যক্তি পৌঁছাতে পারে; এই সংযোগ Tailscale পরিচালিত relay server-এর মাধ্যমে routing হয়। উভয়ের ক্ষেত্রে flag এবং target একই থাকে। প্রথম output line-এ আপনি কোনটি পেয়েছেন তা জানানো হয়: Available within your tailnet অথবা Available on the internet

tailscale funnel বলছে node attribute সেট করা নেই কেন?

কারণ কেউ enable না করা পর্যন্ত একটি tailnet-এ funnel disabled থাকে। বার্তাটি হলো Funnel not available; "funnel" node attribute not set. এবং কোনো relay-এর সঙ্গে যোগাযোগের আগে এটি আপনার নিজের client থেকে আসে। Access Controls-এর অধীনে tailnet policy file-এ একটি nodeAttrs entry যোগ করুন, যেখানে funnel attribute-টি autogroup:member-কে দেওয়া হবে। শুধু একটি machine প্রকাশ করতে হলে এর পরিবর্তে একটি tag ব্যবহার করতে পারেন। tailnet admin চাইলে CLI যে consent URL দেখায়, সেটি অনুসরণ করতে পারেন।

Tailscale Funnel কোন port ব্যবহার করতে পারে?

শুধু 443, 8443 এবং 10000। Default হলো 443। --https=8443 অথবা --https=10000 ব্যবহার করে অন্য port নির্ধারণ করতে পারেন। এটি funnel relay-এর সীমাবদ্ধতা, আপনার server-এর নয়। তাই VPS-এ firewall বা configuration পরিবর্তন করেও এই সীমা দূর করা যাবে না। tailscale serve-এর এমন কোনো সীমাবদ্ধতা নেই, কারণ এটি কখনো আপনার tailnet-এর বাইরে যায় না।

reboot-এর পর serve বা funnel URL কি চালু থাকে?

শুধু --bg ব্যবহার করলে থাকে। এটি ছাড়া command-টি foreground-এ চলে, Press Ctrl+C to exit. দেখায়, এবং process বন্ধ হওয়ার সঙ্গে mapping-টিও চলে যায়। --bg ব্যবহার করলে mapping-টি node-এর serve config-এ লেখা হয় এবং reboot-এর পর tailscaled-এর সঙ্গে আবার চালু হয়। tailscale serve status দিয়ে পরীক্ষা করুন। কিছু সেট করা না থাকলে এটি No serve config দেখায়।

funnel চালু রাখা কি নিরাপদ?

Transport-এর দিক থেকে এটি নিরাপদ: সংযোগটি HTTPS এবং আপনার firewall-এ কোনো port open হয় না। তবে সাধারণ অর্থে এটি নিরাপদ নয়, কারণ URL-টি public; ফলে এর পেছনের application-টিও public হয়ে যায়। এমন কিছুর সামনে funnel চালু রাখুন, যা নিজস্ব request authentication করে। Demo বা webhook test শেষ হলে এটি বন্ধ করুন। যে command দিয়ে এটি চালু করেছিলেন, তার শেষে off যোগ করে command-টি চালান।

উপরের command-এর আচরণের উৎস: Tailscale Serve এবং Funnel documentation ও CLI reference, tailscale.com/docs