WSL2 VPN सबनेट तक नहीं पहुँचता: होस्ट रूट पढ़ें
डिस्ट्रो अपने NAT के पीछे बैठता है और Windows टनल को कभी नहीं देखता। होस्ट से वर्तमान पता और प्रीफ़िक्स पढ़ें, फिर उन्हें WSL के अंदर जोड़ें।
डिस्ट्रो के अंदर से किसी आंतरिक सर्वर पर ping समय-सीमा पर समाप्त हो जाता है, जबकि वही पता Windows से उत्तर देता है। VPN जुड़ा है और Windows का रूट सही है, इसलिए अंतराल WSL की सीमा है। विफल कमांड से होस्ट इंटरफ़ेस तक का रास्ता चलें। समाधान कॉन्फ़िग फ़ाइल में कोई निश्चित CIDR नहीं है; समाधान वर्तमान पता पढ़कर उसे वहाँ जोड़ना है जहाँ डिस्ट्रो उसका उपयोग कर सके।
पुष्टि करें कि रास्ता कहाँ रुकता है
दोनों ओर एक ही परीक्षण चलाएँ: Windows से एक आंतरिक होस्ट को हल करके उससे जुड़ें, फिर उसे डिस्ट्रो में दोहराएँ। Windows में सफलता और डिस्ट्रो में समय-सीमा विफलता को दोनों के बीच बताती है, VPN क्लाइंट या आंतरिक सर्वर में नहीं। कोई भी रूट बदलने से पहले यह करें, ताकि दोनों परिणाम एक ही गंतव्य का वर्णन करें।
डिस्ट्रो के अंदर, ip -4 addr WSL NAT श्रेणी के पते वाला वर्चुअल एडाप्टर दिखाता है, और ip route WSL गेटवे की ओर इशारा करता डिफ़ॉल्ट रूट दिखाता है। कॉर्पोरेट प्रीफ़िक्स के लिए कोई रूट नहीं है, क्योंकि होस्ट के टनल एडाप्टर का डिस्ट्रो के अंदर कोई समकक्ष नहीं है। डिफ़ॉल्ट गेटवे WSL NAT की ओर जाता है, कॉर्पोरेट नेटवर्क की ओर नहीं।
पहले पहुँचने योग्य लिंक पर स्थानीय पता जोड़े बिना कॉर्पोरेट रूट जोड़ने से समय-सीमा या नेटवर्क अगम्य त्रुटि होती है। पता ही वह हिस्सा है जो रूट को उपयोगी बनाता है, इसलिए पहले उसे पढ़ें और रूट को दूसरा चरण मानें।
मिरर किया गया नेटवर्क या स्क्रिप्ट वाला रूट चुनें
मिरर किया गया नेटवर्क डिस्ट्रो को होस्ट के अपने इंटरफ़ेस देता है, इसलिए टनल और उसके रूट बिना नकल के दिखाई देते हैं। यह सुविधा हाल के Windows बिल्ड और .wslconfig में networkingMode=mirrored पर निर्भर है, और इसे सक्षम करने से localhost फ़ॉरवर्डिंग जैसा असंबंधित व्यवहार बदल जाता है। इसे प्लेटफ़ॉर्म परिवर्तन मानें, रूट का फ़ाइन-ट्यूनिंग नहीं। यदि बिल्ड इसे समर्थन देता है और दुष्प्रभाव स्वीकार्य हैं, तो यह सबसे छोटा रास्ता है।
संकीर्ण दृष्टिकोण डिफ़ॉल्ट NAT रखता है और जब भी टनल ऊपर आता है, टनल का पता और रूट डिस्ट्रो में नकल करता है। यह अधिक बिल्ड पर काम करता है, localhost व्यवहार नहीं बदलता, और VPN बंद होने पर दिखाई देने वाली तरह विफल होता है। कीमत एक छोटी स्क्रिप्ट है जिसे हर कनेक्शन पर चलाना पड़ता है।
एक चुनें और लिख लें। मिरर कॉन्फ़िगरेशन को मैनुअल रूट के साथ मिलाने से एक ही प्रीफ़िक्स के दो रास्तों वाला और किसी का स्पष्ट स्वामी न होने वाला डिस्ट्रो बनता है। एक प्रलेखित विधि दो आधी-कॉन्फ़िगर विधियों की तुलना में डीबग करना आसान है।
होस्ट से वर्तमान टनल विवरण निकालें
एडाप्टर को नाम के बजाय MAC पते से मिलाएँ, क्योंकि नाम VPN क्लाइंट और कनेक्शन क्रम के साथ बदलते हैं। एडाप्टर एक बार सूचीबद्ध करें, टनल एडाप्टर का MAC नोट करें, फिर उसका पता और प्रीफ़िक्स पूछें। MAC पुनः कनेक्शन के बीच वर्चुअल एडाप्टर के साथ रहता है, जबकि नाम और इंटरफ़ेस इंडेक्स नहीं:
powershell.exe 'Get-NetAdapter | Where-Object { $_.MacAddress -eq "3C-52-82-0A-1B-7C" } | Get-NetIPAddress -AddressFamily IPv4 | Select-Object IPAddress, PrefixLength'गेटवे इंटरफ़ेस कॉन्फ़िगरेशन से आता है। पहले इंटरफ़ेस इंडेक्स लाएँ, फिर अगली हॉप पढ़ें। रीबूट या एडाप्टर रीसेट के बाद इंडेक्स बदल सकता है, इसलिए स्क्रिप्ट को उसे संग्रहीत करने के बजाय पढ़ना चाहिए:
powershell.exe '(Get-NetAdapter | Where-Object { $_.MacAddress -eq "3C-52-82-0A-1B-7C" }).InterfaceIndex'
powershell.exe '(Get-NetIPConfiguration -InterfaceIndex 27).IPv4DefaultGateway.NextHop'किसी चर को सौंपने से पहले आउटपुट को tr -d '\r' से गुज़ारें। PowerShell पंक्तियों को कैरिज रिटर्न से समाप्त करता है, और स्ट्रिप न करने पर अंतिम फ़ील्ड में छिपा अक्षर रहता है जो रूट कमांड को भ्रमित करने वाली पार्स त्रुटि के साथ विफल कर देता है।
डिस्ट्रो के अंदर पता और रूट लागू करें
टनल के पते को डिस्ट्रो के इंटरफ़ेस पर प्रीफ़िक्स वाले पते के रूप में स्थापित करें, फिर कॉर्पोरेट ब्लॉक को होस्ट के गेटवे से रूट करें:
sudo ip addr add 172.20.14.37/22 dev vpn
sudo ip route add 172.20.0.0/16 via 172.20.12.1 dev vpnकनेक्शन चक्र में आने पर NetworkManager मैनुअल रूप से कॉन्फ़िगर किया गया पता गिरा देता है, और कोई DHCP क्लाइंट उसका प्रतिस्थापन नहीं माँगता। विधि को स्वचालित पर सेट करें ताकि हर पुनः कनेक्शन पता ताज़ा करे, फिर कनेक्शन दोबारा ऊपर उठाएँ। मैनुअल विधि पहले पुनः कनेक्शन तक स्थिर दिखती है:
nmcli con show vpn
sudo nmcli con mod vpn ipv4.method auto
sudo nmcli con up vpnदोनों चरण VPN शुरू करने वाले हुक से चलाएँ, इंटरैक्टिव शेल से नहीं। जो स्क्रिप्ट पता पढ़ती है, जोड़ती है, रूट जोड़ती है और मान लॉग करती है, वह आवर्ती मैनुअल मरम्मत को दोहराने योग्य बनाती है, और प्रीफ़िक्स बदलने पर सबसे पहले लॉग ही पढ़ना चाहिए।
नाम पिन करें और रास्ता साबित करें
नेटवर्क स्विच के बाद कर्नेल डिस्ट्रो के इंटरफ़ेस का नाम eth1 और eth2 के बीच बदल सकता है, और नाम पर लिखी स्क्रिप्ट तब गलत डिवाइस संपादित करती है। MAC से बँधा udev नियम इंटरफ़ेस को स्थिर लेबल देता है:
SUBSYSTEM=="net", ACTION=="add", ATTRS{address}=="3c:52:82:0a:1b:7c", NAME="vpn"फिर पते, रूट और वास्तविक TCP कनेक्शन से सत्यापित करें: ip -4 addr show dev vpn, ip route get 172.20.4.10 और किसी ज्ञात आंतरिक पोर्ट पर कनेक्शन। रूट लुकअप में vpn डिवाइस और आपके द्वारा जोड़ा गया स्रोत पता दिखना चाहिए।
यदि तीनों डिस्ट्रो के अंदर पास हो जाएँ और कनेक्शन फिर भी विफल हो, तो पैकेट WSL से निकलकर Windows की ओर छोड़ दिया जा रहा है। स्क्रिप्ट बदलने से पहले होस्ट फ़ायरवॉल और VPN क्लाइंट की अपनी फ़िल्टरिंग जाँचें, क्योंकि एक और रूट संपादन उस पैकेट को ठीक नहीं करेगा जो पहले से होस्ट तक पहुँच रहा है।