- Wag एक प्रोजेक्ट है जो WireGuard में मल्टी-फैक्टर ऑथेंटिकेशन, route restrictions और device registration जोड़ता है, जिससे MFA की जरूरत वाले routes और हमेशा accessible public routes को अलग-अलग किया जा सकता है
- नए client registration API, high availability, real-time user updates और notifications, Security Key·SSO·PAM·TOTP जैसे कई MFA integrations उपलब्ध कराता है
- server चलाने के लिए IP forwarding enable होना जरूरी है; manual run के लिए
iptablesऔरlibpaminstall करने होंगे, औरiptablesव WireGuard device management के लिए root execution जरूरी है - management web UI और CLI से किया जा सकता है; CLI में
start,registration,devices,users,webadminsubcommands हैं, जो registration tokens, device locking, MFA reset और web admin accounts संभालते हैं - सीमाओं में प्रति client केवल एक
AllowedIPsupport शामिल है; यह मुख्य रूप से Linux-only है और Windows कुछ अतिरिक्त steps के बाद काम कर सकता है
Wag द्वारा जोड़ी जाने वाली WireGuard capabilities
- Wag WireGuard में MFA, route restrictions और device registration जोड़ता है
- routes को MFA authentication की जरूरत वाले paths और हमेशा accessible public routes के रूप में अलग-अलग define किया जा सकता है
- नए clients को register करने के लिए आसान API देता है
- high availability, real-time user updates और notifications support करता है
- MFA integrations में ये methods शामिल हैं
- Security Key
- SSO
- PAM
- TOTP
- documentation Documentation पर उपलब्ध है
installation और runtime requirements
- server पर forwarding enabled होना चाहिए
- IPv4 के लिए
net.ipv4.ip_forward=1setting इस्तेमाल होती है - IPv6 के लिए
net.ipv6.conf.all.forwarding=1जैसी संबंधितsysctlsettings इस्तेमाल होती हैं
- IPv4 के लिए
- Docker Compose run example में
wagvpn/wag:latestimage इस्तेमाल होती है- management page port example:
4433/tcp - public registration page port example:
8081/tcp - WireGuard port example:
53230/udp /dev/net/tundevice को container से जोड़ा जाता है
- management page port example:
- manual installation के लिए
iptablesऔरlibpamजरूरी हैं iptablesऔर WireGuard device manage करने के लिए Wag को root के रूप में run करना होगा- binary releases के लिए
glibc 2.31+जरूरी है - source build के लिए
go1.23.1औरnpmजरूरी हैं
management methods
- management UI enable करने के बाद Wag configure करने पर पहला admin बनाया जाता है, और password STDOUT पर output होता है
- इसके बाद web UI में login करके users manage किए जा सकते हैं
- root users CLI से Wag server manage कर सकते हैं
- CLI format
wag subcommand [-options]है - supported subcommands ये हैं
start: Wag server start करता है और daemonize नहीं करताregistration: registration token create, delete और list operations संभालता हैdevices: WireGuard devices की list, delete, lock, unlock और active MFA sessions view करना संभालता हैusers: user MFA management, user deletion, account locking और MFA reset संभालता हैwebadmin: web UI admin users add, delete, list, account lock और unlock संभालता हैversion,firewallभी supported commands में शामिल हैं
registration tokens और MFA flow
- नया device register करने के लिए पहले
wag registration -add -username testerजैसे command से registration token बनाया जाता है - बने हुए token को public registration endpoint पर भेजने से WireGuard configuration response मिल सकता है
- लौटाए गए configuration में
Interface,PrivateKey,Address,Peer,Endpoint,PublicKey,AllowedIPs,PersistentKeepAliveजैसी entries शामिल होती हैं - user server के VPN address से connect करके 2FA code enter करता है
- session expire होने तक की duration configuration file में specify की जाती है
web management console
- management console में login करने के लिए
Webserver.Management.Enabledकोtrueset करना होगा - console में
sudo ./wag webadmin -add -username <your_username> -password <your-password-here>से web admin account add किया जाता है - इसके बाद management listening address पर जाकर credentials enter किए जाते हैं
- web interface खुद admin user add नहीं कर सकता
- management portal को public internet पर expose न करने की सलाह दी जाती है;
ListenAddressको127.0.0.1याlocalhostपर set करके SSH forwarding से expose करने की approach recommended है
key configuration items
NumberProxiesclient के आगे trusted reverse proxies की संख्या specify करता है, जिससे WagX-Forward-Forको ध्यान में रखकर client IP parse करता हैSocketWag control socket है; इसे बदलने से same machine पर कई Wag instances run किए जा सकते हैंNATmasquerading को on/off करता है; enable होने पर सारा traffic ऐसा दिखता है जैसे वह VPN server से शुरू हुआ होNATExcludeRangesNAT=trueहोने पर NAT से exclude किए जाने वाले CIDR ranges specify करता हैExposePortsVPN server के ports को clients के लिए expose करता है औरiptablesrules add करता हैCheckUpdatesdefault रूप से off है; enable करने पर management UI नए Wag version notifications दिखाता है औरapi.github.comaccess करता हैAclsgroups और policies define करता है, लेकिन यह सिर्फ पहली run पर लागू होता है; runtime के दौरान web UI से edit किया जाता हैWebserverpublic registration endpoint, tunnel MFA portal और management portal settings शामिल करता हैWireguarddevice name, listening port, private key, VPN द्वारा handle किया जाने वाला subnet, MTU और DNS servers configure करता हैClusteringcluster name, etcd cluster state, log level, witness node, database location और cluster certificate related settings शामिल करता है
ACL policy behavior
Policiesउन routes को define करता है जिन्हें VPN capture करेगा, और उन ports/protocols को जिन्हें Wag से होकर गुजरने दिया जाएगा- rule application subnet prefix length का उपयोग करता है, और सबसे specific match route access level तय करता है
- उदाहरण के लिए, अगर
/16को MFA के रूप में define किया गया है और उसके अंदर किसी specific/32को Allow के रूप में define किया गया है, तो अधिक specific/32priority लेता है और MFA के बिना access संभव होता है - यह behavior
v6.0.0में बदला गया था; पहले MFA routes हमेशा priority लेते थे - एक route पर कई policies define होने पर policies compose होती हैं, और MFA rule priority लेता है
- अभी release न हुई version से
Denyrules के जरिए route access block किया जा सकता है - सबसे specific rule एक नया rule “bucket” बनाता है, इसलिए अगर
/32bucket में सिर्फ deny है, तो उसी/32के अन्य ports तक access भी allow नहीं हो सकता
port और protocol rules
- service access को port और protocol rules से define किया जा सकता है
- supported rule types 3 हैं
- Any: अगर कोई अलग rule नहीं है या
anykeyword इस्तेमाल किया गया है, तो सभी service और port combinations allow होते हैं - Single Service:
192.168.1.1 22/tcp 53/udpकी तरह host के specific TCP·UDP ports allow करता है - Ranges:
192.168.1.1 22-1024/tcp 23-53/anyकी तरह port ranges specify करता है
- Any: अगर कोई अलग rule नहीं है या
- port range में lower port पहले लिखना होगा
- ICMP में ports नहीं होते, इसलिए
1.1.1.1 icmpकी तरह बिना port के specify किया जा सकता है
limitations और development
- Wag प्रति client केवल एक
AllowedIPsupport करता है - यह limitation client से server तक जाने वाली structure के लिए उपयुक्त है
- यह मुख्य रूप से Linux-only है, और Windows कुछ extra work के बाद काम कर सकता है
- development mode में tunnel से आने वाली requests की IP को client IP के रूप में set करने के लिए environment variable इस्तेमाल किया जा सकता है
- test example
internal/routerमेंsudo go test -v .run करता है - external contributions के लिए guidance है कि feature addition या bug fix के समय, जहां संभव हो tests लिखें और Pull Request खोलें
1 टिप्पणियां
Hacker News टिप्पणियाँ
देखने में अच्छा लगता है, लेकिन कुछ बातें खटकती हैं
curl [http://public.server.address:8080/register_device?key=e83253...](<http://public.server.address/register_device/…;)उदाहरण और “सेवा पूरी तरह templated response लौटाती है” वाले विवरण को देखकर लगता है कि रजिस्ट्रेशन प्रक्रिया में client private key बनाकर public key server को भेजने के बजाय server private key बनाकर client को भेज रहा हैइसके अलावा उदाहरण HTTP का है, इसलिए कम-से-कम वह हिस्सा बदलना बेहतर होगा ताकि लोग यह न समझें कि HTTP भी ठीक विकल्प है
यह भी जानना चाहूँगा कि session expire होने पर client को इसका पता लगाने का कोई तरीका है या नहीं। या फिर SSH session जैसी चीज़ें बस रुक जाती हैं?
मैं कभी-कभी ऐसा WireGuard client ढूँढता रहा हूँ जो Wi-Fi की captive portal detection की तरह काम करे। आदर्श रूप से config file में
persistentkeepaliveजैसी एक पंक्ति जोड़कर URL fetch करे और समय-समय पर उसे जाँचता रहे।OKआए तो सब ठीक, response न आए तो network समस्या, औरLocationheader आए तो browser उस स्थान पर खोलकर session re-authentication वगैरह कराई जाएअभी तक ऐसा client नहीं मिला
pubkeyparameter भी ले सकता है, इसलिए server द्वारा private key generate करने के तरीके पर निर्भर रहना ज़रूरी नहीं है। documentation कम है, इसलिए भ्रम होना स्वाभाविक हैआखिरी सवाल का जवाब दूँ तो, मैं जो eBPF XDP इस्तेमाल करता हूँ उसमें सिर्फ
PASS,DROP,REDIRECTही संभव है। इसलिए सबसे आसान नतीजेPASS/DROPसे ही handle करता हूँ, और connection बस रुक जाता हैहालांकि captive portal detection page को wag MFA सूची में जोड़ दें तो detection आप खुद configure कर सकते हैं, और उसके बाद browser बाकी काम संभाल लेगा
wag में intercept या proxy जैसी functionality लागू करने का इरादा नहीं है। उससे authentication expiry या logout को संभालना थोड़ा आसान हो सकता है, लेकिन वह दिशा नहीं है
मैंने Mac के लिए एक Go client लिखा था, और Brew के command line
wgका इस्तेमाल करके key generation भी संभाला, लेकिन वह भद्दा था औरsudoचाहिए होता थाnetwork permissions का उपयोग करने वाला कोई proper native app बेहतर होता, लेकिन वह मेरी क्षमता से बाहर है
यह जानना चाहूँगा कि session management की समस्या पर पहले से काम हुआ है या आगे करने की योजना है
मूल रूप से WireGuard key एक स्थायी session key जैसी होती है
अगर WireGuard transport layer लागू करने वाला software एक सही VPN server solution है, तो उसे session management भी implement करना चाहिए। यानी server के साथ दूसरे channel के जरिए session key को समय-समय पर rotate करना, session खत्म करना, IP address बदलना, नए routes set करना, और ज़रूरत हो तो फिर से authentication कराना चाहिए
WireGuard key wag server से communicate करने देती है, लेकिन वास्तविक session एक eBPF map में रखा जाता है जो यह बताता है कि user authenticated है या नहीं
इसलिए अगर कोई private key material चुरा भी ले, तब भी वह MFA-सीमित routes तक पहुँच नहीं पाएगा
यह जानना चाहता हूँ कि TOTP code brute force को रोका जा रहा है या नहीं, जैसे rate limit या retry count limit
मैंने code को जल्दी से देखा, लेकिन ऐसा handling नहीं मिला
जो scenario मैं सोच रहा हूँ वह यह है कि कोई browser में TOTP input UI खोले, developer tools चालू करे, और सभी संभव TOTP codes को बार-बार आज़माए
खास तौर पर इरादा यह भी है कि user सोचे कि device आखिर authentication को ज़बरदस्ती क्यों ट्रिगर कर रहा है। क्योंकि ऐसी स्थिति endpoint compromise का संकेत हो सकती है
यह Headscale या Tailscale से काफ़ी मिलता-जुलता लगता है। WireGuard network को manage करने के विकल्प दिखना अच्छा है
मैं जानना चाहूँगा कि features कहाँ तक overlap करते हैं, क्या extra जोड़ा गया है, क्या अलग है, और आगे क्या implement नहीं किया जाएगा—क्या इसके लिए कोई comparison material है?
मैंने documentation में सीधी तुलना नहीं डाली, और फिलहाल यह वह दिशा नहीं है जहाँ मैं जाना चाहता हूँ। यह project मेरी ज़रूरतों के हिसाब से है और काफ़ी मज़ेदार भी है
Wag, Tailscale-शैली के mesh की तुलना में—जहाँ सब कुछ एक-दूसरे तक पहुँचता है और rules overlay को define करते हैं—ज़्यादा hub-and-spoke architecture के लिए उपयुक्त है, जहाँ आप मज़बूत boundaries चाहते हैं
wag और Tailscale दोनों SSO integration और user protection के लिए लगभग 2FA जोड़ते हैं
दोनों में registration methods और management के लिए web UI है, लेकिन मैं web development पसंद न करने वाला solo developer हूँ, इसलिए Tailscale काफ़ी ज़्यादा polished होगा
जिस चीज़ को मैं निश्चित रूप से implement नहीं करूँगा, वह है session logout के बाद user को redirect करने के लिए interception या TLS proxy वाला हिस्सा। मुख्य कारण यह है कि अभी eBPF के साथ वह मेरे लिए थोड़ा भारी है, और उसे काम कराने के लिए शायद जो DNAT/SNAT component लिखने पड़ेंगे, उन्हें मैं इस्तेमाल नहीं करना चाहता
IPv4-only होना थोड़ा अजीब है; जो site WireGuard चुनती है, उससे ज़्यादा आधुनिक setup और self-service ULA का उपयोग करने की उम्मीद की जा सकती है
ULA का ज़िक्र करते समय क्या आपके मन में कोई खास बात थी?