কিভাবে নিজের 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 ... কমান্ডটি কাজ করে: sudoers-এ umask_override সেট করা না থাকলে, যা ডিফল্টভাবে বন্ধ থাকে, sudo আপনার umask-কে নিজস্ব 0022 ডিফল্টের সঙ্গে সমন্বয় করে এবং কখনো অনুমতিগুলো আরও কঠোর করে না। তাই এটি যে ফাইল tee তৈরি করে, তার mode হয় 600। key ফাঁস হয় যখন umask 077 ছাড়া ওই pipe চালানো হয়, সাধারণ 022 umask ব্যবহৃত হয়, অথবা এমন সিস্টেমে চালানো হয় যেখানে sudoers umask_override চালু করেছে। mode স্পষ্টভাবে সেট করুন; তাহলে এসব বিষয় আর প্রভাব ফেলবে না।
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 যোগ করে; প্রতিটি config-এ একটি করে line থাকে।
সার্ভার ইন্টারফেস: /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/32chmod 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-এর মতো নাম ব্যবহার করা হয়।
ফায়ারওয়াল: port এবং forward path
একটি nftables file filter এবং NAT—দুটিই নিয়ন্ত্রণ করে। /etc/nftables.conf লিখলে বিদ্যমান ruleset flush হয়ে যায়। তাই ufw বা Docker দিয়ে ইতিমধ্যে পরিচালিত কোনো box-এ এটি চালাবেন না।
#!/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
}
}দ্বিতীয় একটি SSH session খোলা রেখে sudo systemctl enable --now nftables দিয়ে এটি প্রয়োগ করুন: policy drop-এর সঙ্গে SSH rule-এ একটি typo থাকলেই আপনি নিজের server-এ প্রবেশাধিকার হারাবেন। forward chain কী অনুমোদন করে না, তা লক্ষ্য করুন: wg0 থেকে wg0। Peer-গুলো Internet-এ যেতে পারে, কিন্তু একে অপরের কাছে যেতে পারে না। Peer-to-peer VPN-এর জন্য iifname "wg0" oifname "wg0" accept যোগ করুন। Server নিজে peer-কে কোন resource-এ পৌঁছাতে দেবে, তা এই chain-এর কাজ নয়। Box-কে লক্ষ্য করে আসা packet input hook অতিক্রম করে, forward নয়। তাই input chain-ই সিদ্ধান্ত নেয়। বর্তমান নিয়মে peer শুধু SSH-তে পৌঁছাতে পারে, অন্য কোথাও নয়; এমনকি 10.8.0.1-এ ping-ও করতে পারে না। সেখানে iifname "wg0" icmp type echo-request accept যোগ করুন। Tunnel-এর মাধ্যমে যেসব service-এ পৌঁছানো যাবে, সেগুলোর প্রতিটির জন্য একটি করে iifname "wg0" rule যোগ করুন। এটি বিশেষভাবে গুরুত্বপূর্ণ যখন box-টি tmux-এ Claude Code চালানো remote development box হিসেবেও ব্যবহৃত হয় এবং আপনি সেটির ওই অংশ public-এ প্রকাশ করতে চান না।
ufw ব্যবহৃত box-এ: ufw allow 51820/udp, /etc/default/ufw-এ DEFAULT_FORWARD_POLICY="ACCEPT", এবং /etc/ufw/before.rules-এর শুরুতে একটি *nat POSTROUTING MASQUERADE rule।
systemd-এর অধীনে এটি চালু করা
sudo systemctl enable --now wg-quick@wg0
sudo wg showwg-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 = 25AllowedIPs একই সাথে দুটি ভিন্ন কাজ করে এবং এই দুটিকে গুলিয়ে ফেলাই 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 ব্যবহার করে অ্যাক্সেস বাতিল করুন, তারপর ফাইল থেকে ব্লকটি মুছে ফেলুন, অন্যথায় পরবর্তী রিলোডের সময় এটি আবার ফিরে আসবে।
ব্যর্থতার ধরন এবং যে বার্তাগুলো দেখা যাবে
Handshake কখনও সম্পন্ন হয় না। wg show-এ peer-এর তালিকা দেখা যায়, কিন্তু latest handshake নেই। Client log-এ দেখা যায়:
Handshake for peer 1 (10.0.0.10:51820) did not complete after 5 seconds, retrying (try 2)কোনো packet আসছে না, অথবা কোনো packet গ্রহণ করা হচ্ছে না। প্রথমে দেখুন VPS-এর firewall এবং provider-এর network firewall—যা অধিকাংশ panel-এ আলাদা নিয়ন্ত্রণ—দুটিতেই UDP 51820 খোলা আছে কি না। এরপর Endpoint address ও port সঠিক কি না দেখুন। তারপর key-গুলো পরস্পরের সঙ্গে মিলে আছে কি না যাচাই করুন। Client-এর [Peer] block-এ server-এর public key থাকতে হবে, এবং উল্টো দিকেও একই নিয়ম প্রযোজ্য। সেখানে private key বা client-এর নিজস্ব public key বসালে ঠিক এই লক্ষণ দেখা যায়। Server-এ sudo tcpdump -ni any udp port 51820 দেখে বোঝা যায় packet আদৌ পৌঁছাচ্ছে কি না। Kernel module ডিফল্টভাবে কোনো log লেখে না। Dynamic debug (echo module wireguard +p | sudo tee /sys/kernel/debug/dynamic_debug/control) চালু করার পরেই WireGuard-এর message dmesg-এ দেখা যায়। এটি চালু থাকলে key mismatch invalid-MAC drop হিসেবে দেখা যায়।
Handshake কাজ করে, কিন্তু Internet নেই। ping 10.8.0.1 সফল হয়, কিন্তু ping 1.1.1.1 timeout হয়। এর অর্থ forwarding বা NAT অনুপস্থিত। sysctl net.ipv4.ip_forward-এ 1 আছে কি না দেখুন। এরপর client ping করার সময় sudo nft list ruleset বা sudo iptables -t nat -L POSTROUTING -n -v দিয়ে counter পর্যবেক্ষণ করুন। Masquerade rule-এ packet-এর সংখ্যা 0 থাকলে egress interface-এর নাম ভুল। Counter বাড়ছে কিন্তু কোনো reply নেই—এটি forward chain policy-এর দিকে নির্দেশ করে।
Internet কাজ করে, কিন্তু নাম resolve হয় না। ping 1.1.1.1 সফল হয় এবং curl https://example.com, Could not resolve host ফেরত দেয়। DNS line অনুপস্থিত, অথবা সেখানে এমন resolver দেওয়া হয়েছে যেটি tunnel-এর ভেতর থেকে পৌঁছানো যায় না।
কিছু HTTPS site আটকে যায়। SSH এবং ping ঠিক আছে, কিন্তু বড় page লোড হওয়ার সময় থেমে যায়। এটি path MTU সমস্যা। Tunnel অতিরিক্ত overhead যোগ করে, এবং মাঝপথের কোনো link ICMP message ফেরত না পাঠিয়ে অতিরিক্ত বড় packet বাদ দিতে পারে। Client-এর [Interface]-এ MTU সেট করুন। সাধারণ 1500-byte link-এ wg-quick ইতিমধ্যে 1420 বেছে নেয়; এটি 1500 থেকে overhead-এর 80 byte বাদ দিলে যে মান পাওয়া যায়। তাই 1420 লিখলে কোনো পরিবর্তন হবে না। 1380 চেষ্টা করুন, তারপর 1280। MTU কমালে stall ঠিক হলেও throughput সন্তোষজনক না হলে অনুমান করে round number ব্যবহার করবেন না। bisection করে প্রকৃত path MTU নির্ণয় এবং TCP MSS clamp করার পদ্ধতি অনুসরণ করুন। এতে সমস্যাটি আদৌ tunnel-সংক্রান্ত কি না, সেটিও যাচাই করা যায়।
Interface start হতে অস্বীকার করে। Address already in use-এর অর্থ অন্য একটি process UDP 51820 ব্যবহার করছে। ব্যর্থ up-এর পরে Cannot find device wg0 দেখা গেলে সাধারণত configuration প্রত্যাখ্যান করা হয়েছে। 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, mode 600, সার্ভারের বাইরে সংরক্ষিত), তাহলে কয়েক মিনিটের মধ্যে নতুন VPS-এ এটি পুনর্নির্মাণ করতে পারবেন। সার্ভারের private key হারালে প্রতিটি client config নতুন করে জারি করতে হবে, কারণ client-গুলো সার্ভারের public key pin করে। Upgrade সাধারণ apt upgrade এবং kernel update-এর জন্য একটি reboot। আপনি wg-quick@wg0 enable করে থাকলে এটি নিজে থেকেই আবার চালু হবে।
প্রতিটি peer-এর state ছোট এবং crypto kernel-এ চলে। তাই সীমা এই config-এর কোনো বিষয় নয়; আপনার VPS-এর CPU এবং bandwidth allowance-ই মূল সীমা। প্রকাশিত কোনো সংখ্যার ওপর নির্ভর না করে tunnel-এর মাধ্যমে iperf3 চালিয়ে এটি মাপুন। স্কেল বাড়লে মূল চাপ তৈরি হয় operations-এ। প্রতিটি peer-এর জন্য একটি unique tunnel IP দরকার। ষাটটি [Peer] block হাতে সম্পাদনা করলে AllowedIPs duplicate ঢুকে পড়া স্বাভাবিক। তাই script দিয়ে config generate করুন। একটি server মানে একটি UDP endpoint এবং একটি single point of failure। WireGuard-এ clustering নেই। Redundancy চাইলে নিজস্ব key-সহ দ্বিতীয় server লাগবে। Key rotation manual-ই থাকে। তাই কোন key কার কাছে আছে এবং একটি key কীভাবে revoke করবেন, তা লিখে রাখুন। এই bookkeeping যখন text file-এর সীমা ছাড়িয়ে যায়, তখন সাধারণ সমাধান হলো একই kernel data plane-এর ওপর একটি control plane ব্যবহার করা। নিজে পরিচালিত NetBird server address allocation, peer distribution এবং setup key সামলায়, যেগুলো অন্যথায় আপনাকে হাতে করতে হতো। নিজে এই control plane চালানো যদি আরও একটি box পরিচালনার সমান হয়, Tailscale আপনার হয়ে এটি host করে। এর free Personal plan-এ ছয়জন user, unlimited user device এবং শুরুতে সর্বোচ্চ 50টি tagged resource, যেমন server, অন্তর্ভুক্ত থাকে, তাই অধিকাংশ personal fleet-এর জন্য এর জন্য কখনও অর্থ দিতে হয় না। এর বেশি হলে খরচ machine-এর বদলে মানুষের সংখ্যার ওপর নির্ভর করে। অর্থাৎ কত peer আপনি wg0.conf-এ হাতে যোগ করতেন তা নয়, কতজন মানুষ login ব্যবহার করে সেটিই নির্ধারণ করে একটি household বা ছোট team আসলে কত খরচ করে। সেই ব্যবস্থায় split-tunnel AllowedIPs bookkeeping-এর বদলে subnet router থেকে private range advertise করা হয়। একটি VPS থেকে এটি একবার announce করে কেন্দ্রীয়ভাবে approve করা যায়, প্রতিটি client file-এ আলাদা করে paste করতে হয় না। এই trade-off গ্রহণযোগ্য কি না, তা নির্ভর করে hosted control plane বাস্তবে কোন কোন জায়গায় পৌঁছাতে পারে তার ওপর। এটি আপনার traffic encrypt করা key কখনও ধরে রাখে না, তবে কোন peer একে অপরের তথ্য জানতে পারবে তা নির্ধারণ করে।
এসব চালাতে আপনার নিয়ন্ত্রণাধীন একটি Linux box, একটি public IP, module load করা যায় এমন একটি kernel এবং end-to-end আপনার নিয়ন্ত্রণে থাকা firewall প্রয়োজন।
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 চালিয়ে দেখুন।