Docker मध्ये wg-easy WireGuard वेब UI सेटअप
Docker Compose मध्ये wg-easy साठी ports, NET_ADMIN आणि आवश्यक sysctls कसे सेट करायचे ते शिका. फोनसाठी QR code onboarding आणि v15 मधील environment बदलही दिले आहेत.
तुम्ही काय तयार करत आहात
wg-easy हे वेब इंटरफेससह WireGuard आहे आणि ते एकाच Docker कंटेनरमध्ये चालते. ते तुमच्यासाठी WireGuard इंटरफेस व्यवस्थापित करते आणि क्लायंट तयार करण्यासाठी ब्राउझर UI जोडते. तुम्ही तयार केलेल्या प्रत्येक क्लायंटला config file आणि QR code मिळतो. त्यामुळे फोनचा कॅमेरा स्क्रीनकडे धरून फोन VPN शी जोडता येतो.
Tunnel स्वतः सामान्य WireGuard असते. Kernel module packets हलवते, त्यामुळे throughput हाताने केलेल्या setup इतकाच असतो. तुम्हाला client lifecycle व्यवस्थापन मिळते: SSH वरून config file संपादित न करता peers जोडणे, अक्षम करणे आणि हटवणे. मात्र त्या config वर थेट नियंत्रण राहत नाही. याच विषयावर VPS वरील मॅन्युअल WireGuard setup मध्ये माहिती दिली आहे.
तुमच्याकडे public IPv4 address असलेला KVM VPS, Compose plugin सह Docker Engine आणि root access असणे आवश्यक आहे. OpenVZ किंवा LXC सारखे host kernel share करणारे container virtualisation प्रकार सहसा WireGuard module load करू शकत नाहीत. त्यामुळे container interface सुरू करण्यात अपयशी ठरते.
Version 15 ने सेटिंग्ज environment मधून हलवल्या
तुम्हाला सापडणारी बहुतेक मार्गदर्शिका wg-easy 14 साठी लिहिलेली आहे. त्या आवृत्तीत तुम्ही WG_HOST मध्ये server address आणि PASSWORD_HASH मध्ये admin password चा bcrypt hash सेट करत होता. ही दोन्ही मूल्ये environment variables म्हणून सेट केली जात होती. Version 15 ही पूर्णपणे पुनर्लिखित आवृत्ती आहे. अधिकृत migration notes मध्ये स्पष्टपणे नमूद केले आहे की v15 मध्ये v14 सारखीच environment variables वापरली जात नाहीत. त्यांपैकी बहुतेक सेटिंग्ज web UI मधील admin panel मध्ये हलवण्यात आल्या आहेत.
त्यामुळे WG_HOST आणि PASSWORD_HASH यांचा आता कोणताही परिणाम होत नाही. तुम्ही जुनी compose file कॉपी केल्यास container सुरू होतो, त्या ओळींकडे दुर्लक्ष करतो आणि त्यानंतर browser मध्ये admin account तयार करण्यास सांगतो. ही त्रुटी नाही. ही नवीन setup flow आहे.
July 2026 पर्यंत pin करण्यासाठी major tag 15 आहे. latest वापरण्याऐवजी major version pin करा. Major upgrade मुळे on-disk config format बदलतो आणि तो स्वच्छपणे rollback करता येत नाही.
Compose फाइल
स्टॅकसाठी एक डिरेक्टरी तयार करा आणि त्यात अधिकृत Compose फाइल लिहा. ही upstream फाइल आहे; तिच्यात कोणताही बदल केलेला नाही.
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::/64etc_wireguard हा named volume आहे. त्यात server key आणि तुम्ही तयार केलेला प्रत्येक client साठवला जातो. या volume चा backup घ्या. अन्यथा rebuild केल्यावर तुमचे सर्व peers नष्ट होतील. या फाइल्स host filesystem वर पाहायच्या असल्यास, त्याऐवजी bind mount वापरा. तसे करण्यापूर्वी bind mounts आणि named volumes मधील फरक वाचा, कारण permissions वेगळ्या प्रकारे लागू होतात.
याला NET_ADMIN, SYS_MODULE आणि sysctls का आवश्यक आहेत
कंटेनरला डीफॉल्टनुसार नेटवर्क स्टॅकला स्पर्श करण्याची परवानगी नसते. यापैकी प्रत्येक ओळ एक विशिष्ट अडथळा दूर करते.
NET_ADMIN मुळे कंटेनरला wg0 इंटरफेस तयार करता येतो, त्याला पत्ता देता येतो आणि रूट लिहिता येतात. हे नसल्यास इंटरफेस सुरू करताना कंटेनर सुरू होऊन लगेच बंद पडतो, कारण ip link add wg0 type wireguard Operation not permitted परत करते.
SYS_MODULE आणि केवळ-वाचनासाठी केलेले /lib/modules mount यांमुळे host ने WireGuard kernel module आधीच लोड केलेला नसल्यास कंटेनर तो लोड करू शकतो. हा module image च्या आत नसून host kernel मध्ये असतो. त्यामुळे host वरील directory दृश्यमान असणे आवश्यक आहे. आधुनिक kernel मध्ये हा module सामान्यतः built in असतो. host वर sudo modprobe wireguard && echo ok वापरून याची खात्री करता येते.
net.ipv4.ip_forward=1 मुळे स्वतःच्या box साठी उद्दिष्टित नसलेली packets kernel forward करते. हे नसल्यास client connect होतो, handshake यशस्वी होते आणि त्यानंतर internet कडे जाणारे प्रत्येक packet drop केले जाते. त्यामुळे VPN connected दिसत असतानाही ping 1.1.1.1 timeout होते.
net.ipv4.conf.all.src_valid_mark=1 मुळे अनेकांना आश्चर्य वाटते. WireGuard स्वतःच्या outgoing packets वर mark लावते, जेणेकरून ते पुन्हा tunnel मध्ये route होऊ नयेत. Strict reverse path filtering ला source address अपेक्षित route शी जुळत नसलेला packet दिसतो आणि तो drop केला जातो. हा sysctl kernel ला marked packets स्वीकारण्यास सांगतो. त्यामुळे full tunnel स्वतःच खंडित होत नाही.
ते सुरू करा आणि प्रशासक खाते तयार करा
cd /etc/docker/containers/wg-easy
sudo docker compose up -d
sudo docker compose logs -fdocker compose up आणि docker compose down वापरा; start आणि stop वापरू नका. वेगवेगळ्या सेटिंग्जखाली तयार केलेल्या कंटेनरवर start चालवल्यास नेटवर्कची स्थिती विसंगत राहते, असा Upstream चा इशारा आहे. रीबूटनंतर stack पुन्हा सुरू करायचा असल्यास restart: unless-stopped मध्ये त्याची तरतूद आधीच आहे. compose सेवांचे बूट वर्तन हे धोरण कोणत्या गोष्टींची हमी देते आणि कोणत्या गोष्टींची देत नाही, हे स्पष्ट करते.
वेब UI TCP 51821 वर ऐकते. पहिल्यांदा उघडल्यावर ते सेटअप पृष्ठ दाखवते. येथे प्रशासक खाते तयार करा आणि क्लायंट server पर्यंत पोहोचण्यासाठी वापरतील त्या host address ची पुष्टी करा. हा host address प्रत्येक client config मधील Endpoint ओळीत समाविष्ट होतो. त्यामुळे तो VPS चा public IP किंवा DNS नाव असणे आवश्यक आहे. तो चुकीचा असल्यास, फोनला दिलेला QR code पोहोचता न येणाऱ्या पत्त्याकडे निर्देश करतो आणि handshake पूर्ण होत नाही.
त्या port बाबत आणखी एक मुद्दा आहे: INSECURE=true सेट केल्याशिवाय wg-easy 15 plain HTTP नाकारते. अविश्वसनीय certificate वापरून HTTPS द्वारे त्यापर्यंत पोहोचणे किंवा त्याच्या समोर reverse proxy मध्ये TLS समाप्त करणे, दोन्ही योग्य पर्याय आहेत. default settings सह http:// द्वारे त्याच्यापर्यंत पोहोचणे योग्य नाही.
UI port इंटरनेटवर प्रकाशित करू नका
Compose फाइल प्रत्येक इंटरफेसवर 51821 प्रकाशित करते. हा अशा सिस्टमसाठी login page आहे जी तुमचा network traffic मार्गित करू शकते. त्यामुळे तो सर्वांसाठी खुला ठेवू नये. Docker मध्ये port प्रकाशित केल्यावर DOCKER chain मध्ये rules लिहिले जातात. त्यांचे मूल्यमापन ufw च्या आधी होते. त्यामुळे ufw deny rule मुळे हा port बंद होत नाही. हा धोका स्वतंत्रपणे समजून घेणे महत्त्वाचे आहे. Docker ने प्रकाशित केलेले ports ufw कडे का दुर्लक्ष करतात यामध्ये त्याचे संपूर्ण स्पष्टीकरण आहे.
सोपे निराकरण म्हणजे UI ला loopback वर bind करणे आणि SSH tunnel द्वारे त्याच्यापर्यंत पोहोचणे:
ports:
- "51820:51820/udp"
- "127.0.0.1:51821:51821/tcp"
environment:
- INSECURE=trueत्यानंतर तुमच्या laptop वर:
ssh -L 51821:127.0.0.1:51821 youruser@your.server.addressतुमच्या laptop वरील browser मध्ये http://127.0.0.1:51821 उघडा. Traffic SSH द्वारे encrypted केला जातो. या port ला इतर कोणीही उत्तर मिळवू शकत नाही. येथे INSECURE=true सुरक्षित आहे, कारण plain HTTP hop loopback interface च्या बाहेर कधीही जात नाही.
UDP 51820 उघडा आणि दोन्ही फायरवॉल तपासा
WireGuard ला इंटरनेटवरून UDP 51820 पोहोचण्यायोग्य असणे आवश्यक आहे. Docker हे प्रकाशित करते. परंतु अनेक प्रदाते VPS च्या पुढे स्वतंत्र नेटवर्क फायरवॉल ठेवतात, ज्याची Docker ला माहिती नसते. दोन्ही ठिकाणी हा पोर्ट उघडा. तुम्ही ufw द्वारे होस्ट फायरवॉल व्यवस्थापित करत असल्यास, VPS साठीचे मूलभूत ufw नियम स्वतः nftables लिहिण्यापेक्षा अधिक सोपा मार्ग आहे.
कंटेनर प्रत्यक्षात ऐकत आहे का ते तपासा:
sudo ss -ulnp | grep 51820तुम्हाला ऐकणारा UDP socket दिसला पाहिजे. त्या ओळीत काहीही दिसत नसल्यास, कंटेनरने interface सुरू केलेला नाही आणि sudo docker compose logs wg-easy त्याचे कारण सांगेल.
फोनवर क्लायंट तयार करा आणि तो स्कॅन करा
UI मध्ये क्लायंट तयार करा आणि नंतर ओळखता येईल असे त्याला नाव द्या, उदाहरणार्थ, तो ज्या डिव्हाइसशी संबंधित आहे त्या डिव्हाइसचे नाव. wg-easy पुढील उपलब्ध tunnel पत्ता नियुक्त करते आणि तुमच्यासाठी key pair तयार करते. प्रत्येक क्लायंटच्या row मध्ये QR code आणि डाउनलोड करता येणारी .conf file उपलब्ध असते.
फोनवर अधिकृत WireGuard app install करा. QR code मधून tunnel add करण्याचा पर्याय निवडा आणि स्क्रीनवरील code कॅमेरासमोर धरा. तुम्ही दिलेल्या नावासह tunnel दिसेल. तो on करा. त्यानंतर UI मधील क्लायंटच्या row मध्ये transfer counters आणि अलीकडील handshake time दिसू लागतो.
क्लायंट enable केल्यानंतर त्यात handshake दिसत नसेल, तर तो server पर्यंत अजिबात पोहोचत नाही. याचे कारण UDP 51820 असू शकते. तपासणी provider firewall किंवा config मध्ये समाविष्ट endpoint address येथे करा. क्लायंटमध्ये handshake दिसत असेल, पण internet कार्यरत नसेल, तर forwarding किंवा DNS मध्ये समस्या असण्याची शक्यता आहे.
Desktop वर .conf file download करा आणि ती पुन्हा टाइप करण्याऐवजी WireGuard client मध्ये import करा. त्या file मधील private key एकदाच generate केली जाते आणि एकदाच दाखवली जाते. त्या file चे संरक्षण SSH private key प्रमाणे करा.
UI पेक्षा पुढे जाण्याची वेळ
तुमचे peers लोक आणि फोन असतील तोपर्यंत wg-easy योग्य साधन आहे. कॉन्फिगरेशन फाइल संपादित करण्यापेक्षा UI जलद आहे. हरवलेल्या फोनचा प्रवेश रद्द करण्यासाठी एका क्लिकची आवश्यकता असते.
UI मध्ये नसलेली एखादी सुविधा हवी असेल, तेव्हा त्याच्या मर्यादा जाणवतील. Site-to-site routing हे सहसा पहिले मोठे आव्हान असते. यामध्ये peer चे AllowedIPs एकाच पत्त्याऐवजी संपूर्ण remote subnet व्यापते. प्रत्येक peer साठी स्वतंत्र routing rules असलेले split tunnels किंवा तुमच्या provisioning tool ने तयार केलेले configuration हे पुढचे टप्पे आहेत. त्या वेळी स्वतः लिहिलेली setup अधिक कठीण नसते; ती फक्त वेगळी असते. साध्या WireGuard मार्गदर्शकामध्ये wg0.conf वापरून हाच tunnel तयार करण्याची पद्धत दाखवली आहे. तुम्हाला control plane चालवणे पूर्णपणे थांबवायचे असल्यास, WireGuard आणि Tailscale ची तुलना managed पर्याय स्पष्ट करते.
वरील compose syntax मधील भाग WireGuard पेक्षा अपरिचित वाटत असेल, तर VPS वरील Docker Compose ची मूलभूत माहिती file format आणि दैनंदिन commands स्पष्ट करते.
FAQ
wg-easy माझे WG_HOST आणि PASSWORD_HASH का दुर्लक्षित करते?
ही चल wg-easy 14 शी संबंधित आहेत. Version 15 मध्ये पुनर्लेखन करण्यात आले आहे आणि upstream ने जवळपास सर्व कॉन्फिगरेशन web UI मधील admin panel मध्ये हलवले आहे. Container यापैकी कोणतेही चल वाचत नाही. त्यामुळे तो नेहमीप्रमाणे सुरू होतो आणि पहिल्यांदा भेट दिल्यावर admin account तयार करण्यास सांगतो. त्या setup page वर client-facing host address सेट करा.
माझ्या kernel मध्ये WireGuard आधीपासून असल्यास SYS_MODULE आवश्यक आहे का?
नाही. SYS_MODULE आणि /lib/modules mount मुळे host वर module उपलब्ध नसल्यास container ते load करू शकतो. ज्या host वर sudo modprobe wireguard आधीपासून यशस्वी होते, तेथे ही capability वापरली जात नाही. ते काढून टाकणे ही योग्य hardening पद्धत आहे. मात्र NET_ADMIN कोणत्याही परिस्थितीत आवश्यक आहे.
Client connect होतो, पण internet उपलब्ध नाही. समस्या काय आहे?
Traffic नसलेला handshake जवळपास नेहमी forwarding समस्येकडे निर्देश करतो. net.ipv4.ip_forward=1 आणि net.ipv4.conf.all.src_valid_mark=1 अजूनही compose file मध्ये आहेत याची खात्री करा, कारण हाताने संपादित केलेल्या copy मधून ते अनेकदा गहाळ होतात. Forwarding सुरू असल्यास, client ला मिळालेला DNS server तपासा. सर्व traffic VPN मधून पाठवणारा tunnel, पण client ला आता पोहोचता न येणाऱ्या DNS server कडे निर्देश करणारा tunnel, browser मध्ये dead connection सारखाच दिसतो.
माझ्या clients चा backup कसा घ्यावा?
सर्व माहिती etc_wireguard named volume मध्ये, wg0.json file मध्ये साठवली जाते. UI मध्ये त्याच data चा export करणारे backup button देखील आहे. कोणतेही upgrade करण्यापूर्वी ती file server च्या बाहेर सुरक्षित ठिकाणी copy करा. Fresh container वरील setup step दरम्यान upload करून restore करता येते.
Reverse proxy च्या मागे wg-easy चालवता येईल का?
होय. Proxy ला TCP 51821 च्या पुढे ठेवा, तेथे TLS terminate करा आणि container वर INSECURE=true सेट करा, जेणेकरून तो proxy कडून येणारा plain HTTP hop स्वीकारेल. UDP 51820 थेट published ठेवा, कारण VPN traffic UDP असते आणि ते HTTP proxy मधून जात नाही.