Wireproxy: HTTP/SOCKS5 प्रॉक्सी के रूप में उपलब्ध WireGuard क्लाइंट
(github.com/pufferffish)- Wireproxy एक पूर्ण user-space WireGuard क्लाइंट है, जो WireGuard peer से कनेक्ट होने के बाद लोकल मशीन पर SOCKS5/HTTP प्रॉक्सी या टनल के रूप में उपलब्ध होता है
- यह उन स्थितियों के लिए बनाया गया है जहाँ आप नया नेटवर्क इंटरफ़ेस सेट किए बिना केवल कुछ साइटों का ट्रैफ़िक WireGuard peer के जरिए भेजना चाहते हैं, या WireGuard कॉन्फ़िगरेशन बदलने के लिए root privileges का उपयोग नहीं करना चाहते
- फीचर्स में TCP static routing, SOCKS5/HTTP प्रॉक्सी, और TLS SNI-आधारित transparent proxy शामिल हैं, जबकि HTTP प्रॉक्सी अभी केवल CONNECT को सपोर्ट करता है
- कॉन्फ़िगरेशन
wg-quickके[Interface],[Peer]semantics का पालन करता है, और मौजूदा WireGuard कॉन्फ़िग फ़ाइल कोWGConfigसे इम्पोर्ट किया जा सकता है या कई peers कोAllowedIPsके जरिए route किया जा सकता है - production उपयोग के लिए यह
--info/-iआधारित health endpoint देता है, जहाँ/metricsऔर/readyzके जरिए WireGuard स्थिति औरCheckAliveआधारित readiness status देखी जा सकती है
Wireproxy क्या करता है
wireproxyएक user-space एप्लिकेशन है जो WireGuard peer से कनेक्ट होता है और लोकल मशीन पर SOCKS5/HTTP प्रॉक्सी या टनल उपलब्ध कराता है- जब आप केवल कुछ खास साइटों को WireGuard peer के जरिए एक्सेस करना चाहते हों, लेकिन नया नेटवर्क इंटरफ़ेस नहीं बनाना चाहते, तब इसका उपयोग किया जा सकता है
- यह नेटवर्क इंटरफ़ेस से पूरी तरह अलग होकर काम करता है और कॉन्फ़िगरेशन के लिए root privileges की ज़रूरत नहीं होती
- जिन उपयोगकर्ताओं को Amnezia VPN जैसा उपयोग चाहिए, वे wireproxy-awg fork का उपयोग कर सकते हैं
सपोर्टेड फीचर्स और जो अभी नहीं हैं
- सपोर्टेड फीचर्स
- client और server के लिए TCP static routing
- SOCKS5/HTTP प्रॉक्सी
- HTTP अभी केवल CONNECT को सपोर्ट करता है
- Server Name Indication का उपयोग करने वाला transparent TLS proxy
- TODO में बचे फीचर्स
- SOCKS5 के लिए UDP सपोर्ट
- UDP static routing
रन और इंस्टॉलेशन
- बेसिक रन फ़ॉर्मेट
./wireproxy [-c path to config]है - मुख्य विकल्प
-c,--config: कॉन्फ़िग फ़ाइल पाथ सेट करता है- डिफ़ॉल्ट पाथ हैं
/etc/wireproxy/wireproxy.conf,$HOME/.config/wireproxy.conf
- डिफ़ॉल्ट पाथ हैं
-s,--silent: silent mode-d,--daemon: बैकग्राउंड में चलाना-i,--info: health status expose करने के लिए address और port सेट करता है-v,--version: version आउटपुट-n,--configtest: केवल कॉन्फ़िग फ़ाइल की वैधता जांचता है
- build, repository clone करने के बाद
makeसे किया जाता है - इंस्टॉलेशन उदाहरण के तौर पर
go install github.com/windtf/wireproxy/cmd/wireproxy@v1.1.2या@latestका उपयोग किया जाता है
कॉन्फ़िगरेशन मॉडल
[Interface]और[Peer]सेटिंग्स का अर्थwg-quickकॉन्फ़िग जैसा ही हैAddressको IPv4 के लिए/32और IPv6 के लिए/128subnet का उपयोग करना चाहिएPrivateKeyमें environment variable reference भी संभव है- यदि आपके पास मौजूदा WireGuard कॉन्फ़िग है, तो उसे
WGConfig = <path to the wireguard config>से इम्पोर्ट किया जा सकता है
टनल और प्रॉक्सी सेटिंग्स
TCPClientTunnel- लोकल मशीन पर प्राप्त TCP ट्रैफ़िक को WireGuard के जरिए तय target तक भेजता है
- उदाहरण flow:
<LAN ऐप> → localhost:25565 → WireGuard → play.cubecraft.net:25565
TCPServerTunnel- WireGuard नेटवर्क से प्राप्त TCP ट्रैफ़िक को लोकल नेटवर्क के तय target तक भेजता है
- उदाहरण flow:
<WireGuard नेटवर्क ऐप> → WireGuard → 172.16.31.2:3422 → localhost:25545
STDIOTunnel- wireproxy process के standard input और output को WireGuard के जरिए TCP target से जोड़ता है
opensshकेProxyCommandparameter के रूप में उपयोगी है
Socks5- लोकल LAN पर SOCKS5 प्रॉक्सी बनाता है और सभी ट्रैफ़िक को WireGuard के जरिए route करता है
- username और password सेट करने पर प्रॉक्सी authentication सक्षम हो जाती है
http- लोकल LAN पर HTTP प्रॉक्सी बनाता है और सभी ट्रैफ़िक को WireGuard के जरिए route करता है
- username और password सेट करने पर authentication सक्षम हो जाती है
CertFileऔरKeyFileसेट करने पर HTTPS सक्षम होता है
SNI- लोकल LAN पर transparent TLS proxy बनाता है, और SNI को routing destination की तरह उपयोग करके WireGuard के जरिए ट्रैफ़िक भेजता है
कई peers और routing
- कई WireGuard peers का उपयोग किया जा सकता है
- कई peers का उपयोग करते समय, wireproxy को यह जानने के लिए AllowedIPs सेट करना ज़रूरी है कि ट्रैफ़िक किस peer को भेजना है
- कॉन्फ़िगरेशन उदाहरण में अलग-अलग
AllowedIPsवाले कई[Peer]और कईTCPServerTunnelसाथ में उपयोग किए गए हैं UDPProxyTunnelका उदाहरण भी शामिल हैBindAddressसे लोकल bind address सेट किया जाता हैTargetसे destination address सेट किया जाता हैInactivityTimeoutयदि0हो, तो timeout नहीं होता
[Resolve]DNS resolution strategy सेट करता हैipv4: A record को प्राथमिकता देता हैipv6: AAAA record को प्राथमिकता देता हैauto: डिफ़ॉल्ट है; यदि WireGuard इंटरफ़ेस के पास केवल IPv4 address है तोipv4जैसा, अन्यथाipv6जैसा व्यवहार करता है
- बिना Endpoint वाले
[Peer]कॉन्फ़िगरेशन से peer को wireproxy से कनेक्ट होने की अनुमति दी जा सकती है
Health endpoint
--info/-iउदाहरण के लिएlocalhost:9080जैसे address और port को लेकर health status metrics देने वाला HTTP server expose करता है- फिलहाल दो endpoint लागू हैं
/metrics: WireGuard daemon की जानकारी expose करता है औरwg showजैसी जानकारी देता है/readyz:CheckAliveमें निर्दिष्ट IP से आख़िरी बार pong मिलने का समय JSON में लौटाता है
- यदि
CheckAliveसेट है, तो निर्धारित address पर हरCheckAliveIntervalसेकंड में WireGuard के जरिए ping भेजा जाता है- डिफ़ॉल्ट
CheckAliveInterval5 सेकंड है - यदि पिछले
CheckAliveIntervalसेकंड के भीतर, 2 सेकंड की अतिरिक्त देरी-छूट सहित, pong नहीं मिलता तो 503 लौटाया जाता है - शर्त पूरी होने पर 200 लौटाया जाता है
- डिफ़ॉल्ट
- यदि
CheckAliveसेट नहीं है, तो/readyzखाली JSON object और 200 लौटाता है - ICMP ping packet किस peer के जरिए route होगा, यह प्रत्येक peer की AllowedIPs सेटिंग पर निर्भर करता है
1 टिप्पणियां
Hacker News की राय
छोटा-सा टूल है, लेकिन शानदार। Firefox के multi-account containers के साथ इसे चुनिंदा टैब को ऐसे होम राउटर के ज़रिए प्रॉक्सी करने के लिए इस्तेमाल कर रहा हूँ, जो WireGuard तो सपोर्ट करता है लेकिन application-layer proxy या SSH नहीं
इसे सेट करने के लिए मुझे लगा था कि https://addons.mozilla.org/en-GB/firefox/addon/container-pro... जैसे अलग extension की ज़रूरत होगी, लेकिन ऐसा नहीं था, और लगता है अब ऐसी गलतफहमी भी downvote की वजह बन जाती है
WireGuard से जो काम करना चाहता था, उसके लिए https://github.com/dariost/soks ज़्यादा उपयुक्त था। यह लगभग वही काम करता है, लेकिन मौजूदा WireGuard interface को reuse करता है
इस्तेमाल करने का तरीका मैंने इस पोस्ट में विस्तार से लिखा है: https://www.nicoco.fr/blog/2023/09/10/wireguard/
routing table को control mechanism की तरह इस्तेमाल करने के बजाय, यह तय करने के लिए SOCKS5 proxy का उपयोग करता दिखता है कि उसे इस्तेमाल करना है या नहीं
पहले मैं Raspberry Pi के Docker container से कुछ मिलता-जुलता करता था, लेकिन user-space समाधान काफी बेहतर विकल्प लगता है क्योंकि यह किसी भी operating system पर चल सकता है और host की routing table को गलती से खराब न करने की गारंटी देता है
onetun भी है: https://github.com/aramperes/onetun
सोच रहा हूँ कि क्या पूरी तरह user-space server implementation भी है। tun/tap device के बिना करने के लिए शायद user-space IP stack जैसी किसी चीज़ की ज़रूरत होगी, हालांकि पक्का नहीं
Go में sockets connect करने वाले Dialer को replace करके, यह effectively socket को WireGuard में wrap कर सकता है। user space में चलता है, इसलिए tun/tap की ज़रूरत नहीं। यह सब @dpeckett ने open source के रूप में जारी किया है
इसी आधार पर DNS resolution सहित user-space WireGuard gateway भी बनाया गया है: https://github.com/noisysockets/gateway
https://news.ycombinator.com/user?id=dpeckett
मेरी समझ के मुताबिक यह Google का user-space TCP/IP stack इस्तेमाल करता है
जब अलग IP चाहिए होता था तब इस्तेमाल किए जाने वाले SSH tunnel की जगह लेने के लिए अच्छा रहेगा
संबंधित टूल के रूप में pproxy भी है, जो कई features में से एक के तौर पर अलग-अलग tunnel protocols को “convert” कर सकता है और routing feature भी रखता है। मैंने SSH SOCKS5 को HTTP proxy में बदलने के लिए इस्तेमाल किया था: https://github.com/moreati/pproxy
मैंने सोचा, “ऐसी चीज़ Go में काफी आसानी से बनाई जा सकती है?”, और जैसा उम्मीद थी, यह Go में लिखा हुआ था
कई multi-protocol proxy clients यह feature सपोर्ट करते हैं। प्रमुख open source उदाहरणों में sing-box, clash-meta और अन्य clash-based clients, xray शामिल हैं
closed-source clients में Surge Mac/iOS है
कम ज्ञात traffic routing की बहुत संभावनाएँ हैं और Android implementation भी है। पहले मैंने इसे ऐसी SIM और unrooted Android पर hotspot खोलने के लिए आज़माया था जो hotspot सपोर्ट नहीं करती थी
हालांकि इसमें इंटरनेट के अलग-अलग हिस्सों से लिया गया काफी code है और developer community भी कई वजहों से काफी अजीब है, इसलिए हमेशा सोचता हूँ कि इस पर कितना भरोसा किया जा सकता है
मैंने इसकी working को गहराई से नहीं खंगाला, लेकिन rules groups से यह तय करने का concept मुझे पसंद है कि कौन-से domains VPN के जरिए proxy किए जाएँ
performance को लेकर जिज्ञासा है। याद है कि “vanilla” SOCKS सेट करना बहुत आसान है, यानी SSH को सही options के साथ चलाइए और application को उसे इस्तेमाल करने को बता दीजिए, लेकिन यह काफी धीमा था
लगता है यह टूल उन cases के लिए है जहाँ सामान्य SOCKS/SSH server नहीं है, लेकिन जानना चाहूँगा कि वहाँ भी इसका कोई फायदा है या नहीं
मेरे case में SSH के ऊपर SOCKS की performance हमेशा काफी अच्छी रही है, और यह OpenSSH के TUN mode की तरह TCP के ऊपर TCP चढ़ाने वाले तरीके से अलग था
फिर भी इस समाधान में मेरी बहुत रुचि है
मैं अभी-अभी सोच रहा था कि कोई ऐसा टूल हो जो Thunderbird के सभी email connections को Tailscale exit node के जरिए proxy करे, लेकिन पूरे traffic को exit node पर न भेजे
tailscaleCLI को SOCKS proxy की तरह इस्तेमाल किया जा सकता है: https://tailscale.com/kb/1113/aws-lambdaइसे container image में डालकर tailscale जिस SOCKS port पर listen करता है उसे expose कर दें, तो तुरंत proxy बन जाता है
अगर Mullvad VPN के लिए खास तौर पर ऐसी चीज़ चाहिए, तो https://github.com/imiric/mullvad-proxy इस्तेमाल करके अच्छा लगा
यह मेरा project नहीं है, सिर्फ updates के लिए fork किया है। अच्छी बात यह है कि यह Mullvad CLI tool को embed करता है, जिससे server switching बहुत आसान हो जाती है, और सब कुछ host machine से isolated रहता है। साथ ही यह “बस” nginx और कुछ scripts है, इसलिए SOCKS5 support भी ठीक होना चाहिए
https://mullvad.net/en/blog/wireguard-configuration-tool-has...