SSD Nodes Learn Hosting plans →
নির্দেশিকা Matt Connorদ্বারা Matt Connor · আপডেট করা হয়েছে 2026-08-28

কিভাবে নিজের VPS-এ WireGuard VPN সেটআপ করবেন

আপনার Linux VPS-এ WireGuard VPN কনফিগার করার সম্পূর্ণ গাইড। এখানে key generation, wg0.conf ফাইল তৈরি, IP forwarding, NAT রুল এবং হ্যান্ডশেক ফেইলিয়র সমাধানের বিস্তারিত নিয়ম দেওয়া হয়েছে।

আপনি যা তৈরি করছেন

আপনার নিজস্ব সার্ভারে একটি WireGuard VPN তৈরি করতে প্রায় চল্লিশ লাইনের কনফিগারেশন প্রয়োজন: একটি কি-পেয়ার (key pair), একটি ইন্টারফেস ফাইল, একটি sysctl, একটি NAT রুল এবং ফায়ারওয়ালে একটি পোর্ট খোলা। এর ইনস্টলেশন প্রক্রিয়া খুবই সহজ, তাই এই গাইডের বেশিরভাগ অংশ জুড়ে রয়েছে সম্ভাব্য সমস্যা, কি-এর পারমিশন (key permissions), AllowedIPs, ফরোয়ার্ডিং এবং DNS সংক্রান্ত বিষয়।

WireGuard হলো কার্নেল-লেভেলের একটি Layer 3 টানেল, যা Linux 5.6 ভার্সন থেকে মেইনলাইনে অন্তর্ভুক্ত রয়েছে। তাই Ubuntu 24.04 এবং Debian 13-এ এটি কোনো এক্সটার্নাল মডিউল ছাড়াই কাজ করে। এতে কোনো সাইফার নেগোসিয়েশন, সার্টিফিকেট অথরিটি বা ইউজারনেম/পাসওয়ার্ডের প্রয়োজন হয় না: প্রতিটি পিয়ার (peer) মূলত একটি পাবলিক কি এবং সেই কি-এর জন্য অনুমোদিত IP অ্যাড্রেসের সমষ্টি। কোনো প্যাকেটের MAC চেক ব্যর্থ হলে তা কোনো উত্তর ছাড়াই ড্রপ করা হয়, ফলে পোর্ট স্ক্যান করলে কোনো সাড়া পাওয়া যায় না। এর বিপরীত দিকটি হলো, এখানে কোনো কেন্দ্রীয় অথেন্টিকেশন সার্ভার নেই, তাই কারো অ্যাক্সেস বাতিল করতে হলে সার্ভার থেকে সেই পিয়ারকে মুছে ফেলতে হয়।

প্রথমে ভার্চুয়ালাইজেশন পরীক্ষা করুন

WireGuard-এর জন্য এমন একটি কার্নেল প্রয়োজন যাতে মডিউল লোড করা যায়; KVM VPS-এ এটি সরাসরি কাজ করে। যে সব কন্টেইনার ভার্চুয়ালাইজেশনে হোস্ট কার্নেল শেয়ার করা হয়, যেমন OpenVZ বা LXC, সেগুলোতে প্রথম কমান্ডটি RTNETLINK answers: Operation not supported এর কারণে ব্যর্থ হয় এবং সেক্ষেত্রে wireguard-go ইউজারস্পেস ইমপ্লিমেন্টেশন ব্যবহার করতে হয়। তাই প্রথমেই sudo modprobe wireguard && echo ok দিয়ে পরীক্ষা করে নিন।

কী ফাঁস না করে কি (key) তৈরি করুন

একটি সবার জন্য পাঠযোগ্য /etc/wireguard/server.key থাকা মানে কোনো VPN না থাকার সমান। সাধারণ umask 077 && wg genkey | sudo tee ... লাইনটি নির্ভরযোগ্য নয়, কারণ sudo ফাইল তৈরির সময় tee-এর ওপর নিজস্ব umask প্রয়োগ করে। তাই ফাইল মোড স্পষ্টভাবে সেট করুন।

sudo apt update && sudo apt install -y wireguard nftables
sudo install -d -m 700 /etc/wireguard
sudo sh -c 'umask 077; wg genkey > /etc/wireguard/server.key'
sudo sh -c 'wg pubkey < /etc/wireguard/server.key > /etc/wireguard/server.pub'
sudo chmod 600 /etc/wireguard/server.key

একইভাবে ক্লায়েন্ট পেয়ার (client pair) তৈরি করুন। wg genpsk একটি ঐচ্ছিক প্রি-শেয়ারড কি (pre-shared key) যোগ করে, যা প্রতিটি কনফিগারেশনে এক লাইনে থাকে।

সার্ভার ইন্টারফেস: /etc/wireguard/wg0.conf

[Interface]
Address = 10.8.0.1/24
ListenPort = 51820
PrivateKey = <contents of /etc/wireguard/server.key>

[Peer]
PublicKey = <laptop public key>
PresharedKey = <psk, optional>
AllowedIPs = 10.8.0.2/32

chmod 600 এটি; ফাইলটি যে সবার জন্য উন্মুক্ত (world accessible) তা নির্দেশকারী একটি স্টার্টআপ সতর্কবার্তা মানে আপনি সেটি এড়িয়ে গেছেন। Address হলো টানেলের ভেতরে সার্ভারের ঠিকানা, যা পুরো VPN সাবনেটের মাস্ক বহন করে। এমন একটি রেঞ্জ বেছে নিন যা আপনি বাস্তবে সচরাচর পাবেন না, 192.168.1.0/24 আপনার ক্লায়েন্টরা যে হোম রাউটারের পেছনে থাকে তার অর্ধেকটির সাথেই সংঘর্ষ তৈরি করবে এবং তখন টানেলটি কোনো বার্তা ছাড়াই লোকাল রুটের কাছে হেরে যাবে।

সার্ভার সাইডে একজন পিয়ারের AllowedIPs হলো একটি /32, যা সেই ক্লায়েন্টের মালিকানাধীন একমাত্র টানেল ঠিকানা। দুটি পিয়ারকে একই allowed IP দিলে সেটি সর্বশেষ কনফিগার করা পিয়ারের কাছে চলে যায় এবং প্রথমটির ট্রাফিক কোনো ত্রুটি বার্তা ছাড়াই আসা বন্ধ হয়ে যায়। SaveConfig আনসেট রাখুন, নতুবা wg-quick down লাইভ স্টেট থেকে এই ফাইলটি পুনরায় লিখে ফেলবে।

বক্সটিকে একটি রাউটারে রূপান্তর করুন

একটি Linux সার্ভার তার নিজের ঠিকানায় আসেনি এমন প্যাকেটগুলো ড্রপ করে। ডিফল্টভাবে forwarding এবং source NAT উভয়ই নিষ্ক্রিয় থাকে।

printf 'net.ipv4.ip_forward = 1\nnet.ipv6.conf.all.forwarding = 1\n' \
  | sudo tee /etc/sysctl.d/99-wireguard.conf
sudo sysctl --system
sysctl net.ipv4.ip_forward

একটি সাধারণ sysctl -w পরবর্তী রিবুট পর্যন্ত কাজ করে এবং তারপর নীরবে কাজ করা বন্ধ করে দেয়। NAT-এর জন্য egress ইন্টারফেস প্রয়োজন, অর্থাৎ যে NIC ইন্টারনেটে পৌঁছায়, wg0 নয়। eth0 ধরে নেবেন না; ip route show default থেকে আপনার ইন্টারফেসের নাম নিন, কারণ বর্তমান ইমেজগুলোতে enp1s0 বা ens3-এর মতো নাম ব্যবহার করা হয়।

ফায়ারওয়াল: পোর্ট এবং ফরওয়ার্ড পাথ

একটি nftables ফাইল ফিল্টার এবং NAT উভয়ই নিয়ন্ত্রণ করে। /etc/nftables.conf লিখলে তা বিদ্যমান রুলসেট মুছে ফেলে, তাই যদি সার্ভারটি ইতিমধ্যে ufw বা Docker দ্বারা পরিচালিত হয় তবে এটি এড়িয়ে চলুন।

#!/usr/sbin/nft -f
flush ruleset

table inet filter {
  chain input {
    type filter hook input priority filter; policy drop;
    ct state established,related accept
    iif lo accept
    tcp dport 22 accept
    udp dport 51820 accept
  }
  chain forward {
    type filter hook forward priority filter; policy drop;
    ct state established,related accept
    iifname "wg0" oifname "enp1s0" accept
  }
}

table ip nat {
  chain postrouting {
    type nat hook postrouting priority srcnat; policy accept;
    ip saddr 10.8.0.0/24 oifname "enp1s0" masquerade
  }
}

এটি প্রয়োগ করতে sudo systemctl enable --now nftables ব্যবহার করুন। এই সময়ে একটি দ্বিতীয় SSH সেশন খোলা রাখুন: policy drop এবং SSH রুলে কোনো টাইপো থাকলে আপনি নিজের সার্ভার থেকেই লক হয়ে যেতে পারেন। লক্ষ্য করুন যে ফরওয়ার্ড চেইন কী অনুমতি দেয় না, wg0 থেকে wg0 পর্যন্ত। পিয়াররা ইন্টারনেটে পৌঁছাতে পারে, কিন্তু একে অপরের সাথে নয়; পিয়ার-টু-পিয়ার VPN-এর জন্য iifname "wg0" oifname "wg0" accept যোগ করুন। একই চেইন নিয়ন্ত্রণ করে যে একজন পিয়ার সার্ভারের কোন অংশে প্রবেশ করতে পারবে, যা তখন গুরুত্বপূর্ণ হয়ে ওঠে যখন সার্ভারটি একই সাথে একটি tmux-এ Claude Code চালানো রিমোট ডেভেলপমেন্ট বক্স হিসেবে কাজ করে এবং আপনি সেই অংশটি প্রকাশ্যে উন্মুক্ত করতে চান না।

ufw ব্যবহারকারী বক্সে: ufw allow 51820/udp করুন, /etc/default/ufw ফাইলে DEFAULT_FORWARD_POLICY="ACCEPT" যোগ করুন এবং /etc/ufw/before.rules ফাইলের শুরুতে একটি *nat POSTROUTING MASQUERADE রুল যুক্ত করুন।

systemd-এর অধীনে এটি চালু করা

sudo systemctl enable --now wg-quick@wg0
sudo wg show

wg-quick ইন্টারফেস তৈরি করে, অ্যাড্রেস যোগ করে এবং AllowedIPs থেকে প্রাপ্ত রুটগুলো ইনস্টল করে। enable --now হলো গুরুত্বপূর্ণ অংশ: ম্যানুয়ালি চালানো wg-quick up wg0 রিবুট করার পর আর থাকে না, আর কার্নেল আপগ্রেডের জন্য রিবুট প্রয়োজন হয়। রিবুটের পর কোনো ইউনিট চালু হতে ব্যর্থ হলে তা নীরব থাকে যতক্ষণ না কেউ সংযোগ করার চেষ্টা করে। তাই wg-quick@wg0-এ একটি OnFailure= ড্রপ-ইন ফাইল তৈরি করে সেটিকে আপনার নিজস্ব ntfy সার্ভার-এর দিকে নির্দেশ করা হলো সবচেয়ে সাশ্রয়ী উপায়, যাতে কোনো ব্যবহারকারী লক-আউট হওয়ার আগেই আপনি আপনার ফোনে এ সম্পর্কে জানতে পারেন।

ক্লায়েন্ট কনফিগারেশন এবং যে সেটিংটি সবাই ভুল করে

[Interface]
PrivateKey = <laptop private key>
Address = 10.8.0.2/32
DNS = 10.8.0.1

[Peer]
PublicKey = <server public key>
Endpoint = vpn.example.com:51820
AllowedIPs = 0.0.0.0/0, ::/0
PersistentKeepalive = 25

AllowedIPs একই সাথে দুটি ভিন্ন কাজ করে এবং এই দুটিকে গুলিয়ে ফেলাই WireGuard নিয়ে অধিকাংশ বিভ্রান্তির মূল কারণ।

আউটবাউন্ডের ক্ষেত্রে এটি একটি রাউটিং টেবিল। যে প্যাকেটের গন্তব্য কোনো পিয়ারের AllowedIPs-এর সাথে মিলে যায়, সেটি এনক্রিপ্ট হয়ে সেই পিয়ারের কাছে পাঠানো হয়। 0.0.0.0/0, ::/0 সবকিছু টানেলের ভেতর দিয়ে পাঠায়, যা একটি ফুল টানেল এবং সার্ভারকে ডিফল্ট রুট হিসেবে ব্যবহার করে। স্প্লিট টানেল হলো একটি সীমিত তালিকা: AllowedIPs = 10.8.0.0/24, 10.20.0.0/16 ভিপিএন ট্র্যাফিকের পাশাপাশি সার্ভারের পেছনের একটি প্রাইভেট নেটওয়ার্ক বহন করে এবং বাকি সবকিছু তার নিজস্ব লোকাল রুট ব্যবহার করে। এই সীমিত তালিকাটিই আপনাকে সার্ভিসগুলোকে পাবলিক ইন্টারনেট থেকে সম্পূর্ণ দূরে রাখতে সাহায্য করে। যেমন, একটি VPS-এ থাকা প্রাইভেট Nextcloud ইনস্ট্যান্স যা টানেল অ্যাড্রেসে বাইন্ড করা, অথবা একই বক্সে চলা নেস্টেড-ভার্চুয়ালাইজেশন ল্যাব VM-গুলো শুধুমাত্র পিয়ারদের কাছে দৃশ্যমান থাকে এবং অন্য সবার কাছে অদৃশ্য থাকে।

ইনবাউন্ডের ক্ষেত্রে এটি একটি অ্যাক্সেস-কন্ট্রোল লিস্ট। কোনো পিয়ার থেকে আসা ডিক্রিপ্ট করা প্যাকেটের সোর্স অ্যাড্রেস যদি সেই পিয়ারের AllowedIPs-এর মধ্যে না থাকে, তবে সেটি ড্রপ করা হয়। এই কারণেই সার্ভার ল্যাপটপের জন্য 10.8.0.2/32 তালিকাভুক্ত করে: সেখানে 0.0.0.0/0 এন্ট্রি থাকলে ক্লায়েন্ট টানেলের যেকোনো অ্যাড্রেস স্পুফ (spoof) করতে পারত।

PersistentKeepalive মূলত NAT-এর পেছনে থাকা ক্লায়েন্টদের জন্য, যেখানে রাউটার শুধুমাত্র প্যাকেট চলাচলের সময় UDP ম্যাপিং খোলা রাখে। এটি মেয়াদোত্তীর্ণ হয়ে গেলে সার্ভার আর ক্লায়েন্টের সাথে যোগাযোগ করতে পারে না। PersistentKeepalive = 25 এই ম্যাপিং খোলা রাখে; এটি ক্লায়েন্টে সেট করুন, পাবলিক আইপি (public IP) থাকা কোনো সার্ভারে নয়।

DNS এবং যে লিকটি কেউ খেয়াল করে না

AllowedIPs = 0.0.0.0/0 এবং কোনো DNS = লাইন না থাকলে, ক্লায়েন্ট তার লোকাল নেটওয়ার্ক থেকে শেখা রিজলভারটিই ব্যবহার করতে থাকে, যা হলো 192.168.1.1-এ থাকা ক্যাফে রাউটার। এই রুটটি ডিফল্ট রুটের চেয়ে বেশি সুনির্দিষ্ট, তাই বাকি সবকিছু টানেলের ভেতর দিয়ে গেলেও DNS কুয়েরিগুলো লোকাল লিঙ্কের মাধ্যমে প্লেইনটেক্সটে বেরিয়ে যায়। ট্রাফিক ব্যক্তিগত হলেও, কোন কোন সাইটে ভিজিট করছেন তার তালিকাটি গোপন থাকে না।

দুটি সৎ উপায় আছে। DNS-কে একটি পাবলিক রিজলভারের (DNS = 9.9.9.9) দিকে নির্দেশ করুন, এতে কুয়েরিগুলো টানেলের ভেতর দিয়ে গিয়ে আপনার সার্ভার থেকে বের হবে, যদিও সেই রিজলভারটি তখনো আপনার কুয়েরিগুলো দেখতে পাবে। অথবা 10.8.0.1-তে unbound বা dnsmasq রান করুন, DNS = 10.8.0.1 সেট করুন এবং ইনপুট চেইনে udp dport 53 iifname "wg0" accept যোগ করুন। এরপর সেই লাইনটি সেট করে রিজলভারের কথা ভুলে যান, তখন আর কিছুই রিজলভ হবে না।

Linux ক্লায়েন্টে wg-quick, DNS থেকে resolvconf পর্যন্ত প্রয়োগ করে; যদি এটি অনুপস্থিত থাকে তবে আপনি resolvconf: command not found পাবেন। openresolv ইনস্টল করুন, অথবা systemd-resolved ক্লায়েন্টে PostUp = resolvectl dns %i 10.8.0.1 সেট করুন।

টানেল বিচ্ছিন্ন না করে পিয়ার যোগ এবং অপসারণ করা

ইন্টারফেস রিস্টার্ট করলে বর্তমানে সংযুক্ত থাকা সবাই বিচ্ছিন্ন হয়ে যায়। [Peer] ব্লকটিকে wg0.conf-এ যুক্ত করুন, তারপর পিয়ার সেটটিকে সরাসরি রিলোড করুন।

sudo bash -c 'wg syncconf wg0 <(wg-quick strip wg0)'

wg-quick strip কমান্ডটি Address, DNS, এবং PostUp-এর মতো wg-quick-only কি (key) ছাড়া কনফিগারেশন প্রিন্ট করে, এবং syncconf কমান্ডটি লাইভ সেশন বজায় রেখে পার্থক্যগুলো প্রয়োগ করে। এটি শুধুমাত্র পিয়ার আপডেট করে: পরিবর্তিত Address-এর ক্ষেত্রে এখনও সম্পূর্ণ down/up প্রক্রিয়ার প্রয়োজন হয়। sudo wg set wg0 peer <public key> remove ব্যবহার করে অ্যাক্সেস বাতিল করুন, তারপর ফাইল থেকে ব্লকটি মুছে ফেলুন, অন্যথায় পরবর্তী রিলোডের সময় এটি আবার ফিরে আসবে।

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

হ্যান্ডশেক সম্পন্ন হয় না। wg show-এ পিয়ারের তালিকা দেখা যায় কিন্তু কোনো latest handshake থাকে না, এবং ক্লায়েন্ট লগে নিচের বার্তাটি দেখায়:

Handshake for peer 1 (10.0.0.10:51820) did not complete after 5 seconds, retrying (try 2)

কোনো ডেটা আসছে না অথবা কোনো কিছু গৃহীত হচ্ছে না। ক্রমানুসারে পরীক্ষা করুন: VPS ফায়ারওয়াল এবং আপনার প্রোভাইডারের নেটওয়ার্ক ফায়ারওয়াল—যা বেশিরভাগ প্যানেলে আলাদা একটি নিয়ন্ত্রণ ব্যবস্থা—উভয় জায়গাতেই কি UDP 51820 খোলা আছে? Endpoint ঠিকানা এবং পোর্ট কি সঠিক? চাবিগুলো কি অদলবদল হয়েছে? ক্লায়েন্টের [Peer] ব্লকে অবশ্যই সার্ভারের পাবলিক চাবি থাকতে হবে এবং একইভাবে সার্ভারে ক্লায়েন্টের পাবলিক চাবি থাকতে হবে। ভুলবশত প্রাইভেট চাবি বা ক্লায়েন্টের নিজস্ব পাবলিক চাবি ব্যবহার করলে ঠিক এই সমস্যাটিই দেখা দেয়। সার্ভারে sudo tcpdump -ni any udp port 51820 চালিয়ে দেখুন আদৌ কোনো প্যাকেট পৌঁছাচ্ছে কি না। কার্নেল মডিউল ডিফল্টভাবে কোনো লগ দেখায় না; ডাইনামিক ডিবাগ (echo module wireguard +p | sudo tee /sys/kernel/debug/dynamic_debug/control) চালু করার পরেই কেবল WireGuard-এর বার্তাগুলো dmesg-এ দেখা যায়। এটি চালু থাকলে, চাবির অমিল হলে তা invalid-MAC ড্রপ হিসেবে ধরা পড়ে।

হ্যান্ডশেক কাজ করে, কিন্তু ইন্টারনেট নেই। ping 10.8.0.1 সফল হয় কিন্তু ping 1.1.1.1 টাইম-আউট হয়ে যায়: এর মানে হলো ফরওয়ার্ডিং বা NAT কনফিগারেশন অনুপস্থিত। নিশ্চিত করুন যে sysctl net.ipv4.ip_forward-এ 1 লেখা আছে, তারপর ক্লায়েন্ট থেকে পিং করার সময় sudo nft list ruleset বা sudo iptables -t nat -L POSTROUTING -n -v দিয়ে কাউন্টারগুলো পর্যবেক্ষণ করুন। মাস্করেড রুলে প্যাকেটের সংখ্যা শূন্য হলে বুঝতে হবে egress ইন্টারফেসের নাম ভুল; যদি কাউন্টার বাড়তে থাকে কিন্তু কোনো উত্তর না আসে, তবে তা ফরওয়ার্ড চেইন পলিসির দিকে নির্দেশ করে।

ইন্টারনেট কাজ করে, কিন্তু ডোমেইন নাম কাজ করে না। ping 1.1.1.1 সফল হয় এবং curl https://example.com থেকে Could not resolve host ফলাফল আসে। কনফিগারেশনে DNS লাইনটি অনুপস্থিত, অথবা সেখানে এমন কোনো রিজলভারের নাম দেওয়া হয়েছে যা টানেলের ভেতর থেকে পৌঁছানো সম্ভব নয়।

কিছু HTTPS সাইট লোড হয় না। SSH এবং পিং ঠিকঠাক কাজ করছে কিন্তু বড় ওয়েবসাইটগুলো আটকে যাচ্ছে। এটি মূলত পাথ MTU-এর সমস্যা: টানেল অতিরিক্ত ওভারহেড যোগ করে, এবং মাঝপথে কোনো লিঙ্ক বড় প্যাকেটগুলোকে ড্রপ করে দেয়, যার ফলে কোনো ICMP বার্তা ফেরত আসে না। ক্লায়েন্টের [Interface]-এ MTU কমিয়ে দেখুন; প্রথমে 1420, তারপর 1380, এবং সবশেষে 1280 চেষ্টা করুন। যদি MTU কমানোর ফলে সমস্যা সমাধান হয় কিন্তু থ্রুপুট আশানুরূপ না হয়, তবে আন্দাজে সংখ্যা না বসিয়ে বাইসেকশন এবং TCP MSS ক্ল্যাম্পিংয়ের মাধ্যমে সঠিক পাথ MTU খুঁজে বের করার পদ্ধতি অনুসরণ করুন, যা টানেলের বাইরের অন্যান্য সম্ভাব্য কারণগুলোকেও বাতিল করতে সাহায্য করবে।

ইন্টারফেস চালু হতে অস্বীকার করে। Address already in use মানে হলো অন্য কোনো প্রসেস UDP 51820 পোর্টটি দখল করে রেখেছে। up ব্যর্থ হওয়ার পর Cannot find device wg0 আসার অর্থ সাধারণত কনফিগারেশনটি প্রত্যাখ্যাত হয়েছে; journalctl -u wg-quick@wg0 -n 50 পড়ে দেখুন।

Streisand বা OpenVPN থেকে মাইগ্রেশন

Streisand এখন আর রক্ষণাবেক্ষণ করা হয় না এবং এর রিপোজিটরি আর্কাইভ করা হয়েছে। পরিত্যক্ত অটোমেশন টুল ব্যবহার করে VPN চালানো একটি দীর্ঘমেয়াদী নিরাপত্তা ঝুঁকি। এর কোনো সরাসরি আপগ্রেড পাথ নেই এবং OpenVPN-এর PKI এখানে কাজ করবে না: WireGuard-এ কোনো certificate, CA বা মেয়াদ উত্তীর্ণ হওয়ার বিষয় নেই, তাই প্রতিটি ক্লায়েন্টের জন্য নতুন key pair তৈরি করতে হয়।

সমান্তরালভাবে মাইগ্রেশন করুন; একই সার্ভারে OpenVPN-এর 1194 পোর্টের পাশাপাশি WireGuard-এর UDP 51820 পোর্ট ব্যবহার করা সম্ভব। wg0 সেটআপ করুন, ক্লায়েন্টদের একে একে স্থানান্তর করুন এবং সবশেষে পুরোনো সার্ভিসটি বন্ধ করে দিন। OpenVPN-এর username/password এবং revocation মডেল এখানে কার্যকর নয়; যদি আপনার ইউজার অ্যাকাউন্ট বা অডিট ট্রেইলের প্রয়োজন হয়, তবে WireGuard-এর উপরে সেই লেয়ারটি যুক্ত করুন।

ব্যাকআপ, আপগ্রেড এবং স্কেলেবিলিটির সীমাবদ্ধতা

/etc/wireguard হলো সার্ভার। এর ব্যাকআপ রাখুন (sudo tar czf wg-backup.tgz -C /etc wireguard, মোড 600, সার্ভারের বাইরে সংরক্ষণ করুন) এবং আপনি কয়েক মিনিটের মধ্যেই নতুন একটি VPS-এ এটি পুনরায় তৈরি করতে পারবেন। সার্ভারের প্রাইভেট কি হারিয়ে ফেললে প্রতিটি ক্লায়েন্ট কনফিগারেশন নতুন করে ইস্যু করতে হবে, কারণ ক্লায়েন্টরা সার্ভারের পাবলিক কি পিন (pin) করে রাখে। আপগ্রেড হলো একটি সাধারণ apt upgrade এবং কার্নেল আপডেটের জন্য রিবুট, আর আপনি যদি এটি এনাবল করে রাখেন তবে wg-quick@wg0 নিজে থেকেই ফিরে আসবে।

প্রতিটি পিয়ারের (peer) স্টেট ছোট এবং ক্রিপ্টো কার্নেলেই চলে, তাই এর সীমাবদ্ধতা এই কনফিগারেশনের চেয়ে আপনার VPS-এর CPU এবং ব্যান্ডউইথ লিমিটের ওপর বেশি নির্ভর করে। প্রকাশিত কোনো তথ্যের ওপর নির্ভর না করে টানেলের মাধ্যমে iperf3 দিয়ে এটি পরিমাপ করুন। স্কেলেবিলিটির ক্ষেত্রে অপারেশনাল কাজগুলোই চাপের কারণ হয়। প্রতিটি পিয়ারের একটি ইউনিক টানেল IP প্রয়োজন, এবং হাতে 60টি [Peer] ব্লক এডিট করতে গেলে ভুলবশত ডুপ্লিকেট AllowedIPs ঢুকে পড়ার সম্ভাবনা থাকে: তাই স্ক্রিপ্ট ব্যবহার করে কনফিগারেশন তৈরি করুন। একটি সার্ভার মানে একটি UDP এন্ডপয়েন্ট এবং একটি সিঙ্গেল পয়েন্ট অফ ফেইলিয়র, আর WireGuard-এ কোনো ক্লাস্টারিং নেই: রিডানডেন্সির অর্থ হলো নিজস্ব কি (key) সহ দ্বিতীয় একটি সার্ভার। কি রোটেশন ম্যানুয়ালি করতে হয়, তাই কার কাছে কোন কি আছে এবং কীভাবে একটি কি বাতিল করবেন তা লিখে রাখুন। যখন এই হিসাব-নিকাশ টেক্সট ফাইলের নিয়ন্ত্রণের বাইরে চলে যায়, তখন সাধারণ সমাধান হলো একই কার্নেল ডেটা প্লেনের ওপর একটি কন্ট্রোল প্লেন ব্যবহার করা, এবং একটি সেলফ-হোস্টেড NetBird সার্ভার অ্যাড্রেস অ্যালোকেশন, পিয়ার ডিস্ট্রিবিউশন এবং সেটআপ কি-এর কাজগুলো সামলায় যা আপনি অন্যথায় হাতে করতেন। যদি এই কন্ট্রোল প্লেন নিজে চালানো আপনার জন্য অতিরিক্ত ঝামেলা মনে হয়, তবে Tailscale আপনার জন্য এটি হোস্ট করতে পারে, এবং তাদের ফ্রি প্ল্যান ছয়জন ব্যবহারকারী এবং আনলিমিটেড ডিভাইসের জন্য যথেষ্ট, যা অধিকাংশ ব্যক্তিগত ব্যবহারের জন্য কোনো খরচ ছাড়াই চলে। এর চেয়ে বেশি হলে খরচ মেশিনের সংখ্যার ওপর নয়, বরং মানুষের সংখ্যার ওপর নির্ভর করে, তাই একটি পরিবার বা ছোট টিম আসলে কত খরচ করবে তা নির্ভর করে কতজন মানুষ লগইন ব্যবহার করছে তার ওপর, কতগুলো পিয়ার আপনি হাতে wg0.conf-এ এডিট করছেন তার ওপর নয়। সেই ক্ষেত্রে স্প্লিট-টানেল AllowedIPs-এর হিসাব-নিকাশ একটি সাবনেট রাউটার থেকে আপনার প্রাইভেট রেঞ্জ অ্যাডভার্টাইজ করার মাধ্যমে সহজ হয়, যা একটি VPS থেকে একবার অ্যানাউন্স করা হয় এবং কেন্দ্রীয়ভাবে অনুমোদিত হয়, প্রতিটি ক্লায়েন্ট ফাইলে পেস্ট করার প্রয়োজন হয় না। এই বিনিময়টি লাভজনক কি না তা নির্ভর করে একটি হোস্ট করা কন্ট্রোল প্লেন আসলে কতদূর পৌঁছাতে পারে তার ওপর, এবং এটি কখনোই আপনার ট্রাফিক এনক্রিপ্ট করা কিগুলো ধারণ করে না, যদিও এটি সিদ্ধান্ত নেয় কোন পিয়াররা একে অপরের সম্পর্কে জানতে পারবে

এই সবকিছুর জন্য আপনার নিয়ন্ত্রণে থাকা একটি Linux বক্স, একটি পাবলিক IP, এমন একটি কার্নেল যেখানে আপনি মডিউল লোড করতে পারেন এবং একটি ফায়ারওয়াল প্রয়োজন যার ওপর আপনার পূর্ণ নিয়ন্ত্রণ আছে।

FAQ

WireGuard handshake কেন সম্পন্ন হয় না?

wg show-এ কোনো peer-এর তালিকা থাকা কিন্তু latest handshake না থাকা মানে হলো প্যাকেট পৌঁছাচ্ছে না অথবা গৃহীত হচ্ছে না। VPS firewall এবং আপনার প্রোভাইডারের আলাদা network firewall-এ UDP 51820 পোর্ট চেক করুন, Endpoint হোস্ট এবং পোর্ট নিশ্চিত করুন, তারপর কি (keys) অদলবদল হয়েছে কি না দেখুন; ক্লায়েন্টের [Peer] ব্লকে অবশ্যই সার্ভারের public কি থাকতে হবে। সার্ভারে sudo tcpdump -ni any udp port 51820 কমান্ড দিয়ে দেখুন প্যাকেট আদৌ পৌঁছাচ্ছে কি না; dmesg শুধুমাত্র dynamic debug (echo module wireguard +p | sudo tee /sys/kernel/debug/dynamic_debug/control) চালু করার পরেই WireGuard-এর handshake ব্যর্থতার রিপোর্ট দেয়, তখন কি (key) অমিল থাকলে তা invalid-MAC drop হিসেবে দেখা যায়।

টানেল কানেক্ট হয় কিন্তু ইন্টারনেট কাজ করে না। কী বাদ পড়েছে?

ping 10.8.0.1 কাজ করছে কিন্তু ping 1.1.1.1 টাইম-আউট হচ্ছে, এর মানে হলো forwarding বা NAT-এ সমস্যা আছে। নিশ্চিত করুন যে sysctl net.ipv4.ip_forward-এ 1 লেখা আছে এবং এটি /etc/sysctl.d/-এ সেট করা হয়েছে, শুধু sysctl -w দিয়ে নয় যা রিবুট করলে মুছে যায়। এরপর masquerade রুলটি চেক করুন যা আপনার আসল egress ইন্টারফেসের নাম ব্যবহার করে, এটি ip route show default, enp1s0 বা ens3 হতে পারে, খুব কম ক্ষেত্রে eth0 হয়।

ক্লায়েন্ট কনফিগারেশনে কি আমার DNS = লাইনটি প্রয়োজন?

ফুল টানেল এবং DNS = লাইন না থাকলে, ক্লায়েন্ট তার লোকাল নেটওয়ার্ক থেকে পাওয়া resolver ব্যবহার করতে থাকে। ফলে ওই কুয়েরিগুলো লোকাল লিঙ্কের মাধ্যমে প্লেইন টেক্সটে চলে যায়, যদিও বাকি সবকিছু টানেল দিয়ে যায়। DNS-কে কোনো পাবলিক resolver-এ পয়েন্ট করুন, অথবা 10.8.0.1-এ বাইন্ড করা unbound/dnsmasq চালান এবং input chain-এ udp dport 53 iifname "wg0" পোর্টটি খুলে দিন।

AllowedIPs আসলে কী নিয়ন্ত্রণ করে?

এটি দুটি কাজ করে। আউটবাউন্ডের ক্ষেত্রে এটি একটি রাউটিং টেবিল: কোনো peer-এর AllowedIPs-এর সাথে মিলে যাওয়া ট্রাফিক এনক্রিপ্ট হয়ে সেই peer-এর কাছে পাঠানো হয়। ইনবাউন্ডের ক্ষেত্রে এটি একটি অ্যাক্সেস-কন্ট্রোল লিস্ট: ডিক্রিপ্ট করা কোনো প্যাকেটের উৎস যদি সেই peer-এর AllowedIPs-এর বাইরে হয়, তবে তা ড্রপ করা হয়। এই কারণেই সার্ভার সাইডে প্রতি ক্লায়েন্টের জন্য একটি /32 তালিকাভুক্ত থাকে, যেখানে ক্লায়েন্ট সাইডে 0.0.0.0/0 তালিকাভুক্ত থাকতে পারে।

WireGuard কি যেকোনো VPS-এ চলবে?

KVM VPS-এ এটি ইন-কার্নেল মডিউল দিয়ে কোনো বাড়তি সেটআপ ছাড়াই কাজ করে। কন্টেইনার ভার্চুয়ালাইজেশন যা হোস্ট কার্নেল শেয়ার করে, যেমন OpenVZ বা LXC-তে, modprobe wireguard কমান্ডটি Operation not supported এরর দিয়ে ব্যর্থ হয় এবং সেক্ষেত্রে বিকল্প হিসেবে wireguard-go ইউজারস্পেস ইমপ্লিমেন্টেশন ব্যবহার করতে হয়। অন্য কিছু করার আগে sudo modprobe wireguard && echo ok চালিয়ে দেখুন।