तीन Linux होस्ट, एक डिज़ाइन: सार्वजनिक रूप से पहुँचने योग्य OpenVPN हब, एक उपभोक्ता लैपटॉप और एक साधारण होम राउटर के पीछे बैठी एग्ज़िट मशीन, जो अंदर कुछ भी फ़ॉरवर्ड नहीं करता। एग्ज़िट खुद हब को डायल करता है। फिर उपभोक्ता का इंटरनेट ट्रैफ़िक लैपटॉप पर टनल में घुसता है और एग्ज़िट के अपने अपलिंक से बाहर निकलता है। इस व्यवस्था में हैरान करने वाली हर बात एक ब्यौरे से आती है: कनेक्शन एग्ज़िट ने शुरू किया, इसलिए अंदर का रास्ता पहले से मौजूद है और उसे बनाने के लिए पोर्ट फ़ॉरवर्डिंग की ज़रूरत नहीं।

आगे कॉन्फ़िगरेशन के क्रम के बजाय पैकेट का रास्ता देखा गया है, क्योंकि कॉन्फ़िगरेशन तभी समझ आता है जब पता हो कौन-सा घटक कौन-सा फ़ैसला लेता है। हर परत ठीक एक फ़ैसला लेती है, और ग़लतियाँ वहाँ जमा होती हैं जहाँ दो परतों को एक मान लिया जाता है।

दो ट्रांसपोर्ट सत्र, एक भीतरी रास्ता

हर होस्ट हब से अपना अलग बाहरी कनेक्शन रखता है, और इनमें से कोई भी दूसरे के बारे में नहीं जानता। उपभोक्ता का इंटरनेट की ओर ट्रैफ़िक एक अलग भीतरी प्रवाह है, जो उपभोक्ता की टनल के भीतर ढोया जाता है और फिर एग्ज़िट की टनल से दोबारा बाहर भेजा जाता है। हब को यही भीतरी प्रवाह रूट करना है, और एग्ज़िट को यही फ़ॉरवर्ड करना है।

outer: consumer --TLS--> hub
outer: exit     --TLS--> hub
inner: consumer --tun--> hub --internal--> exit --tun--> uplink

चूँकि दोनों बाहरी कनेक्शन क्लाइंट की ओर से बाहर जाते हैं, एग्ज़िट का राउटर कभी इनबाउंड SYN नहीं देखता और उसे कभी डेस्टिनेशन NAT नियम की ज़रूरत नहीं पड़ती। उसे केवल स्थापित ट्रांसपोर्ट को जीवित रखना है, जो वह किसी भी लंबे कनेक्शन के लिए पहले से करता है। सार्वजनिक इंटरनेट पर किसी को पहले एग्ज़िट तक पहुँचने की ज़रूरत नहीं, इसीलिए उस अपलिंक पर गतिशील पता कोई समस्या नहीं। राउटर को फिर भी बाहर जाने वाले सत्र की अनुमति देनी होती है, पर वह वही अनुमति है जो ब्राउज़र पहले से इस्तेमाल करता है।

iroute वास्तव में सर्वर के अंदर क्या इंस्टॉल करता है

हब ही एकमात्र उपकरण है जो तय करता है कि कौन-सा साथी किस गंतव्य का मालिक है, और यह फ़ैसला वह अपनी यूज़रस्पेस रूटिंग तालिका में लेता है, कर्नेल की तालिका में नहीं। एग्ज़िट के लिए exit-node नाम की client-config-dir प्रविष्टि वहाँ डिफ़ॉल्ट प्रीफ़िक्स का दावा कर सकती है:

# /etc/openvpn/server/ccd/exit-node
iroute 0.0.0.0 0.0.0.0

वह पंक्ति सर्वर प्रक्रिया से कहती है "किसी भी गंतव्य वाले भीतरी पैकेट इस क्लाइंट के हैं"। यह हब के ऑपरेटिंग सिस्टम में डिफ़ॉल्ट रूट नहीं जोड़ती और हब को इंटरनेट गेटवे भी नहीं बनाती। OpenVPN 2.6 संदर्भ क्लाइंट-विशिष्ट भीतरी रूटिंग और कर्नेल रूटिंग को अलग तंत्र के रूप में रखता है, और यही अलगाव कारण है कि यह डिज़ाइन हब के डिफ़ॉल्ट रूट को छुए बिना काम करता है।

उपभोक्ता को दर्पण वाला निर्देश चाहिए, push के रूप में पहुँचाया गया, ताकि उसका अपना ट्रैफ़िक स्थानीय गेटवे से बाहर जाने के बजाय टनल में प्रवेश करे। सबनेट टोपोलॉजी में पूल एग्ज़िट के tun उपकरण पर जुड़ा रूट है, इसलिए वापसी दिशा को कोई अतिरिक्त push नहीं चाहिए; एग्ज़िट को जो नहीं मिलना चाहिए वह नीचे दिया गया रीडायरेक्शन है, जो उसके अपने अपलिंक ट्रैफ़िक को उसी टनल में वापस भेज देगा जिसे वह इस्तेमाल करना चाहता है। इसे केवल उपभोक्ता को भेजें और CCD फ़ाइल चुनी गई है यह मानने के बजाय क्लाइंट पर लागू रूट पढ़ें।

# /etc/openvpn/server/ccd/consumer-01
push "redirect-gateway def1"

फ़ॉरवर्डिंग एग्ज़िट का कर्नेल करता है

एग्ज़िट के अंदर उपभोक्ता का एक पैकेट tun इंटरफ़ेस पर किसी इंटरनेट होस्ट के पते पर आता है। कर्नेल अपनी रूटिंग तालिका देखता है, सबसे अच्छे मेल के रूप में असली अपलिंक ढूँढता है और फिर दो स्वतंत्र नीतियाँ लागू करता है: क्या यह पैकेट बिल्कुल फ़ॉरवर्ड हो सकता है, और क्या यह उस इंटरफ़ेस से उस स्रोत पते के साथ बाहर जा सकता है। फ़ॉरवर्डिंग एक sysctl है, और कई डिस्ट्रिब्यूशन में यह डिफ़ॉल्ट रूप से बंद रहता है।

इसलिए एग्ज़िट को लगातार चालू IPv4 फ़ॉरवर्डिंग, उपभोक्ता के टनल स्रोतों को अपलिंक की ओर स्वीकार करने वाला नियम और tun से वापस जाने वाला उत्तर-मार्ग चाहिए। पूरे होस्ट के लिए फ़ॉरवर्डिंग चालू करने से उसके रास्ते जाने वाली हर दूसरी चीज़ का व्यवहार भी बदलता है, इसलिए नियम को सब कुछ स्वीकारने के बजाय स्रोतों और इंटरफ़ेस के नाम बताने चाहिए।

वापसी का रास्ता स्रोत अनुवाद खरीदता है

इंटरनेट होस्ट के पास 10.90.0.x पते तक कोई रूट नहीं है, इसलिए उत्तर एग्ज़िट तक पहुँचने से पहले ही गिरा दिए जाते। पैकेट के अपलिंक छोड़ते समय स्रोत फिर से लिखने से यह हल होता है, और कनेक्शन ट्रैकिंग वापसी पर उस पुनर्लेखन को उलट देती है।

sysctl -w net.ipv4.ip_forward=1
iptables -t nat -A POSTROUTING -s 10.90.0.0/24 -o enp1s0 -j MASQUERADE
ip -4 route get 10.90.0.9   # run on the exit: must point at the tun

ऊपर का नियम एक अपलिंक इंटरफ़ेस के लिए शुरुआती बिंदु है, फ़ायरवॉल नीति नहीं। स्रोत को उन असाइनमेंट तक सीमित करें जिन्हें आपने वास्तव में अधिकृत किया, और एग्ज़िट की अपनी इनपुट नीति अलग रखें ताकि टनल ट्रैफ़िक के लिए मास्करेडिंग स्थानीय सेवाओं को चुपचाप उजागर न करे। गतिशील अपलिंक पते वाले होस्ट पर मास्करेड आपको पता हाथ से ट्रैक करने से भी बचाता है।

हब कहाँ लागू कर सकता है और कहाँ नहीं

client-to-client और पारंपरिक यूज़रस्पेस डेटा पाथ के साथ हब सर्वर प्रक्रिया के भीतर ही साथियों के बीच भीतरी पैकेट सौंपता है। वे कभी हब के कर्नेल FORWARD चेन से नहीं गुज़रते, इसलिए वहाँ का कर्नेल नियम कितना भी सावधानी से लिखा हो, साथियों के बीच आवागमन सीमित नहीं कर सकता। प्रवर्तन सर्वर की अपनी नीति में ही रहना चाहिए: किसे जुड़ने की अनुमति है, उसे कौन-सी CCD फ़ाइल मिलती है और एग्ज़िट का डिफ़ॉल्ट स्वामित्व दिया जाता है या नहीं।

इसीलिए डिफ़ॉल्ट iroute व्यापक भरोसे का फ़ैसला है। एग्ज़िट को मनमाने इंटरनेट पतों से वापसी ट्रैफ़िक वैध रूप से स्वीकार करना होता है, और यह ऐसी मशीन होनी चाहिए जिसे आप नियंत्रित, पैच और निगरानी करते हैं। वही स्वामित्व ऐसे साथी को देना, जिसे आप राउटर न सौंपें वही ग़लती है जिसका यह डिज़ाइन न्योता देता है।

सदस्यता ही असली नियंत्रण है। जो भी क्लाइंट अपने रूट कॉन्फ़िगर कर सकता है, वह एग्ज़िट इस्तेमाल करने की कोशिश कर सकता है, इसलिए यह सीमित करना कि कौन जुड़ सकता है या एग्ज़िट किन साथियों की सेवा करेगा, डिज़ाइन का हिस्सा है, बाद का विचार नहीं।

एग्ज़िट के ग़ायब होने पर सुरक्षित रूप से विफल होना

एग्ज़िट को ऑफ़लाइन करें और भीतरी डिफ़ॉल्ट स्वामित्व उसके सत्र के साथ ग़ायब हो जाता है। जो नहीं होना चाहिए वह यह है कि हब चुपचाप जगह लेने वाला एग्ज़िट बन जाए: VPN पूल से हब के अपलिंक तक कोई डिफ़ॉल्ट रूट नहीं, और हब पर कोई व्यापक मास्करेड नियम नहीं जो वही ट्रैफ़िक ख़ुशी से फ़ॉरवर्ड कर दे। उस विफलता को जानबूझकर जाँचें, फिर पहले से खुले पेज के बजाय नए प्रवाह से पुनर्प्राप्ति जाँचें।

# on the consumer, with the exit up and then down
ip -4 route get 1.1.1.1
curl -sS -o /dev/null -w '%{http_code}\n' https://example.com

अगर एग्ज़िट जाने के बाद भी उपभोक्ता का ट्रैफ़िक इंटरनेट तक पहुँचता है, तो कुछ और उसे ढो रहा है और आपकी इच्छित सीमा मौजूद नहीं है। DNS और IPv6 को भी अलग फ़ैसले मानें: IPv4 रूट और मास्करेड AAAA ट्रैफ़िक के बारे में कुछ नहीं कहते, और हब द्वारा भेजा गया रिज़ॉल्वर वहीं से उत्तर देगा जहाँ से क्वेरी वास्तव में निकलती है।

संबंधित लेख