SSD Nodes Learn 8GB RAM — $66/साल
गाइड Matt Connorलेखक: Matt Connor · अपडेट किया गया: 2026-08-01

Docker में wg-easy के साथ WireGuard कैसे सेटअप करें

Docker Compose का उपयोग करके wg-easy इंस्टॉल करें। NET_ADMIN और sysctls सेटिंग्स के साथ VPN कॉन्फ़िगर करें। वर्जन 15 के बदलाव और QR कोड से फोन कनेक्ट करने की पूरी जानकारी यहाँ देखें।

आप क्या बना रहे हैं

wg-easy एक वेब इंटरफेस के साथ WireGuard है, जो एक Docker कंटेनर के रूप में चलता है। यह आपके लिए WireGuard इंटरफेस को प्रबंधित करता है और क्लाइंट बनाने के लिए एक ब्राउज़र UI जोड़ता है। आपके द्वारा बनाए गए प्रत्येक क्लाइंट को एक कॉन्फ़िगरेशन फ़ाइल और एक QR कोड मिलता है, इसलिए एक फ़ोन स्क्रीन पर कैमरा पॉइंट करके VPN से जुड़ जाता है।

टनल स्वयं सामान्य WireGuard है। कर्नेल मॉड्यूल पैकेट को स्थानांतरित करता है, इसलिए थ्रूपुट हाथ से लिखे गए सेटअप के समान ही होता है। आप जो हासिल करते हैं वह क्लाइंट लाइफसाइकिल है: SSH पर कॉन्फ़िगरेशन फ़ाइल को संपादित किए बिना साथियों (peers) को जोड़ना, अक्षम करना और हटाना। आप जो छोड़ते हैं वह उस कॉन्फ़िगरेशन का सीधा नियंत्रण है, जो VPS पर मैन्युअल WireGuard सेटअप का विषय है।

आपको एक सार्वजनिक IPv4 पते के साथ एक KVM VPS, Compose प्लगइन के साथ Docker Engine, और root एक्सेस की आवश्यकता है। कंटेनर वर्चुअलाइजेशन जो होस्ट कर्नेल को साझा करता है, जैसे कि OpenVZ या LXC, आमतौर पर WireGuard मॉड्यूल को लोड नहीं कर सकता है, और कंटेनर इंटरफेस को चालू करने में विफल रहेगा।

Version 15 में सेटिंग्स को environment से हटा दिया गया है

आपको मिलने वाली अधिकांश गाइड wg-easy 14 के लिए लिखी गई थीं, जहाँ आप WG_HOST को अपने सर्वर एड्रेस पर और PASSWORD_HASH को एडमिन पासवर्ड के bcrypt हैश पर सेट करते थे, ये दोनों environment variables के रूप में होते थे। Version 15 एक पूरी तरह से नया संस्करण है। आधिकारिक माइग्रेशन नोट्स स्पष्ट रूप से कहते हैं कि v15, v14 वाले environment variables का उपयोग नहीं करता है, और उनमें से अधिकांश को वेब UI में एडमिन पैनल में स्थानांतरित कर दिया गया है।

इसलिए WG_HOST और PASSWORD_HASH अब कोई कार्य नहीं करते हैं। यदि आप पुरानी compose फ़ाइल कॉपी करते हैं, तो कंटेनर शुरू हो जाता है, उन लाइनों को अनदेखा कर देता है, और फिर आपसे ब्राउज़र में एक एडमिन अकाउंट बनाने के लिए कहता है। यह कोई बग नहीं है। यह नया सेटअप फ्लो है।

जुलाई 2026 तक, जिस major tag को पिन करना है वह 15 है। latest का उपयोग करने के बजाय major version को पिन करें, क्योंकि एक major upgrade ऑन-डिस्क कॉन्फ़िगरेशन फॉर्मेट को बदल देता है और इसे आसानी से रोल बैक नहीं किया जा सकेगा।

The compose file

स्टैक के लिए एक डायरेक्टरी बनाएँ और उसमें आधिकारिक compose फ़ाइल लिखें। यह अपस्ट्रीम फ़ाइल है, जिसमें कोई बदलाव नहीं किया गया है।

sudo mkdir -p /etc/docker/containers/wg-easy
sudo curl -o /etc/docker/containers/wg-easy/docker-compose.yml \
  https://raw.githubusercontent.com/wg-easy/wg-easy/master/docker-compose.yml

इसकी सामग्री इस प्रकार है:

volumes:
  etc_wireguard:

services:
  wg-easy:
    image: ghcr.io/wg-easy/wg-easy:15
    container_name: wg-easy
    networks:
      wg:
        ipv4_address: 10.42.42.42
        ipv6_address: fdcc:ad94:bacf:61a3::2a
    volumes:
      - etc_wireguard:/etc/wireguard
      - /lib/modules:/lib/modules:ro
    ports:
      - "51820:51820/udp"
      - "51821:51821/tcp"
    restart: unless-stopped
    cap_add:
      - NET_ADMIN
      - SYS_MODULE
    sysctls:
      - net.ipv4.ip_forward=1
      - net.ipv4.conf.all.src_valid_mark=1
      - net.ipv6.conf.all.disable_ipv6=0
      - net.ipv6.conf.all.forwarding=1
      - net.ipv6.conf.default.forwarding=1

networks:
  wg:
    driver: bridge
    enable_ipv6: true
    ipam:
      driver: default
      config:
        - subnet: 10.42.42.0/24
        - subnet: fdcc:ad94:bacf:61a3::/64

etc_wireguard एक नेम्ड वॉल्यूम है जिसमें सर्वर की (key) और आपके द्वारा बनाए गए सभी क्लाइंट्स मौजूद होते हैं। उस वॉल्यूम का बैकअप लें, अन्यथा रीबिल्ड करने पर आपके सभी पीयर्स (peers) हट जाएंगे। यदि आप उन फ़ाइलों को होस्ट फ़ाइलसिस्टम पर देखना पसंद करते हैं, तो इसे बाइंड माउंट से बदल दें, और ऐसा करने से पहले बाइंड माउंट और नेम्ड वॉल्यूम के बीच का अंतर पढ़ें, क्योंकि अनुमतियाँ (permissions) अलग तरह से काम करती हैं।

NET_ADMIN, SYS_MODULE और sysctls की आवश्यकता क्यों है

डिफ़ॉल्ट रूप से एक कंटेनर को नेटवर्क स्टैक को छूने की अनुमति नहीं होती है, और इनमें से प्रत्येक पंक्ति एक विशिष्ट बाधा को हटाती है।

NET_ADMIN कंटेनर को wg0 इंटरफ़ेस बनाने, उसे एक एड्रेस असाइन करने और रूट लिखने की अनुमति देता है। इसके बिना कंटेनर शुरू तो होता है लेकिन इंटरफ़ेस को अप करते समय बंद हो जाता है, क्योंकि ip link add wg0 type wireguard, Operation not permitted रिटर्न करता है।

SYS_MODULE और रीड-ओनली /lib/modules माउंट कंटेनर को WireGuard कर्नल मॉड्यूल लोड करने की अनुमति देते हैं, यदि होस्ट ने इसे पहले से लोड नहीं किया है। मॉड्यूल होस्ट कर्नल पर रहता है, न कि इमेज के अंदर, इसीलिए होस्ट डायरेक्टरी का दिखाई देना आवश्यक है। आधुनिक कर्नल पर मॉड्यूल आमतौर पर इन-बिल्ट होता है, और आप होस्ट पर sudo modprobe wireguard && echo ok के साथ इसकी पुष्टि कर सकते हैं।

net.ipv4.ip_forward=1 कर्नल को उन पैकेटों को फॉरवर्ड करने के लिए कहता है जो स्वयं बॉक्स को संबोधित नहीं हैं। इसके बिना एक क्लाइंट कनेक्ट होता है, हैंडशेक सफल हो जाता है, और फिर इंटरनेट पर जाने वाला प्रत्येक पैकेट ड्रॉप हो जाता है, जिससे ping 1.1.1.1 टाइम आउट हो जाता है जबकि VPN कनेक्टेड दिखाई देता है।

net.ipv4.conf.all.src_valid_mark=1 वह है जो लोगों को आश्चर्यचकित करता है। WireGuard अपने स्वयं के आउटगोइंग पैकेटों को मार्क करता है ताकि उन्हें वापस टनल में रूट न किया जाए। स्ट्रिक्ट रिवर्स पाथ फ़िल्टरिंग एक ऐसे पैकेट को देखती है जिसका सोर्स एड्रेस अपेक्षित रूट से मेल नहीं खाता है और उसे ड्रॉप कर देती है। यह sysctl कर्नल को मार्क किए गए पैकेटों को स्वीकार करने के लिए कहता है, जो एक पूर्ण टनल को स्वयं को तोड़ने से रोकता है।

इसे शुरू करें और एडमिन अकाउंट बनाएं

cd /etc/docker/containers/wg-easy
sudo docker compose up -d
sudo docker compose logs -f

docker compose up और docker compose down का उपयोग करें, न कि start और stop का। अपस्ट्रीम चेतावनी देता है कि अलग सेटिंग्स के तहत बनाए गए कंटेनर पर start का उपयोग करने से नेटवर्क असंगत स्थिति में आ जाता है। यदि आप रीबूट के बाद स्टैक को वापस चाहते हैं, तो restart: unless-stopped इसे पहले ही कवर करता है, और compose सेवाओं के बूट व्यवहार यह समझाते हैं कि वह पॉलिसी क्या वादा करती है और क्या नहीं।

वेब UI TCP 51821 पर लिसन करता है। पहली बार विजिट करने पर यह एक सेटअप पेज दिखाता है जहाँ आप एडमिन अकाउंट बनाते हैं और उस होस्ट एड्रेस की पुष्टि करते हैं जिसका उपयोग क्लाइंट सर्वर तक पहुँचने के लिए करेंगे। वह होस्ट एड्रेस हर क्लाइंट कॉन्फ़िगरेशन की Endpoint लाइन में दर्ज हो जाता है, इसलिए यह VPS का पब्लिक IP या DNS नाम होना चाहिए। यदि यह गलत है, तो आपके द्वारा फोन को दिया गया QR कोड ऐसी जगह पॉइंट करेगा जहाँ पहुँचा नहीं जा सकता और हैंडशेक कभी पूरा नहीं होगा।

उस पोर्ट के बारे में एक और बात: wg-easy 15 सादे HTTP को अस्वीकार कर देता है जब तक कि आप INSECURE=true सेट न करें। इसे अनट्रस्टेड सर्टिफिकेट के साथ HTTPS पर एक्सेस करना, या इसके सामने रिवर्स प्रॉक्सी पर TLS टर्मिनेट करना, दोनों ठीक हैं। डिफ़ॉल्ट सेटिंग्स के साथ इसे http:// पर एक्सेस करना सही नहीं है।

UI पोर्ट को इंटरनेट पर पब्लिश न करें

compose फ़ाइल 51821 पोर्ट को हर इंटरफ़ेस पर पब्लिश करती है। यह एक ऐसे बॉक्स का लॉगिन पेज है जो आपके ट्रैफ़िक को रूट कर सकता है, और इसे दुनिया के लिए खुला नहीं होना चाहिए। Docker में पोर्ट पब्लिश करने से DOCKER चेन में नियम लिखे जाते हैं, जिसका मूल्यांकन ufw से पहले होता है, इसलिए ufw का deny नियम इसे बंद नहीं करता है। यह एक महत्वपूर्ण तकनीकी बारीकी है, और Docker द्वारा पब्लिश किए गए पोर्ट ufw को क्यों अनदेखा करते हैं में इसे विस्तार से समझाया गया है।

इसका सरल समाधान यह है कि UI को loopback पर बाइंड करें और इसे SSH टनल के माध्यम से एक्सेस करें:

    ports:
      - "51820:51820/udp"
      - "127.0.0.1:51821:51821/tcp"
    environment:
      - INSECURE=true

इसके बाद अपने लैपटॉप से यह कमांड चलाएँ:

ssh -L 51821:127.0.0.1:51821 youruser@your.server.address

अपने लैपटॉप के ब्राउज़र में http://127.0.0.1:51821 खोलें। ट्रैफ़िक SSH द्वारा एन्क्रिप्ट किया गया है, यह पोर्ट किसी और को जवाब नहीं देता है, और INSECURE=true यहाँ सुरक्षित है क्योंकि सादा HTTP हॉप कभी भी loopback इंटरफ़ेस से बाहर नहीं जाता है।

UDP 51820 खोलें और दोनों फायरवॉल की जाँच करें

WireGuard को इंटरनेट से UDP 51820 पोर्ट तक पहुँच की आवश्यकता होती है। Docker इसे पब्लिश करता है, लेकिन कई प्रोवाइडर VPS के सामने एक अलग नेटवर्क फायरवॉल रखते हैं जिसके बारे में Docker को जानकारी नहीं होती है। दोनों स्थानों पर पोर्ट खोलें। यदि आप ufw के साथ होस्ट फायरवॉल को मैनेज करते हैं, तो VPS के लिए बुनियादी ufw नियम लिखना nftables को मैन्युअल रूप से लिखने की तुलना में आसान तरीका है।

जाँचें कि कंटेनर वास्तव में लिसन कर रहा है या नहीं:

sudo ss -ulnp | grep 51820

आपको एक लिसनिंग UDP सॉकेट दिखाई देना चाहिए। उस लाइन पर कुछ भी न दिखने का मतलब है कि कंटेनर ने इंटरफ़ेस को कभी चालू नहीं किया, और sudo docker compose logs wg-easy कारण बताएगा।

क्लाइंट बनाएँ और उसे फोन पर स्कैन करें

UI में, एक क्लाइंट बनाएँ और उसे कोई ऐसा नाम दें जिसे आप बाद में पहचान सकें, जैसे कि वह डिवाइस जिससे वह संबंधित है। wg-easy अगला खाली टनल पता आवंटित करता है और आपके लिए की-पेयर (key pair) जनरेट करता है। प्रत्येक क्लाइंट पंक्ति एक QR कोड और एक डाउनलोड करने योग्य .conf फ़ाइल प्रदान करती है।

फोन पर आधिकारिक WireGuard ऐप इंस्टॉल करें, QR कोड से टनल जोड़ने का विकल्प चुनें, और कैमरे को अपनी स्क्रीन पर मौजूद कोड की ओर इंगित करें। टनल आपके द्वारा टाइप किए गए नाम के साथ दिखाई देता है। इसे चालू करें, और UI में क्लाइंट पंक्ति ट्रांसफर काउंटर और हालिया हैंडशेक समय दिखाना शुरू कर देगी।

यदि कोई क्लाइंट इसे सक्षम करने के बाद भी हैंडशेक नहीं दिखाता है, तो वह सर्वर तक बिल्कुल नहीं पहुँच पा रहा है। यह UDP 51820 की ओर इशारा करता है, जो या तो प्रोवाइडर फ़ायरवॉल पर हो सकता है या कॉन्फ़िगरेशन में डाले गए एंडपॉइंट पते में समस्या हो सकती है। यदि कोई क्लाइंट हैंडशेक तो दिखाता है लेकिन इंटरनेट काम नहीं कर रहा है, तो यह फ़ॉरवर्डिंग या DNS की समस्या की ओर इशारा करता है।

डेस्कटॉप पर, .conf फ़ाइल डाउनलोड करें और उसे दोबारा टाइप करने के बजाय WireGuard क्लाइंट में इम्पोर्ट करें। उस फ़ाइल में मौजूद प्राइवेट की एक बार जनरेट होती है और एक बार ही दिखाई जाती है। इस फ़ाइल के साथ वैसा ही व्यवहार करें जैसा आप SSH प्राइवेट की के साथ करते हैं।

UI से आगे कब बढ़ें

जब आपके पीयर केवल लोग और फोन हों, तब wg-easy सही टूल है। कॉन्फ़िगरेशन फ़ाइलों को संपादित करने की तुलना में UI तेज़ है, और खोए हुए फोन को हटाना केवल एक क्लिक का काम है।

जब आप कुछ ऐसा करना चाहेंगे जिसे UI सपोर्ट नहीं करता, तब आप इसकी सीमाओं तक पहुँच जाएंगे। साइट-टू-साइट रूटिंग, जहाँ किसी पीयर का AllowedIPs एक एकल पते के बजाय पूरे रिमोट सबनेट को कवर करता है, आमतौर पर पहली बाधा होती है। प्रति-पीयर रूटिंग नियमों के साथ स्प्लिट टनल, या आपके प्रोविज़निंग टूल द्वारा जनरेट की गई कॉन्फ़िगरेशन, अगली बाधाएं हैं। उस बिंदु पर, मैन्युअल सेटअप कठिन नहीं होता, बस अलग होता है, और साधारण WireGuard गाइड वही टनल दिखाती है जिसे wg0.conf से बनाया गया है। यदि आप कंट्रोल प्लेन को पूरी तरह से चलाना बंद करना चाहते हैं, तो WireGuard की Tailscale के साथ तुलना प्रबंधित विकल्प को कवर करती है।

यदि ऊपर दिया गया compose सिंटैक्स WireGuard के बजाय अपरिचित हिस्सा था, तो VPS पर Docker Compose की मूल बातें फ़ाइल प्रारूप और दैनिक कमांड की व्याख्या करती है।

FAQ

wg-easy मेरे WG_HOST और PASSWORD_HASH को अनदेखा क्यों करता है?

ये वेरिएबल wg-easy 14 से संबंधित हैं। संस्करण 15 एक पूर्ण पुनर्लेखन है, और अपस्ट्रीम ने लगभग सभी कॉन्फ़िगरेशन को वेब UI में एडमिन पैनल में स्थानांतरित कर दिया है। कंटेनर किसी भी वेरिएबल को नहीं पढ़ता है, इसलिए यह सामान्य रूप से शुरू होता है और फिर आपसे पहली बार आने पर एक एडमिन खाता बनाने के लिए कहता है। उस सेटअप पेज पर क्लाइंट-फेसिंग होस्ट एड्रेस सेट करें।

क्या मुझे SYS_MODULE की आवश्यकता है यदि मेरे कर्नेल में पहले से ही WireGuard है?

नहीं। SYS_MODULE और /lib/modules माउंट इसलिए मौजूद हैं ताकि कंटेनर मॉड्यूल को तब लोड कर सके जब होस्ट में यह न हो। ऐसे होस्ट पर जहाँ sudo modprobe wireguard पहले से ही सफल है, इस क्षमता का उपयोग नहीं होता है। इसे हटाना एक उचित हार्डनिंग कदम है, और NET_ADMIN की आवश्यकता किसी भी स्थिति में बनी रहती है।

क्लाइंट कनेक्ट हो जाता है लेकिन इंटरनेट नहीं चलता है। क्या समस्या है?

बिना ट्रैफ़िक के हैंडशेक का मतलब लगभग हमेशा फॉरवर्डिंग होता है। पुष्टि करें कि net.ipv4.ip_forward=1 और net.ipv4.conf.all.src_valid_mark=1 अभी भी compose फ़ाइल में हैं, क्योंकि हाथ से संपादित कॉपी में अक्सर ये छूट जाते हैं। यदि फॉरवर्डिंग चालू है, तो उस DNS सर्वर की जाँच करें जो क्लाइंट को प्राप्त हुआ है। एक टनल जो सभी ट्रैफ़िक को VPN के माध्यम से भेजती है लेकिन ऐसे DNS सर्वर की ओर इशारा करती है जिस तक वह अब नहीं पहुँच सकती, ब्राउज़र में मृत कनेक्शन जैसी दिखती है।

मैं अपने क्लाइंट्स का बैकअप कैसे लूँ?

सब कुछ etc_wireguard नामित वॉल्यूम में, एक wg0.json फ़ाइल में रहता है। UI में एक बैकअप बटन भी है जो समान डेटा को एक्सपोर्ट करता है। किसी भी अपग्रेड से पहले उस फ़ाइल को सर्वर से बाहर कहीं कॉपी करें। रिस्टोर करने के लिए नए कंटेनर पर सेटअप चरण के दौरान इसे अपलोड करें।

क्या मैं wg-easy को रिवर्स प्रॉक्सी के पीछे चला सकता हूँ?

हाँ। प्रॉक्सी को TCP 51821 के सामने रखें, वहाँ TLS समाप्त करें, और कंटेनर पर INSECURE=true सेट करें ताकि यह प्रॉक्सी से आने वाले प्लेन HTTP हॉप को स्वीकार कर सके। UDP 51820 को सीधे प्रकाशित रखें, क्योंकि VPN ट्रैफ़िक UDP है और यह HTTP प्रॉक्सी के माध्यम से नहीं गुजरता है।