SSD Nodes Learn 🎉 VPS $4.99/মাস থেকে
নির্দেশিকা Matt Connorদ্বারা Matt Connor · আপডেট করা হয়েছে 2026-08-08

নিজের VPS-এ NetBird VPN সার্ভার সেটআপ করার নিয়ম

নিজের VPS-এ NetBird VPN সার্ভার হোস্ট করার পূর্ণাঙ্গ গাইড। এতে DNS ও TLS কনফিগারেশন, কুইকস্টার্ট স্ক্রিপ্ট, সেটআপ কি এবং Headscale-এর সাথে বিস্তারিত তুলনামূলক আলোচনা রয়েছে।

NetBird VPN সার্ভার নিজে হোস্ট করলে আপনি যা পাবেন

NetBird VPN সার্ভার নিজে হোস্ট করলে এর কন্ট্রোল প্লেন আপনার নিজস্ব VPS-এ থাকে। এই অংশটি পিয়ার লিস্ট সংরক্ষণ করে, কোন মেশিন কোনটির সাথে যোগাযোগ করতে পারবে তা নির্ধারণ করে এবং NAT (network address translation)-এর পেছনে থাকা দুটি পিয়ারকে একে অপরের সাথে সংযুক্ত হতে সাহায্য করে। টানেলগুলো মূলত WireGuard-এর, যা সরাসরি আপনার মেশিনগুলোর মধ্যে এনক্রিপ্ট করা থাকে। এতে পরিবর্তন শুধু এটুকুই যে, কোনো বাইরের কোম্পানি আপনার ডিভাইসের তালিকা বা লগইন প্রবাহ নিয়ন্ত্রণ করে না।

NetBird এমন দুটি জিনিসের মাঝে অবস্থান করে যা আপনি হয়তো আগে থেকেই জানেন। এটি একটি মেশ ওভারলে (mesh overlay), তাই পিয়ারগুলো একটি গেটওয়ের মাধ্যমে সব ডেটা না পাঠিয়ে সরাসরি একে অপরের সাথে সংযুক্ত হয়। এটি সম্পূর্ণভাবে নিজে হোস্ট করা সম্ভব, যা একে Headscale, the self-hosted Tailscale control server-এর সমকক্ষ করে তোলে। আপনি যদি কেবল একটি সিঙ্গেল-গেটওয়ে টানেল ব্যবহার করে থাকেন, তবে আগে the difference between plain WireGuard and a mesh overlay পড়ে নিন, কারণ সেই ধারণাটিই এই পৃষ্ঠার বাকি অংশ বোঝার জন্য জরুরি।

যদি আপনার উদ্দেশ্য এমন একটি সার্ভার তৈরি করা হয় যেখান দিয়ে আপনার সমস্ত ট্রাফিক বের হবে, তবে মেশ নেটওয়ার্ক আপনার প্রয়োজনের তুলনায় অনেক বেশি জটিল। A plain WireGuard VPN on a single VPS অথবা a Tailscale exit node অনেক কম পরিশ্রমে সেই কাজটি সম্পন্ন করতে পারে।

স্ট্যাকটি আসলে যেভাবে চলে

লেআউটটি সম্প্রতি পরিবর্তিত হয়েছে এবং অধিকাংশ পুরনো নিবন্ধে পুরনো লেআউটের বর্ণনা দেওয়া আছে। আগস্ট 2026 অনুযায়ী, v0.76.2 রিলিজে, কুইকস্টার্ট স্ক্রিপ্টটি ডিফল্টভাবে তিনটি সার্ভিসসহ একটি Compose ফাইল তৈরি করে।

  • netbird-server ম্যানেজমেন্ট API, সিগন্যাল সার্ভিস, এমবেডেড STUN লিসেনারসহ রিলে এবং একটি এমবেডেড আইডেন্টিটি প্রোভাইডার বহন করে। পুরনো রিলিজগুলোতে এগুলো আলাদা কন্টেইনার ছিল এবং আইডেন্টিটি প্রোভাইডার ছিল একটি আলাদা Zitadel ইনস্টলেশন, যা আপনাকে আগে বিল্ড করতে হতো।
  • dashboard হলো অ্যাডমিন ওয়েব কনসোল।
  • traefik TLS (ট্রান্সপোর্ট লেয়ার সিকিউরিটি) টার্মিনেট করে এবং প্রথমবার চালু করার সময় Let's Encrypt থেকে একটি সার্টিফিকেট অনুরোধ করে।

আরও দুটি সার্ভিস বিদ্যমান থাকে এবং প্রম্পটে হ্যাঁ না বলা পর্যন্ত সেগুলো বন্ধ থাকে। NetBird Proxy সার্ভিসটি অভ্যন্তরীণ সার্ভিসগুলোকে পাবলিক হোস্টনামে প্রকাশ করে। CrowdSec ক্ষতিকারক ট্রাফিক ফিল্টার করে। একটি কার্যকরী মেশ তৈরি করার জন্য এগুলোর কোনোটিই প্রয়োজন নেই এবং উভয়ই ছোট সার্ভারে মেমরি খরচ করে।

আপনি যদি একটি সিঙ্গেল Docker কন্টেইনারে wg-easy থেকে এসে থাকেন, তবে এটি পার্টস বা উপাদানের সংখ্যার দিক থেকে একটি বড় পরিবর্তন। এর বিনিময়ে আপনি অ্যাক্সেস পলিসি, প্রতি-ব্যবহারকারী অ্যাকাউন্ট এবং এমন পিয়ার পাচ্ছেন যা একটি গেটওয়ের মাধ্যমে না গিয়ে সরাসরি একে অপরের সাথে সংযুক্ত হয়।

শুরু করার আগে আপনার যা প্রয়োজন

একটি পাবলিক ডোমেইন নাম থাকা বাধ্যতামূলক। ড্যাশবোর্ড, API এবং রিলে—সবই পোর্ট 443-এ HTTPS ব্যবহার করে। Traefik, Let's Encrypt থেকে HTTP চ্যালেঞ্জের মাধ্যমে সার্টিফিকেট সংগ্রহ করে, যার জন্য এমন একটি ডোমেইন নাম প্রয়োজন যা পাবলিক ইন্টারনেট থেকে আপনার VPS-এর আইপি ঠিকানায় রিজলভ হয়। শুধুমাত্র একটি আইপি অ্যাড্রেস এই প্রক্রিয়ায় কাজ করবে না।

একটি A রেকর্ড তৈরি করুন, netbird.example.com যা আপনার VPS-এর পাবলিক IPv4 ঠিকানাকে নির্দেশ করবে এবং কোনো কিছু রান করার আগে DNS প্রপাগেশনের জন্য অপেক্ষা করুন।

dig +short netbird.example.com

এটি আপনার সার্ভারের ঠিকানা প্রদর্শন করবে। DNS প্রপাগেশনের আগেই ইন্সটলার রান করলে প্রথমবারই সার্টিফিকেট রিকোয়েস্ট ব্যর্থ হবে। বারবার ব্যর্থ ভ্যালিডেশনের ফলে Let's Encrypt রেট লিমিট কার্যকর হয়ে যাবে, যার ফলে আপনাকে পুনরায় চেষ্টা করার জন্য এক ঘণ্টা অপেক্ষা করতে হবে।

ইন্টারনেট থেকে তিনটি পোর্ট অবশ্যই অ্যাক্সেসযোগ্য হতে হবে: সার্টিফিকেট চ্যালেঞ্জ এবং HTTPS-এ রিডাইরেক্টের জন্য TCP 80, ড্যাশবোর্ড, API, সিগন্যাল এবং রিলে ট্রাফিকের জন্য TCP 443, এবং STUN-এর জন্য UDP 3478।

sudo ufw allow 80/tcp
sudo ufw allow 443/tcp
sudo ufw allow 3478/udp
sudo ufw reload
sudo ufw status

আপনার প্রোভাইডারের নেটওয়ার্ক ফায়ারওয়ালেও এই পোর্টগুলো খুলে দিন। বেশিরভাগ VPS প্যানেলে এটি একটি আলাদা কন্ট্রোল হিসেবে থাকে। অনেক সময় সার্ভারের নিজস্ব ufw status কনফিগারেশন সঠিক থাকা সত্ত্বেও এই ফায়ারওয়াল সেটিংসের কারণে কানেকশন রিফিউজ হয়।

STUN (session traversal utilities for NAT) হলো এমন একটি পদ্ধতি যার মাধ্যমে একটি পিয়ার জানতে পারে তার নিজস্ব NAT তাকে কোন পাবলিক অ্যাড্রেস এবং পোর্ট বরাদ্দ করেছে, যাতে দুটি পিয়ার সরাসরি টানেল তৈরি করতে পারে। UDP 3478 ব্লক করা থাকলে পিয়াররা TCP 443-এর মাধ্যমে রিলে ব্যবহার করে কানেক্ট হবে, তাই আপাতদৃষ্টিতে কোনো সমস্যা মনে হবে না। কিন্তু এর ফলে প্রতিটি পিয়ারে Connection type: Relayed দেখা যাবে এবং সমস্ত ট্রাফিক পিয়ার-টু-পিয়ার না হয়ে আপনার VPS-এর মধ্য দিয়ে যাবে।

সফটওয়্যার সাইডে আপনার প্রয়োজন Docker এবং এর সাথে Compose v2 প্লাগইন, এছাড়া jq এবং curl। স্ক্রিপ্টটি এই সবগুলোর উপস্থিতি পরীক্ষা করে এবং কোনো একটি অনুপস্থিত থাকলে কাজ বন্ধ করে দেয়। যদি এই বক্সে Docker নতুন হয়, তবে প্রথমে VPS-এ Docker Compose সেটআপ সম্পন্ন করুন।

যদি আপনি বিল্ট-ইন রিভার্স প্রক্সি ব্যবহার না করেন তবে প্রয়োজনীয় পোর্টসমূহ

Traefik ছাড়া রান করার অর্থ হলো প্রতিটি সার্ভিস সরাসরি এক্সপোজ করা, সেক্ষেত্রে পোর্টের তালিকা বড় হয়ে যায়:

  • TCP 80, HTTP রিডাইরেক্টের জন্য
  • TCP 443, HTTPS-এর জন্য
  • TCP 33073, ম্যানেজমেন্ট gRPC-এর জন্য
  • TCP 10000, সিগন্যাল gRPC-এর জন্য
  • TCP 33080, WebSocket বা QUIC-এর মাধ্যমে রিলে করার জন্য
  • UDP 3478, STUN-এর জন্য

এটি কেবল তখনই বেছে নিন যদি আপনার সার্ভারে অন্য কোনো কারণে আগে থেকেই TLS টার্মিনেশন করা থাকে। অন্যথায়, বিল্ট-ইন Traefik ব্যবহার করা সহজ এবং এতে ভুল হওয়ার সম্ভাবনা কম।

Quickstart script ব্যবহার করে NetBird সার্ভার ইনস্টল করা

নথিবদ্ধ one-liner কমান্ডটি সরাসরি নতুন release-কে শেল-এ পাইপ করে:

curl -fsSL https://github.com/netbirdio/netbird/releases/latest/download/getting-started.sh | bash

এর পরিবর্তে নির্দিষ্ট ভার্সন ব্যবহার করুন (Pin it)। latest পরিবর্তিত হয়, তাই দুই সপ্তাহ ব্যবধানে একই কমান্ড চালালে দুটি ভিন্ন ইনস্টল তৈরি হবে এবং ডিস্কে কোনো রেকর্ড থাকবে না যে কোনটি আপনার কনফিগারেশন লিখেছে। একটি tagged release ডাউনলোড করুন, সেটি পড়ুন, তারপর চালান।

mkdir -p ~/netbird
cd ~/netbird
curl -fsSL -o getting-started.sh \
  https://github.com/netbirdio/netbird/releases/download/v0.76.2/getting-started.sh
less getting-started.sh
bash getting-started.sh

স্ক্রিপ্টটি প্রথমে ডোমেইন জানতে চাইবে:

Enter the domain you want to use for NetBird (e.g. netbird.my-domain.com):

তারপর এটি জানতে চাইবে TLS কীভাবে হ্যান্ডেল করা হবে:

Which reverse proxy will you use?
  [0] Traefik (recommended - automatic TLS, included in Docker Compose)
  [1] Existing Traefik (labels for external Traefik instance)
  [2] Nginx (generates config template)
  [3] Nginx Proxy Manager (generates config + instructions)
  [4] External Caddy (generates Caddyfile snippet)
  [5] Other/Manual (displays setup documentation)
Enter choice [0-5] (default: 0):

[0] বেছে নিন। 2 থেকে 5 নম্বর অপশনগুলো একটি কনফিগারেশন স্নিপেট লিখে রাখে এবং বাকি কাজ আপনার ওপর ছেড়ে দেয়; এটি এমন সার্ভারের জন্য সঠিক যেখানে আগে থেকেই প্রক্সি চলছে, কিন্তু নতুন সার্ভারের জন্য এটি ভুল। 0 নম্বর অপশনটি Let's Encrypt ইমেইল অ্যাড্রেস জানতে চাইবে, যা এক্সপায়ারি নোটিশের জন্য ব্যবহৃত হয়।

প্রথমবার ইনস্টলের সময় NetBird Proxy সার্ভিসটি না করার পরামর্শ দেওয়া হলো। এটি আরও দুটি DNS রেকর্ড চায়, proxy.netbird.example.com এবং ওয়াইল্ডকার্ড *.proxy.netbird.example.com, এবং সাধারণ মেশের জন্য এটি কোনো কাজ করে না। CrowdSec-এর ক্ষেত্রেও না বলুন। উভয়ই পরবর্তীতে যোগ করা সম্ভব।

স্ক্রিপ্টটি বর্তমান ডিরেক্টরিতে ফাইল লেখে: docker-compose.yml, config.yaml (600 মোডে), dashboard.env, এবং আপনি যদি bundled Traefik বেছে নেন তবে traefik-dynamic.yaml। এই ডিরেক্টরিটিকে আপনার সংরক্ষিত স্টেট হিসেবে গণ্য করুন, কারণ config.yaml সেই কি (key) ধারণ করে যা স্টোরের ডেটা এনক্রিপ্ট করে। এটি হারিয়ে গেলে পুনরায় ইনস্টল করেও সমাধান করা সম্ভব নয়।

docker compose ps
docker compose logs -f netbird-server

প্রতিটি সার্ভিসের running পড়া উচিত এবং সার্ভার লগ লুপে রিস্টার্ট না হয়ে স্থিতিশীল হওয়া উচিত। সার্টিফিকেট আলাদাভাবে পর্যবেক্ষণ করুন:

docker compose logs traefik | grep -i acme

ACME (automatic certificate management environment) হলো সেই প্রোটোকল যা Traefik সার্টিফিকেট পাওয়ার জন্য ব্যবহার করে। এখানে ত্রুটি হওয়ার মানে প্রায় সবসময়ই DNS সমস্যা অথবা 80 নম্বর পোর্ট বন্ধ থাকা।

প্রথম অ্যাডমিন অ্যাকাউন্ট তৈরি করা

https://netbird.example.com খুলুন। নতুন ইনস্টলেশনের ক্ষেত্রে এটি লগইন ফর্মের পরিবর্তে একটি সেটআপ পেজে নিয়ে যাবে। একটি ইমেইল ঠিকানা, নাম এবং পাসওয়ার্ড দিন, তারপর Create Account-এ ক্লিক করুন। এটিই প্রথম অ্যাডমিন অ্যাকাউন্ট হিসেবে গণ্য হবে এবং পেজটি আপনাকে লগইন ফর্মে রিডাইরেক্ট করবে।

এই অ্যাকাউন্টটি NetBird-এর নিজস্ব ইউজার স্টোরে থাকে, যা netbird-server কন্টেইনারের ভেতরে থাকা একটি identity provider দ্বারা পরিচালিত হয়। এতে বাইরের কোনো কিছুর প্রয়োজন হয় না। এক বছর আগের self-hosted NetBird-এর তুলনায় এটি সবচেয়ে বড় পরিবর্তন; তখন একটি কার্যকর ইনস্টলেশনের জন্য প্রথমে Zitadel বা Keycloak সেটআপ করতে হতো এবং কোনো কিছু শুরু করার আগেই চারটি OIDC (OpenID Connect) ভ্যালু setup.env-এ কপি করতে হতো।

যদি সেটআপ পেজের পরিবর্তে ব্রাউজারে সার্টিফিকেট ওয়ার্নিং দেখেন, তবে বুঝতে হবে সার্টিফিকেট ইস্যু হয়নি। পরবর্তী ধাপে যাওয়ার আগে এটি ঠিক করুন, কারণ ড্যাশবোর্ড একই হোস্টনামের মাধ্যমে API-এর সাথে যোগাযোগ করে এবং ভুল সার্টিফিকেটের কারণে বিভিন্ন বিভ্রান্তিকর ত্রুটি দেখা দেয়।

আপনার প্রথম পিয়ার যুক্ত করুন

যেকোনো Linux মেশিনে ক্লায়েন্ট ইনস্টল করুন, এমনকি আপনি যদি এটিকে মেশের (mesh) অন্তর্ভুক্ত করতে চান তবে VPS-এও এটি ইনস্টল করতে পারেন:

curl -fsSL https://pkgs.netbird.io/install.sh | sh

Debian এবং Ubuntu-তে এই স্ক্রিপ্টটি NetBird-এর প্যাকেজ রিপোজিটরি কনফিগার করে এবং তারপর apt-এর মাধ্যমে ক্লায়েন্ট ইনস্টল করে, তাই প্যাকেজ ম্যানেজারই এর মালিকানা বজায় রাখে। যদি কোনো স্ক্রিপ্ট সরাসরি শেল-এ পাইপ করা আপনার কাছে নিরাপদ মনে না হয়, তবে প্রথমে এটিকে curl -fsSL -o install.sh https://pkgs.netbird.io/install.sh দিয়ে সেভ করুন এবং sh install.sh দিয়ে চালানোর আগে তা পড়ে দেখুন। যেভাবেই হোক, কী ইনস্টল হয়েছে তা নিশ্চিত করুন:

apt-cache policy netbird

netbird হলো কমান্ড লাইন ক্লায়েন্ট এবং ডেমন। netbird-ui হলো ডেস্কটপ ট্রে অ্যাপ, এবং হেডলেস সার্ভারে এর কোনো প্রয়োজন নেই।

এখন ক্লায়েন্টকে আপনার সার্ভারের দিকে নির্দেশ করুন:

sudo netbird up --management-url https://netbird.example.com

--management-url বাদ দিলে ক্লায়েন্ট NetBird-এর হোস্ট করা সার্ভিসের সাথে রেজিস্টার হবে, কারণ এটিই কম্পাইল-ইন ডিফল্ট। কমান্ডটি সফল হবে, মেশিনটি একটি অ্যাড্রেস পাবে, কিন্তু আপনার সেলফ-হোস্টেড ড্যাশবোর্ড খালিই থেকে যাবে। এটি প্রায় সবার ক্ষেত্রেই একবার ঘটে।

কমান্ডটি লগইন সম্পন্ন করার জন্য ব্রাউজারে খোলার মতো একটি URL প্রদর্শন করবে। এরপর:

netbird status
ip addr show wt0

netbird status থেকে চারটি লাইন পড়ুন: Management: Connected, Signal: Connected, প্রতিটি উপলব্ধ রিলে রিপোর্ট করা একটি Relays: লাইন, এবং ওভারলে রেঞ্জের মধ্যে একটি NetBird IP:wt0 হলো WireGuard ইন্টারফেস যা NetBird তৈরি করে, এবং এতে একই অ্যাড্রেস থাকা উচিত।

একটি দ্বিতীয় মেশিনকে setup key ব্যবহার করে স্বয়ংক্রিয়ভাবে যুক্ত করা

যেসব মেশিনে ব্রাউজার নেই এবং সামনে কেউ নেই, সেগুলোতে ব্রাউজার-ভিত্তিক লগইন কাজ করে না। একটি setup key হলো প্রি-অথেনটিকেশন টোকেন, যা কোনো ইন্টারঅ্যাক্টিভ ধাপ ছাড়াই মেশিনকে রেজিস্টার করে। ড্যাশবোর্ডের Setup Keys সেকশন থেকে এটি তৈরি করুন।

এর দুই ধরনের ধরন রয়েছে। একটি one-off key ঠিক একটি মেশিনকে অথেনটিকেশন করে এবং এরপর সেটি অকার্যকর হয়ে যায়। একটি reusable key অনেকগুলো মেশিন রেজিস্টার করতে পারে, যেখানে সর্বোচ্চ কতগুলো মেশিন যুক্ত হবে তার একটি ঐচ্ছিক সীমা নির্ধারণ করা যায়। উভয় ধরনের কি-এর জন্যই একটি মেয়াদ (expiry) থাকে এবং উভয়ই নতুন পিয়ারকে (peer) স্বয়ংক্রিয়ভাবে একটি গ্রুপে যুক্ত করতে পারে, যাতে মেশিনটি যুক্ত হওয়ার সাথে সাথেই সেই গ্রুপের অ্যাক্সেস রুলগুলো কার্যকর হয়।

sudo netbird up --setup-key <SETUP-KEY> \
  --management-url https://netbird.example.com \
  --hostname build-runner-01

--hostname ড্যাশবোর্ডে প্রদর্শিত নাম নির্ধারণ করে। এটি ছাড়া পিয়ারটি মেশিনের নিজস্ব নাম গ্রহণ করে, এবং সব এন্ট্রির নাম ubuntu হলে তা কোনো কাজে আসে না।

কন্টেইনার এবং স্বল্পস্থায়ী বিল্ড এজেন্টের ক্ষেত্রে, কি তৈরি করার সময় সেটিকে ephemeral হিসেবে চিহ্নিত করুন। ephemeral key দিয়ে রেজিস্টার করা পিয়ারগুলো 10 মিনিটের বেশি অফলাইন থাকলে স্বয়ংক্রিয়ভাবে মুছে যায়, যা পিয়ার লিস্টকে অপ্রয়োজনীয় এন্ট্রি থেকে মুক্ত রাখে।

setup key ব্যবহারের পরিকল্পনা করার আগে একটি সীমাবদ্ধতা জেনে রাখা জরুরি: কোনো কি-এর মেয়াদ শেষ হলে বা মুছে ফেললে নতুন রেজিস্ট্রেশন বন্ধ হয়ে যায়, কিন্তু এর মাধ্যমে আগে থেকে রেজিস্টার করা মেশিনগুলোর সংযোগ বিচ্ছিন্ন হয় না। কোনো মেশিনের অ্যাক্সেস বন্ধ করার অর্থ হলো সেই পিয়ারটিকে মুছে ফেলা।

আপনার কি এখনও আলাদা কোনো identity provider প্রয়োজন?

ছোট কোনো ইনস্টলেশনের ক্ষেত্রে, না। ড্যাশবোর্ড থেকে তৈরি করা অ্যাকাউন্টগুলো সামলানোর জন্য বিল্ট-ইন user store-ই যথেষ্ট, যা অল্প সংখ্যক ব্যবহারকারীর জন্য কাজ করে।

আপনার যদি আগে থেকেই কোনো identity provider থাকে এবং আপনি ব্যবহারকারীদের দ্বিতীয় কোনো তালিকা তৈরি করতে না চান, তবেই আপনার একটি external identity provider প্রয়োজন। NetBird এমন যেকোনো provider গ্রহণ করে যা OIDC সমর্থন করে। আপনার provider-এ একটি confidential OIDC client রেজিস্টার করুন, তারপর NetBird ড্যাশবোর্ডে চারটি মান যোগ করুন: name, client ID, client secret এবং issuer। NetBird আপনাকে একটি redirect URL দেবে যা আপনার provider-এ পেস্ট করতে হবে। Google, Microsoft Entra ID, Okta, Zitadel, Keycloak, Authentik এবং Pocket ID-এর জন্য নির্দিষ্ট ইন্টিগ্রেশন রয়েছে, আর বাকি সব generic OIDC হিসেবে যোগ করা যায়। আপনি যদি আগে থেকেই Authentik-কে আপনার self-hosted single sign-on হিসেবে ব্যবহার করেন, তবে এটিই সেই উপায় যার মাধ্যমে আপনি দুটি আলাদা তালিকার পরিবর্তে একটি অ্যাকাউন্ট তালিকা বজায় রাখতে পারবেন।

একটি provider যোগ করার পরেও local login সুবিধা চালু থাকে এবং কনফিগার করা প্রতিটি provider লগইন পেজে দেখা যায়। একটি শক্তিশালী পাসওয়ার্ডসহ অন্তত একটি local admin অ্যাকাউন্ট রাখুন। এতে OIDC কনফিগারেশনে কোনো সমস্যা হলেও আপনি সিস্টেমে প্রবেশ করতে পারবেন।

NetBird নাকি Headscale: কোন কন্ট্রোল প্লেনটি আপনার চালানো উচিত?

উভয়ই একই নির্ভরতা দূর করে, অর্থাৎ সেই হোস্ট করা কন্ট্রোল সার্ভার যার সাথে আপনার ক্লায়েন্টরা অন্যথায় যোগাযোগ করত। এগুলো একই ধরনের প্রজেক্ট নয়।

Headscale হলো Tailscale কন্ট্রোল সার্ভারের একটি পুনঃবাস্তবায়ন, এবং আপনি অফিসিয়াল Tailscale ক্লায়েন্টগুলোই ব্যবহার করতে থাকেন। এর কোনো অফিসিয়াল ওয়েব কনসোল নেই। আপনি একটি কনফিগারেশন ফাইলের বিপরীতে headscale কমান্ড ব্যবহার করে ব্যবহারকারী এবং প্রি-অথেন্টিকেশন কি (pre-authentication keys) পরিচালনা করেন। কমিউনিটি ওয়েব ইন্টারফেস থাকলেও সেগুলো এই প্রজেক্টের অংশ নয়। যারা তাদের স্টেট ফাইলে রাখতে এবং পরিবর্তনগুলো ভার্সন কন্ট্রোলে রাখতে চান, তাদের জন্য এটি উপযুক্ত।

NetBird পুরো পণ্যটিই সরবরাহ করে: এর নিজস্ব ক্লায়েন্ট, নিজস্ব ড্যাশবোর্ড, একটি এমবেডেড আইডেন্টিটি প্রোভাইডার এবং ব্রাউজারে এডিট করা যায় এমন অ্যাক্সেস পলিসি। আপনার VPS-এ এর অনেকগুলো অংশ কাজ করে, তবে এমন কোনো সহকর্মীর কাছে এটি হস্তান্তর করা অনেক সহজ, যিনি কখনোই টার্মিনাল খুলবেন না।

আপনি যদি ইতিমধ্যে Tailscale ক্লায়েন্টে অভ্যস্ত হন অথবা সবচেয়ে ছোট কন্ট্রোল প্লেন চান, তবে Headscale ব্যবহার করুন। যদি একাধিক ব্যক্তির পিয়ার পরিচালনা করার প্রয়োজন হয় এবং আপনি কোনো কিছু আলাদাভাবে তৈরি না করেই একটি কনসোল ও SSO চান, তবে NetBird ব্যবহার করুন।

এই কাজের জন্য সর্বনিম্ন কত ছোট VPS ব্যবহার করা যাবে?

ডকুমেন্টেশন অনুযায়ী সর্বনিম্ন 1টি CPU এবং 2 GB মেমোরি প্রয়োজন। NetBird-এর নিজস্ব নোট অনুযায়ী, বর্তমানে ইউজার ম্যানেজমেন্ট লোকাল হওয়ায় 1 GB RAM-এই এটি চালানো সম্ভব। আগে Zitadel-এর সম্পূর্ণ ডিপ্লয়মেন্টের জন্য 2 GB থেকে 4 GB RAM লাগত। 2 GB RAM-এর VPS কেনাই ভালো। অতিরিক্ত মেমোরি থাকলে আপগ্রেডের সময় পুরনো ইমেজগুলো ডিস্কে থাকা অবস্থাতেই নতুন ইমেজ ডাউনলোড করা সহজ হয়।

ছোট সার্ভারে তিনটি জিনিস বাদ দেওয়া নিরাপদ। NetBird Proxy সার্ভিসটি বাদ দিতে পারেন; এটি ইন্টারনাল সার্ভিসকে পাবলিক হোস্টনামে প্রকাশ করার জন্য ব্যবহৃত হয় এবং পিয়ার কানেকশনের সাথে এর কোনো সম্পর্ক নেই। CrowdSec বাদ দিতে পারেন, এটি প্রথম দিনেই না লাগিয়ে পরে প্রয়োজন অনুযায়ী যোগ করা যাবে। ডিফল্ট SQLite স্টোর netbird_data ভলিউমেই রাখুন। PostgreSQL-এ তখনই যান যখন আপনি ডিপ্লয়মেন্ট একাধিক মেশিনে ভাগ করবেন অথবা অনেক বেশি কনকারেন্সি (concurrency) প্রয়োজন হবে; এটি পরবর্তীতে মাইগ্রেশন করার সুযোগ রয়েছে।

Relay এমন একটি কম্পোনেন্ট যা আপনি বাদ দিতে পারবেন না। দুটি পিয়ারের NAT যদি প্রতিটি গন্তব্যের জন্য আলাদা পোর্ট বরাদ্দ করে, তবে তাদের মধ্যে সরাসরি টানেল তৈরি হবে না। সেক্ষেত্রে Relay-ই একমাত্র উপায় যা তাদের কানেক্ট করতে সাহায্য করে। এটি বন্ধ করলে মেমোরি খুব সামান্যই সাশ্রয় হয়, কিন্তু কানেকশন এমনভাবে ভেঙে যায় যা খুঁজে বের করা কঠিন।

যখন একটি সার্ভারে আর কুলাবে না, তখন Relay-কে সবার আগে অন্য মেশিনে সরিয়ে নিন। একটি স্ট্যান্ডঅ্যালোন Relay চালাতে NB_LISTEN_ADDRESS, NB_EXPOSED_ADDRESS, NB_AUTH_SECRET এবং NB_ENABLE_STUN প্রয়োজন হয়। Relay এবং মেইন সার্ভারে শেয়ারড সিক্রেট (shared secret) অবশ্যই একই হতে হবে, অন্যথায় ক্লায়েন্টরা অথেন্টিকেট করতে ব্যর্থ হবে।

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

ড্যাশবোর্ডে একটি সার্টিফিকেট সতর্কবার্তা দেখাচ্ছে। Traefik সার্টিফিকেট সংগ্রহ করতে পারেনি। docker compose logs traefik | grep -i acme চালান। এর দুটি কারণ থাকতে পারে। হয় dig +short netbird.example.com এখনও এই VPS-কে নির্দেশ করছে না, অথবা Let's Encrypt এবং কন্টেইনারের মধ্যবর্তী কোনো স্থানে TCP 80 পোর্ট বন্ধ আছে। এটি সাধারণত ufw-এর নিজস্ব ফায়ারওয়ালের পরিবর্তে প্রোভাইডারের নেটওয়ার্ক ফায়ারওয়ালে ঘটে। পুনরায় চেষ্টা করার আগে কারণটি সমাধান করুন, কারণ ব্যর্থ ভ্যালিডেশনের ক্ষেত্রে রেট লিমিট থাকে এবং আপনি এক ঘণ্টার জন্য পুনরায় চেষ্টার সুযোগ হারাবেন।

ক্লায়েন্ট বলছে এটি সংযুক্ত হয়েছে কিন্তু ড্যাশবোর্ড খালি দেখাচ্ছে। ক্লায়েন্ট NetBird-এর হোস্ট করা সার্ভিসের সাথে নিবন্ধিত হয়েছে, কারণ --management-url অনুপস্থিত ছিল। netbird status --detail চালান এবং Management: লাইনটি পড়ুন, যেখানে সার্ভারের নাম উল্লেখ থাকে যার সাথে এটি বর্তমানে যোগাযোগ করছে। Management: Connected to https://api.netbird.io:443 দেখার অর্থ হলো এটি ক্লাউডে সংযুক্ত হয়েছে। sudo netbird down চালান, তারপর পুনরায় sudo netbird up --management-url https://netbird.example.com করুন।

প্রতিটি পিয়ার Connection type: Relayed দেখাচ্ছে। কোনো সরাসরি টানেল তৈরি হচ্ছে না, তাই সমস্ত ট্রাফিক আপনার VPS হয়ে যাচ্ছে এবং ল্যাটেন্সি বৃদ্ধি পাচ্ছে। VPS ফায়ারওয়াল এবং প্রোভাইডার ফায়ারওয়ালে UDP 3478 পোর্টটি পরীক্ষা করুন, কারণ STUN-এর মাধ্যমেই একটি পিয়ার তার নিজস্ব পাবলিক অ্যাড্রেস এবং পোর্ট জানতে পারে। netbird status --detail কমান্ডটি Direct: false এবং প্রতিটি পিয়ারের জন্য ICE (interactive connectivity establishment) ক্যান্ডিডেট টাইপ প্রদর্শন করে, যা থেকে বোঝা যায় সংযোগের চেষ্টা কতদূর এগিয়েছে। কিছু নেটওয়ার্কে শুধুমাত্র relayed সংযোগ সম্ভব এবং সেক্ষেত্রে কোনো সমস্যা নেই।

একটি পিয়ার যুক্ত হয়েছে কিন্তু কোনো কিছুতে পৌঁছাতে পারছে না। মেশ নেটওয়ার্কে থাকলেই দুটি পিয়ার একে অপরের সাথে কথা বলতে পারবে এমন কোনো নিশ্চয়তা নেই। অ্যাক্সেস পলিসি এটি নির্ধারণ করে, এবং কোনো পলিসি যুক্ত না থাকলে একটি গ্রুপ কোনো কিছুতেই পৌঁছাতে পারে না। রাউট এবং ফায়ারওয়াল ডিবাগ করার আগে ড্যাশবোর্ডে পলিসিটি পরীক্ষা করুন।

netbird status একটি ডেমোন সমস্যার রিপোর্ট করছে। সার্ভিসটি চলছে না। sudo netbird service status এবং sudo netbird service start ব্যবহার করুন। ক্লায়েন্ট লগ /var/log/netbird/client.log-এ থাকে। যদি কোনো সমস্যা চিহ্নিত করতে না পারেন, তবে netbird debug bundle --anonymize --system-info ব্যবহার করুন; এটি লগ, স্ট্যাটাস, রাউট, DNS সেটিংস এবং ফায়ারওয়ালের অবস্থাকে একটি আর্কাইভে সংগ্রহ করে।

ব্যাকআপ এবং আপগ্রেড

পুরো ইন্সটলেশনটি দুটি জিনিসের ওপর নির্ভর করে: যে ডিরেক্টরিতে docker-compose.yml এবং config.yaml থাকে, এবং যে Docker volume-এ ডাটাবেস ও এনক্রিপশন কি (encryption keys) থাকে। এই দুটি একসাথে ব্যাকআপ নিন। config.yaml-এ সেই কি থাকে যা স্টোরের ডাটা এনক্রিপ্ট করে, তাই এটি ছাড়া ডাটাবেসের কপি রিস্টোর করলে কোনো পাঠযোগ্য ডাটা পাওয়া যাবে না।

docker volume ls
docker compose down
sudo tar czf netbird-config.tgz -C ~ netbird
docker run --rm -v netbird_netbird_data:/data -v "$PWD":/backup \
  alpine tar czf /backup/netbird-data.tgz -C /data .
docker compose up -d

Compose ভলিউমের নামের শুরুতে প্রজেক্ট ডিরেক্টরির নাম যুক্ত করে, তাই যে ভলিউমটি netbird_data হিসেবে নথিবদ্ধ আছে তা সাধারণত netbird_netbird_data নামে দেখা যায়। প্রথমে docker volume ls চালান এবং এটি যে নাম দেখাবে তা ব্যবহার করুন, অন্যথায় উপরের docker run কমান্ডটি ব্যর্থ হবে এবং নীরবে একটি খালি ভলিউম তৈরি করে কিছুই আর্কাইভ করবে না। আর্কাইভগুলো VPS-এর বাইরে রাখুন। আপনার যদি আগে থেকেই কোনো ব্যাকআপ টুল থাকে, তবে restic বা BorgBackup অফসাইট ব্যাকআপের কাজটি সামলাতে পারে।

সার্ভার আপগ্রেড করার প্রক্রিয়া হলো ইমেজ পুল করা এবং কন্টেইনার পুনরায় তৈরি করা:

docker compose pull
docker compose up -d
docker compose ps

এর ওপর নির্ভর করার আগে docker compose config | grep image: চালান। latest লেখা যেকোনো ট্যাগ একটি নির্দিষ্ট ভার্সনের সাথে পিন (pin) করে রাখা উচিত, ঠিক যে কারণে আপনি ইন্সটল স্ক্রিপ্টটি পিন করেছিলেন: আপনি জানতে চান কী চলছে, এবং আপগ্রেড ঠিকমতো কাজ না করলে আগের ভার্সনে ফিরে যাওয়ার সুযোগ রাখতে চান। ক্লায়েন্টরা তাদের ইন্সটল করা প্যাকেজ ম্যানেজারের মাধ্যমেই আপগ্রেড হয়।

FAQ

NetBird সেলফ-হোস্ট করার জন্য কি আমার নিজস্ব identity provider প্রয়োজন?

না। বর্তমান রিলিজগুলোতে একটি বিল্ট-ইন ইউজার স্টোর অন্তর্ভুক্ত থাকে, তাই আপনি ব্রাউজারে https://netbird.example.com-এ প্রথম অ্যাডমিন অ্যাকাউন্ট তৈরি করতে পারেন এবং পরবর্তীতে ড্যাশবোর্ড থেকে ইউজার যোগ করতে পারেন। একটি এক্সটারনাল OIDC প্রোভাইডার ঐচ্ছিক এবং এটি চারটি ভ্যালু দিয়ে পরবর্তীতে যোগ করা যায়: নাম, client ID, client secret এবং issuer। যে গাইডগুলো আপনাকে NetBird-এর আগে Zitadel বা Keycloak ডেপ্লয় করতে বলে, সেগুলো এমন একটি সেটআপ বর্ণনা করে যা এখন আর প্রয়োজন নেই; সেগুলো অনুসরণ করলে আপনাকে বাড়তি একটি সার্ভিস চালাতে হবে।

আমার সব পিয়ার কেন Connection type: Relayed দেখাচ্ছে?

সরাসরি সংযোগ তৈরি হচ্ছে না, তাই ট্রাফিক আপনার VPS-এর রিলে হয়ে যাচ্ছে। এর সাধারণ কারণ হলো UDP 3478 পোর্টটি ব্লক থাকা, যা STUN পোর্ট হিসেবে পিয়াররা তাদের নিজস্ব পাবলিক অ্যাড্রেস এবং পোর্ট খুঁজে পেতে ব্যবহার করে। এটি আপনার VPS ফায়ারওয়াল এবং আপনার প্রোভাইডারের আলাদা নেটওয়ার্ক ফায়ারওয়ালে ওপেন করুন, তারপর পুনরায় netbird status --detail চালান এবং Direct: লাইনটি পড়ুন। এমন কোনো নেটওয়ার্কে যেখানে NAT প্রতি গন্তব্যের জন্য আলাদা পোর্ট বরাদ্দ করে, সেখানে রিলেড সংযোগই একমাত্র ফলাফল এবং এতে কোনো কনফিগারেশন ভুল নেই।

আমার ক্লায়েন্ট কানেক্ট হয়েছে কিন্তু ড্যাশবোর্ডে কোনো পিয়ার দেখাচ্ছে না। কী হয়েছে?

ক্লায়েন্টটি আপনার সার্ভারের পরিবর্তে NetBird-এর হোস্ট করা সার্ভারে রেজিস্টার হয়েছে, যা ঘটে যখন --management-url বাদ দেওয়া হয়। netbird status --detail কমান্ডটি Management: লাইনে কোন সার্ভারের সাথে যোগাযোগ করছে তা দেখায়, তাই https://api.netbird.io:443-এর মতো কোনো ভ্যালু থাকলে তা নিশ্চিত করে যে এটি ভুল সার্ভারে আছে। sudo netbird down চালান, তারপর sudo netbird up --management-url https://netbird.example.com চালান, তাহলেই পিয়ারটি আপনার ড্যাশবোর্ডে দেখা যাবে।

সেলফ-হোস্টেড NetBird কীভাবে Headscale থেকে আলাদা?

উভয়ই একটি হোস্ট করা কন্ট্রোল সার্ভারকে আপনার নিজের চালানো সার্ভার দিয়ে প্রতিস্থাপন করে। Headscale শুধুমাত্র একটি কন্ট্রোল প্লেন: আপনি এটি headscale কমান্ড এবং একটি কনফিগ ফাইলের মাধ্যমে ম্যানেজ করেন, এর কোনো অফিসিয়াল ওয়েব কনসোল নেই এবং এটি অফিসিয়াল Tailscale ক্লায়েন্ট ব্যবহার করে। NetBird তার নিজস্ব ক্লায়েন্ট, অ্যাডমিন ড্যাশবোর্ড এবং identity provider ইন্টিগ্রেশন একই প্যাকেজে প্রদান করে। Headscale চালানো সহজ এবং এটি ফাইল আকারে স্টেট সংরক্ষণ করে। NetBird এমন ব্যবহারকারীদের জন্য সহজ যারা টার্মিনাল ব্যবহার করতে চান না।

সেলফ-হোস্টেড NetBird সার্ভারের জন্য কেমন সাইজের VPS প্রয়োজন?

ডকুমেন্টেশনে সর্বনিম্ন 1টি CPU এবং 2 GB মেমরির কথা বলা হয়েছে, এবং 2 GB-ই কেনা উচিত। সাম্প্রতিক রিলিজগুলোতে ব্যবহারিক প্রয়োজনীয়তা 1 GB-এর কাছাকাছি নেমে এসেছে কারণ identity provider এখন আলাদা ডেপ্লয়মেন্টের পরিবর্তে এমবেডেড থাকে। ইন্সটলের সময় ঐচ্ছিক প্রক্সি এবং CrowdSec সার্ভিসগুলো এড়িয়ে চলুন এবং যতক্ষণ না আপনার সত্যিকার অর্থে PostgreSQL প্রয়োজন হচ্ছে, ততক্ষণ ডিফল্ট SQLite স্টোরেই থাকুন।