2 पॉइंट द्वारा GN⁺ 2024-04-03 | 1 टिप्पणियां | WhatsApp पर शेयर करें
  • 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 के लिए /128 subnet का उपयोग करना चाहिए
  • 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 के ProxyCommand parameter के रूप में उपयोगी है
  • 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 भेजा जाता है
    • डिफ़ॉल्ट CheckAliveInterval 5 सेकंड है
    • यदि पिछले CheckAliveInterval सेकंड के भीतर, 2 सेकंड की अतिरिक्त देरी-छूट सहित, pong नहीं मिलता तो 503 लौटाया जाता है
    • शर्त पूरी होने पर 200 लौटाया जाता है
  • यदि CheckAlive सेट नहीं है, तो /readyz खाली JSON object और 200 लौटाता है
  • ICMP ping packet किस peer के जरिए route होगा, यह प्रत्येक peer की AllowedIPs सेटिंग पर निर्भर करता है

1 टिप्पणियां

 
GN⁺ 2024-04-03
Hacker News की राय
  • छोटा-सा टूल है, लेकिन शानदार। Firefox के multi-account containers के साथ इसे चुनिंदा टैब को ऐसे होम राउटर के ज़रिए प्रॉक्सी करने के लिए इस्तेमाल कर रहा हूँ, जो WireGuard तो सपोर्ट करता है लेकिन application-layer proxy या SSH नहीं

    • मुझे पहली बार पता चला कि multi-account containers हर container के लिए अलग proxy settings सपोर्ट करता है
      इसे सेट करने के लिए मुझे लगा था कि https://addons.mozilla.org/en-GB/firefox/addon/container-pro... जैसे अलग extension की ज़रूरत होगी, लेकिन ऐसा नहीं था, और लगता है अब ऐसी गलतफहमी भी downvote की वजह बन जाती है
    • अगर इस तरह की configuration सेट करने का तरीका समझाने वाला कोई अच्छा resource हो तो जानना चाहूँगा
  • WireGuard से जो काम करना चाहता था, उसके लिए https://github.com/dariost/soks ज़्यादा उपयुक्त था। यह लगभग वही काम करता है, लेकिन मौजूदा WireGuard interface को reuse करता है
    इस्तेमाल करने का तरीका मैंने इस पोस्ट में विस्तार से लिखा है: https://www.nicoco.fr/blog/2023/09/10/wireguard/

    • यह काफ़ी अलग है। wireproxy लगता है user space में TCP और WireGuard implementation शामिल करता है, जबकि soks TCP-only संभाल सकने वाले IP router के ज्यादा करीब है
      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 जैसी किसी चीज़ की ज़रूरत होगी, हालांकि पक्का नहीं

    • https://github.com/noisysockets/noisysockets
      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
    • यह वाकई पूरी तरह user space में चलता है, और kernel module तो छोड़िए, OpenSSH के TUN device mode की तरह TUN/TAP device manage करने के लिए admin privileges भी नहीं चाहिए
      मेरी समझ के मुताबिक यह Google का user-space TCP/IP stack इस्तेमाल करता है
    • शायद https://github.com/cloudflare/boringtun या https://github.com/WireGuard/wireguard-go हो सकता है
  • जब अलग 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 है

    • सही बात है। ये multi-protocol proxies शायद China firewall bypass करने के लिए बनाए गए होंगे, लेकिन यह एक दिलचस्प छोटा ecosystem है
      कम ज्ञात traffic routing की बहुत संभावनाएँ हैं और Android implementation भी है। पहले मैंने इसे ऐसी SIM और unrooted Android पर hotspot खोलने के लिए आज़माया था जो hotspot सपोर्ट नहीं करती थी
      हालांकि इसमें इंटरनेट के अलग-अलग हिस्सों से लिया गया काफी code है और developer community भी कई वजहों से काफी अजीब है, इसलिए हमेशा सोचता हूँ कि इस पर कितना भरोसा किया जा सकता है
    • closed-source पक्ष में Cloudflare WARP भी proxy mode में काम कर सकता है। WARP config को सामान्य WireGuard config में बदल दें तो free account भी इस तरह इस्तेमाल किया जा सकता है
    • चीन में स्थिर रूप से काम करने वाला लगभग सिर्फ clash + v2ray ही लगता है। ज्यादातर बड़े VPN providers कहते हैं कि वे चीन में चलते हैं, लेकिन असल में नहीं चलते
      मैंने इसकी working को गहराई से नहीं खंगाला, लेकिन rules groups से यह तय करने का concept मुझे पसंद है कि कौन-से domains VPN के जरिए proxy किए जाएँ
  • performance को लेकर जिज्ञासा है। याद है कि “vanilla” SOCKS सेट करना बहुत आसान है, यानी SSH को सही options के साथ चलाइए और application को उसे इस्तेमाल करने को बता दीजिए, लेकिन यह काफी धीमा था
    लगता है यह टूल उन cases के लिए है जहाँ सामान्य SOCKS/SSH server नहीं है, लेकिन जानना चाहूँगा कि वहाँ भी इसका कोई फायदा है या नहीं

    • जानना चाहूँगा कि “vanilla” SOCKS से आपका मतलब क्या है। समझ नहीं आ रहा कि यह किस दूसरी SOCKS implementation के मुकाबले कहा जा रहा है
      मेरे case में SSH के ऊपर SOCKS की performance हमेशा काफी अच्छी रही है, और यह OpenSSH के TUN mode की तरह TCP के ऊपर TCP चढ़ाने वाले तरीके से अलग था
    • दोनों की तुलना करके देखना अच्छा रहेगा। अभी WireGuard से connect करने के बाद SSH से SOCKS proxy बना रहा हूँ, और यह आश्चर्यजनक रूप से अच्छी तरह काम करता है
      फिर भी इस समाधान में मेरी बहुत रुचि है
  • मैं अभी-अभी सोच रहा था कि कोई ऐसा टूल हो जो Thunderbird के सभी email connections को Tailscale exit node के जरिए proxy करे, लेकिन पूरे traffic को exit node पर न भेजे

    • tailscale CLI को SOCKS proxy की तरह इस्तेमाल किया जा सकता है: https://tailscale.com/kb/1113/aws-lambda
      इसे container image में डालकर tailscale जिस SOCKS port पर listen करता है उसे expose कर दें, तो तुरंत proxy बन जाता है
    • exit node चला रही machine पर 3proxy या squid proxy install कर सकते हैं। tailnet में मौजूद सभी machines उसे देख पाएँगी
  • अगर Mullvad VPN के लिए खास तौर पर ऐसी चीज़ चाहिए, तो https://github.com/imiric/mullvad-proxy इस्तेमाल करके अच्छा लगा
    यह मेरा project नहीं है, सिर्फ updates के लिए fork किया है। अच्छी बात यह है कि यह Mullvad CLI tool को embed करता है, जिससे server switching बहुत आसान हो जाती है, और सब कुछ host machine से isolated रहता है। साथ ही यह “बस” nginx और कुछ scripts है, इसलिए SOCKS5 support भी ठीक होना चाहिए

    • Mullvad से “all” config डाउनलोड करके standard WireGuard में लोड किया जा सकता है। तब सभी Mullvad locations WireGuard के बड़े dropdown के रूप में उपलब्ध हो जाते हैं
      https://mullvad.net/en/blog/wireguard-configuration-tool-has...