VPS पर WireGuard VPN कैसे सेटअप करें
Linux VPS पर WireGuard सेटअप करने की पूरी विधि सीखें। इसमें key generation, wg0.conf config, IP forwarding और handshake failures को ठीक करने के तरीके शामिल हैं।
आप क्या बना रहे हैं
आपके अपने server पर WireGuard VPN बनाने के लिए लगभग चालीस lines of config की आवश्यकता होती है: एक key pair, एक interface file, एक sysctl, एक NAT rule, और एक firewall hole. इसका installation बहुत सरल है, इसलिए इस guide का अधिकांश हिस्सा उन समस्याओं पर केंद्रित है जो अक्सर आती हैं — जैसे key permissions, AllowedIPs, forwarding और DNS.
WireGuard kernel में एक Layer 3 tunnel है, जो Linux 5.6 से mainline है, इसलिए Ubuntu 24.04 और Debian 13 में यह बिना किसी external module के आता है। इसमें कोई cipher negotiation, certificate authority, या username/password की आवश्यकता नहीं होती: एक peer का अर्थ है एक public key और वे IP addresses जिनका वह key उपयोग कर सकता है। यदि कोई packet MAC check में विफल हो जाता है, तो उसे बिना किसी reply के drop कर दिया जाता है, जिससे port scans का कोई उत्तर नहीं मिलता। इसका दूसरा पहलू यह है कि कोई auth server मौजूद नहीं होता, इसलिए access हटाने के लिए आपको उस box से peer को delete करना होगा।
पहले virtualisation की जाँच करें
WireGuard को एक ऐसे kernel की आवश्यकता होती है जिसमें module load किया जा सके। KVM VPS पर यह बिना किसी अतिरिक्त सेटअप के काम करता है। Container virtualisation (जैसे OpenVZ या LXC) host kernel को साझा करते हैं; ऐसी स्थिति में पहला command RTNETLINK answers: Operation not supported के साथ fail हो जाता है। ऐसे में fallback के रूप में wireguard-go userspace implementation का उपयोग किया जाता है। पहले sudo modprobe wireguard && echo ok से जाँच करें।
Keys को लीक होने से बचाएं
यदि /etc/wireguard/server.key को world-readable रखा जाता है, तो VPN का कोई लाभ नहीं मिलता। सामान्य umask 077 && wg genkey | sudo tee ... लाइन अविश्वसनीय है, क्योंकि sudo द्वारा tee द्वारा बनाई गई file पर अपना umask लागू किया जाता है। 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.keyClient pair को भी इसी तरह generate करें। wg genpsk एक optional pre-shared key जोड़ता है, जो प्रत्येक config में एक line होती है।
Server interface: /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 it; यदि आपको यह startup warning मिलती है कि file world accessible है, तो इसका मतलब है कि आपने इसे skip कर दिया है। Address tunnel के अंदर server का address है, जो पूरे VPN subnet का mask carry करता है। ऐसा range चुनें जो public networks में न मिले — 192.168.1.0/24 उन आधे home routers से collide करता है जिनके पीछे आपके clients होते हैं, और ऐसी स्थिति में tunnel local route के कारण silently fail हो जाता है।
Server side पर peer का AllowedIPs एक /32 है, जो client का एकमात्र tunnel address है। यदि आप दो peers को एक ही allowed IP देते हैं, तो वह उस peer पर move हो जाता है जिसे last configure किया गया था, और पहला peer बिना किसी error के traffic प्राप्त करना बंद कर देता है। SaveConfig को unset रहने दें, अन्यथा wg-quick down इस file को live state से rewrite कर देगा।
Box को router में बदलें
Linux server उन packets को drop कर देता है जो उसके लिए address नहीं किए गए हैं। Default रूप में 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एक bare sysctl -w अगले reboot तक काम करता है और फिर चुपचाप काम करना बंद कर देता है। NAT को egress interface की आवश्यकता होती है — वह NIC जो internet से जुड़ा हो, न कि wg0। यह न मानें कि eth0 है; अपना interface name ip route show default से प्राप्त करें, क्योंकि current images enp1s0 या ens3 जैसे names का उपयोग करते हैं।
Firewall: port, aur forward path
Ek nftables file filter aur NAT ko cover karti hai. /etc/nftables.conf likhein — yeh existing ruleset ko flush kar deta hai, isliye agar box pehle se ufw ya Docker dwara manage kiya ja raha hai, toh ise skip karein.
#!/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
}
}Ise sudo systemctl enable --now nftables ke saath apply karein, aur ek doosra SSH session open rakhein: policy drop ke saath SSH rule mein ek typo aapko aapke apne server se lock out kar sakta hai. Dekhein ki forward chain kya allow nahi karti hai — wg0 se wg0 tak. Peers internet se connect hote hain, ek doosre se nahi; peer-to-peer VPN ke liye iifname "wg0" oifname "wg0" accept add karein. Wahi chain yeh govern karti hai ki ek peer server par kya touch kar sakta hai, jo tab mahatvapurn hai jab box ek tmux mein Claude Code chalaane wala remote development box ke roop mein kaam karta hai aur aap us side ko publicly expose nahi karna chahte.
ufw box par: ufw allow 51820/udp, /etc/default/ufw mein DEFAULT_FORWARD_POLICY="ACCEPT", aur /etc/ufw/before.rules ke top par ek *nat POSTROUTING MASQUERADE rule.
इसे systemd के अंतर्गत सेटअप करें
sudo systemctl enable --now wg-quick@wg0
sudo wg showwg-quick इंटरफ़ेस बनाता है, एड्रेस जोड़ता है, और AllowedIPs से प्राप्त रूट्स इंस्टॉल करता है। enable --now सबसे महत्वपूर्ण हिस्सा है: अगला reboot होने पर मैन्युअल रूप से किया गया wg-quick up wg0 हट जाएगा, और kernel upgrades के लिए reboot करना आवश्यक होता है।
Client configuration, aur ek aisi setting jisme sab galti karte hain
[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 ek saath do alag kaam karta hai, aur in dono ko ek samajhna WireGuard se judi adhiktam confusion ka kaaran hai.
Outbound ke liye yeh ek routing table hai. Agar kisi packet ka destination peer ke AllowedIPs se match karta hai, toh use encrypt karke us peer ko bhej diya jata hai. 0.0.0.0/0, ::/0 tunnel ke zariye sab kuch bhejta hai — yani server ko default route banakar ek full tunnel banata hai. Split tunnel ek choti list hoti hai: AllowedIPs = 10.8.0.0/24, 10.20.0.0/16 VPN traffic aur server ke peeche wala ek private network carry karta hai, jabki baaki sab kuch apne local route ka upyog karte hain. Is choti list ki wajah se hi aap services ko public internet se puri tarah alag rakh sakte hain — jaise ki tunnel address se juda VPS par ek private Nextcloud instance, ya usi machine par chalne wali nested-virtualisation lab VMs, jo peers ke liye reachable rehti hain par baaki sab ke liye invisible rehti hain.
Inbound ke liye yeh ek access-control list hai. Agar kisi peer ka source address us peer ke AllowedIPs mein nahi hai, toh decrypted packet drop kar diya jata hai. Isiliye server laptop ke liye 10.8.0.2/32 list karta hai: wahan 0.0.0.0/0 ka entry hone se woh client tunnel mein kisi bhi address ko spoof kar sakega.
PersistentKeepalive NAT ke peeche wale clients ke liye hota hai, jahan router UDP mapping ko tabhi open rakhta hai jab packets flow ho rahe hon. Jab yeh expire ho jata hai, toh server client tak nahi pahunch pata. PersistentKeepalive = 25 mapping ko open rakhta hai — ise client par set karein, kisi public IP wale server par nahi.
DNS, और वह leak जिसे कोई नोटिस नहीं करता
AllowedIPs = 0.0.0.0/0 के साथ और DNS = लाइन के न होने पर, client उसी resolver का उपयोग करता है जो उसे local network से मिला है — यानी 192.168.1.1 पर स्थित café router। वह route default route से अधिक specific है, इसलिए DNS queries local link से cleartext में बाहर निकल जाती हैं, जबकि बाकी सारा traffic tunnel के माध्यम से जाता है। Traffic private है; लेकिन names की list नहीं है।
दो सही विकल्प। DNS को public resolver (DNS = 9.9.9.9) पर point करें और queries tunnel के माध्यम से आपके server से बाहर निकलेंगी, हालांकि वह resolver उन्हें देख सकता है। या फिर 10.8.0.1 से bound unbound या dnsmasq चलाएं, DNS = 10.8.0.1 सेट करें, और input chain में udp dport 53 iifname "wg0" accept जोड़ें — इस line को सेट करने के बाद resolver की चिंता न करें, और कुछ भी resolve नहीं होगा।
Linux clients पर wg-quick, resolvconf के माध्यम से DNS लागू करता है; यदि यह अनुपस्थित है, तो आपको resolvconf: command not found प्राप्त होगा। openresolv install करें, या systemd-resolved client पर PostUp = resolvectl dns %i 10.8.0.1 सेट करें।
Tunnel को बिना गिराए peers को जोड़ना और हटाना
User जोड़ने के लिए interface को restart करने से सभी connected users disconnect हो जाते हैं। wg0.conf में [Peer] block जोड़ें, फिर peer set को reload करें।
sudo bash -c 'wg syncconf wg0 <(wg-quick strip wg0)'wg-quick strip, wg-quick-only keys (Address, DNS, PostUp) के बिना config print करता है, और syncconf live sessions को बनाए रखते हुए changes apply करता है। यह केवल peers को update करता है: यदि Address बदला गया है, तो interface को full down/up करना होगा। sudo wg set wg0 peer <public key> remove के साथ revoke करें, फिर file से block को delete कर दें, अन्यथा reload होने पर यह वापस आ जाएगा।
Failure modes, with the strings you will see
Handshake never completes. wg show बिना latest handshake के peer को list करता है, और client logs में यह दिखता है:
Handshake for peer 1 (10.0.0.10:51820) did not complete after 5 seconds, retrying (try 2)या तो कुछ भी arrive नहीं हो रहा है, या कुछ भी accept नहीं हो रहा है। क्रमवार जाँचें: क्या VPS firewall और provider के network firewall (जो अधिकांश panels में एक अलग control होता है) पर UDP 51820 open है; क्या Endpoint address और port सही है; क्या keys cross हो गई हैं। Client के [Peer] block में server की public key होनी चाहिए, और इसके विपरीत — private key, या client की अपनी public key paste करने पर यही symptom आता है। Server पर sudo tcpdump -ni any udp port 51820 से पता चलता है कि packets arrive हो रहे हैं या नहीं। Kernel module default रूप से कुछ भी log नहीं करता है; WireGuard messages dmesg में केवल तभी दिखते हैं जब आप dynamic debug (echo module wireguard +p | sudo tee /sys/kernel/debug/dynamic_debug/control) enable करते हैं, और इसे enable करने पर, key mismatch 'invalid-MAC drop' के रूप में दिखता है।
Handshake works, no internet. ping 10.8.0.1 सफल होता है लेकिन ping 1.1.1.1 time out हो जाता है: इसका मतलब forwarding या NAT मौजूद नहीं है। Check करें कि sysctl net.ipv4.ip_forward 1 पढ़ रहा है या नहीं, फिर client के ping करते समय sudo nft list ruleset या sudo iptables -t nat -L POSTROUTING -n -v के साथ counters देखें। Masquerade rule पर zero packets का मतलब है कि उसका egress interface name गलत है; बिना replies के बढ़ता हुआ counter forward chain policy की ओर इशारा करता है।
Internet works, names do not. ping 1.1.1.1 सफल होता है और curl https://example.com Could not resolve host return करता है। DNS line गायब है, या यह ऐसे resolver का नाम बताता है जो tunnel के अंदर से unreachable है।
Some HTTPS sites hang. SSH और ping सही काम कर रहे हैं; बड़ी pages अटक जाती हैं। यह path MTU की समस्या है: tunnel overhead जोड़ता है, और बीच का कोई link बिना ICMP message वापस भेजे oversized packets को drop कर देता है। Client के [Interface] पर MTU कम करें — पहले 1420 try करें, फिर 1380, फिर 1280।
Interface refuses to start. Address already in use का मतलब है कि कोई दूसरा process UDP 51820 का उपयोग कर रहा है। up के विफल होने के बाद Cannot find device wg0 का मतलब आमतौर पर यह है कि config reject हो गया है; journalctl -u wg-quick@wg0 -n 50 पढ़ें।
Streisand या OpenVPN से माइग्रेट करना
Streisand अब मेंटेन नहीं किया जा रहा है और इसका repository archive कर दिया गया है। Abandoned automation पर VPN चलाना सुरक्षा के लिए एक गंभीर समस्या है। इसमें in-place upgrade का विकल्प उपलब्ध नहीं है। OpenVPN का PKI, WireGuard में कन्वर्ट नहीं हो सकता: WireGuard में कोई certificates, CA या expiry नहीं होती है, इसलिए हर client को एक नया key pair मिलता है।
Parallel माइग्रेशन करें — एक ही machine पर UDP 51820 पर WireGuard और 1194 पर OpenVPN साथ-साथ चल सकते हैं। wg0 सेटअप करें, एक-एक करके clients को मूव करें, और फिर पुरानी service को stop कर दें। OpenVPN का username/password और revocation model, WireGuard में काम नहीं करेगा; यदि आपको accounts या audit trail की आवश्यकता है, तो उसे WireGuard के ऊपर एक अलग layer के रूप में इस्तेमाल करें।
Backups, upgrades, and what strains at scale
/etc/wireguard is the server. इसका backup लें (sudo tar czf wg-backup.tgz -C /etc wireguard, mode 600, इसे server से बाहर रखें) और आप कुछ ही minutes में एक naya VPS par ise rebuild kar sakte hain. Agar server ki private key kho jati hai, to har client config ko reissue karna hoga, kyunki clients server ki public key ko pin karte hain. Upgrades ek sadharan apt upgrade hain aur kernel updates ke liye reboot ki zaroorat hoti hai; agar aapne ise enable kiya hai, to wg-quick@wg0 apne aap restore ho jayega.
Per-peer state chota hota hai aur crypto kernel mein chalta hai, isliye is config ki bajaye aapke VPS ka CPU aur bandwidth allowance hi limit hoga — kisi published figure par bharosa karne ke bajaye tunnel ke zariye iperf3 se ise measure karein. Scale par operations mein dikkat aati hai. Har peer ko ek unique tunnel IP ki zaroorat hoti hai, aur sixty [Peer] blocks ko manually edit karne se duplicate AllowedIPs hone ka khatra rehta hai: configs ko ek script se generate karein. Ek server ka matlab hai ek UDP endpoint aur ek point of failure, aur WireGuard mein clustering nahi hoti: redundancy ke liye aapko apne khud ke keys ke saath ek dusra server chahiye hoga. Key rotation manual rehta hai, isliye note karein ki kiske paas kaunsi key hai aur kisi key ko revoke kaise karna hai.
Is sab ke liye aapko ek Linux box ki zaroorat hogi jise aap control kar sakein — ek public IP, ek aisa kernel jisme aap module load kar sakein, aur ek aisa firewall jiska pura control aapke paas ho.
FAQ
WireGuard handshake पूरा क्यों नहीं हो रहा है?
यदि wg show में कोई peer बिना latest handshake के सूचीबद्ध है, तो इसका मतलब है कि packets प्राप्त नहीं हो रहे हैं या स्वीकार नहीं किए जा रहे हैं। VPS firewall और अपने provider के network firewall दोनों पर UDP 51820 की जाँच करें। Endpoint host और port की पुष्टि करें। सुनिश्चित करें कि keys आपस में बदली हुई नहीं हैं — client के [Peer] block में server की public key होनी चाहिए। Server पर sudo tcpdump -ni any udp port 51820 से पता चलता है कि packets आ रहे हैं या नहीं; dmesg केवल WireGuard के handshake failures रिपोर्ट करता है यदि आपने dynamic debug (echo module wireguard +p | sudo tee /sys/kernel/debug/dynamic_debug/control) सक्षम किया है। ऐसी स्थिति में, key mismatch 'invalid-MAC drop' के रूप में दिखाई देता है।
Tunnel कनेक्ट हो जाता है लेकिन इंटरनेट नहीं चल रहा है। क्या कमी है?
यदि ping 10.8.0.1 काम कर रहा है लेकिन ping 1.1.1.1 timeout हो रहा है, तो यह forwarding या NAT की समस्या है। पुष्टि करें कि sysctl net.ipv4.ip_forward में 1 पढ़ा जा रहा है और यह /etc/sysctl.d/ में सेट है, न कि केवल sysctl -w के साथ जो reboot के बाद समाप्त हो जाता है। फिर masquerade rule की जाँच करें। ip route show default से अपना वास्तविक egress interface देखें — enp1s0 या ens3, बहुत कम मामलों में eth0।
क्या मुझे अपने client config में DNS = line की आवश्यकता है?
Full tunnel के साथ और बिना DNS = line के, client स्थानीय network से मिला resolver ही उपयोग करता है। इस कारण अन्य सभी traffic tunnel के माध्यम से जाता है, लेकिन वे queries स्थानीय link पर cleartext में भेजी जाती हैं। DNS को public resolver पर point करें, या 10.8.0.1 से bound unbound/dnsmasq चलाएं और input chain में udp dport 53 iifname "wg0" को open करें।
AllowedIPs वास्तव में क्या नियंत्रित करता है?
यह दो कार्य करता है। Outbound के लिए यह एक routing table है: peer के AllowedIPs से मेल खाने वाला traffic encrypt होकर उस peer को भेज दिया जाता है। Inbound के लिए यह एक access-control list है: यदि किसी decrypted packet का source उस peer के AllowedIPs के बाहर का है, तो उसे drop कर दिया जाता है। यही कारण है कि server side पर प्रत्येक client के लिए /32 सूचीबद्ध होता है, जबकि client side पर 0.0.0.0/0 सूचीबद्ध हो सकता है।
क्या WireGuard किसी भी VPS पर चलेगा?
KVM VPS पर, यह in-kernel module के साथ बिना किसी अतिरिक्त setup के काम करता है। Container virtualisation (जैसे OpenVZ या LXC) जो host kernel साझा करते हैं, वहां modprobe wireguard Operation not supported के साथ fail हो जाता है। ऐसी स्थिति में fallback के रूप में wireguard-go userspace implementation का उपयोग किया जाता है। किसी भी अन्य चीज़ से पहले sudo modprobe wireguard && echo ok चलाएं।