WireGuard हैंडशेक काम करता है, पर ऑफ़िस का सबनेट जवाब नहीं देता
WireGuard चालू है और सर्वर को पिंग करता है, फिर भी उसके LAN पर कुछ भी जवाब नहीं देता। क्लाइंट प्रीफ़िक्स, सर्वर फ़ॉरवर्डिंग और जवाब का रास्ता जाँचें।
हैंडशेक पूरा होता है, wg show हाल के ट्रांसफ़र की जानकारी देता है, और सर्वर का टनल पता पिंग का जवाब देता है। सर्वर के LAN पर मौजूद होस्ट नहीं देता। तीन शर्तें एक साथ पूरी होनी चाहिए: क्लाइंट को LAN प्रीफ़िक्स को टनल में रूट करना होगा, सर्वर को पैकेट फ़ॉरवर्ड करने होंगे, और जवाब को लौटने का रास्ता चाहिए। तीनों में से एक छूटे तो लक्षण वही रहता है।
AllowedIPs एक साथ एक्सेस सूची और रूटिंग तालिका है
क्लाइंट पर, AllowedIPs सूची तय करती है कि उस पीयर को क्या भेजा जा सकता है और WireGuard कौन-से रूट इंस्टॉल करता है। जो पीयर प्रविष्टि केवल सर्वर का टनल पता सूचीबद्ध करती है, वह एक होस्ट रूट इंस्टॉल करती है, इसलिए LAN के गंतव्य कभी टनल में नहीं जाते। LAN प्रीफ़िक्स जोड़ना पहली जाँचने वाली चीज़ है, और कॉपी की गई कॉन्फ़िगरेशन के बाद सबसे अधिक छूटने वाला बदलाव भी यही है। डिफ़ॉल्ट रूट तक बढ़ाया गया पीयर अलग डिज़ाइन है, और वह क्लाइंट का इंटरनेट ट्रैफ़िक भी हटा देगा।
होस्ट रूट और LAN प्रीफ़िक्स को अलग प्रविष्टियों के रूप में रखें। अगर ऑफ़िस में दो सबनेट हैं, दोनों सूची में आते हैं, और छूटता दूसरा प्रीफ़िक्स ऐसी विफलता पैदा करता है जो पूरी नहीं, चुनिंदा लगती है।
[Peer] PublicKey = <server public key> Endpoint = vpn.example.net:51820 AllowedIPs = 10.66.0.1/32, 192.168.50.0/24
फ़ॉरवर्डिंग और अनुवाद सर्वर पर होने चाहिए
सर्वर को IP फ़ॉरवर्डिंग सक्षम, टनल से आने वाले ट्रैफ़िक को स्वीकार करने वाला फ़ॉरवर्ड नियम, और अपने LAN इंटरफ़ेस की ओर अनुवाद नियम चाहिए। अनुवाद ही ऑफ़िस नेटवर्क के हर होस्ट को छुए बिना डिज़ाइन को काम कराता है। तब जवाब ऐसे पते पर नहीं जाते जिसे LAN ने कभी सुना ही नहीं, बल्कि सर्वर पर लौटते हैं। इसके बिना, हर होस्ट को टनल सबनेट के लिए रूट और उसे अनुमति देने वाला फ़ायरवॉल नियम चाहिए, जो किसी और के प्रबंधित नेटवर्क पर शायद ही स्वीकार्य हो।
sysctl -w net.ipv4.ip_forward=1 iptables -A FORWARD -i wg0 -j ACCEPT iptables -t nat -A POSTROUTING -o eth0 -j MASQUERADE
हाथ से जोड़े गए नियम रीबूट पर गायब हो जाते हैं, इसलिए सर्वर कॉन्फ़िगरेशन के hook कमांड से उन्हें इंटरफ़ेस से बाँधें। जो नियम-समूह अपने इंटरफ़ेस से अधिक जीता है, उसी तरह मशीन ऐसी टनल के लिए ट्रैफ़िक का अनुवाद करने लगती है जो अब मौजूद नहीं है।
जब LAN खिसका और नियम नहीं
ऑफ़िस सबनेट का फिर से नंबरिंग करने वाला राउटर बदलना इस विफलता का उत्कृष्ट उदाहरण है। टनल चालू रहता है, हैंडशेक ताज़ा रहता है, और सर्वर के पीछे कुछ भी जवाब नहीं देता, क्योंकि अनुवाद नियम अब भी पुराने पते का नाम लेता है। इंस्टॉलर स्क्रिप्ट अक्सर सर्वर के LAN पते को POSTROUTING नियम में बिठा देती हैं, और फिर से नंबरिंग के बाद वह पता किसी इंटरफ़ेस पर नहीं होता। तब पैकेट ऐसे गंतव्य पर फिर से लिखे जाते हैं जो जवाब नहीं दे सकता।
iptables -t nat -n -L POSTROUTING ip -br addr show
दोनों आउटपुट की तुलना करें। इंटरफ़ेस सूची में न दिखने वाला अनुवाद लक्ष्य ही बग है, और एक बार देख लेने के बाद उसे ठीक करना एक पंक्ति का बदलाव है। नियम WireGuard कॉन्फ़िगरेशन में नहीं, किसी जनरेट किए गए unit में हो सकता है, इसलिए संपादन के बाद उस unit को फिर से लोड करें और पुष्टि करें कि अगला बूट आपका बदलाव फिर से नहीं लिखता।
NAT के पीछे के दो साइटों को मिलने की जगह चाहिए
जब कोई भी पक्ष इनबाउंड कनेक्शन स्वीकार नहीं करता, तो व्यावहारिक जवाब है सार्वजनिक पता और दो WireGuard इंटरफ़ेस वाला छोटा होस्ट। हर साइट बाहर की ओर जुड़ती है, बीच का होस्ट हर पीयर के LAN को अपने AllowedIPs, यानी अपनी सूची में, सूचीबद्ध करता है, और फ़ॉरवर्डिंग दोनों टनलों के बीच पैकेट ले जाती है। किसी भी साइट के फ़ायरवॉल में कुछ बदलने की ज़रूरत नहीं, इसलिए यह डिज़ाइन आसानी से फैलता है।
साइटों के बीच रूटिंग मूल स्रोत पते रखती है और इसलिए प्रति-होस्ट लॉगिंग को अर्थपूर्ण रखती है। जब दोनों LAN ओवरलैप करते हैं तो बीच के होस्ट पर अनुवाद करना आसान है, पर लॉग में स्रोत की पहचान खोने की कीमत पर। चुनने से पहले तय करें कि कौन-सी विशेषता मायने रखती है।
चार जाँचों से परतों को अलग करें
तीन चीज़ें बदलकर उम्मीद करने के बजाय हर परत के लिए एक जाँच करें। पहली हर पीयर के लिए हैंडशेक की उम्र और काउंटर दिखाती है। दूसरी दिखाती है कि क्लाइंट वाकई उस गंतव्य को टनल में रूट करता है या नहीं। तीसरी और चौथी बताती हैं कि अनुरोध पहुँचा या नहीं और पहुँचने के बाद किसी नीति ने उसे गिराया या नहीं।
wg show ip route get 192.168.50.20 tcpdump -ni wg0 icmp iptables -vnL FORWARD --line-numbers
जो अनुरोध पहुँचता है और कोई जवाब नहीं लाता, वह जवाब के रास्ते या LAN होस्ट की ओर इशारा करता है। जो अनुरोध कभी नहीं पहुँचता, वह AllowedIPs या क्लाइंट के रूट की ओर इशारा करता है। इन दोनों नतीजों के लिए अलग सुधार चाहिए, और कैप्चर ही उन्हें अलग करता है।