इस ऐप को बाहर रखने का कोई स्विच नहीं: प्रक्रिया को उसका अपना स्रोत दें
राउटिंग पते मिलाती है, प्रक्रियाओं के नाम नहीं। बाहर रखे गए प्रोग्राम को उसका अपना स्रोत और तालिका दें, या निर्णय राउटर पर ले जाएँ, जहाँ यह ईमानदार है।
एक प्रोग्राम सामान्य कनेक्शन का उपयोग करे जबकि बाकी सब टनल पर रहे, और क्लाइंट के पास इसके लिए कोई स्विच नहीं है। कोई छिपा हुआ मेन्यू भी खोजने को नहीं है। रूट पैकेट के भीतर के फ़ील्ड से चुना जाता है, और पैकेट पते और पोर्ट ले जाता है, उसे बनाने वाली प्रक्रिया की पहचान नहीं, इसलिए बहिष्करण उन फ़ील्ड में से किसी एक में व्यक्त करना होगा। एक बार पैकेट का पीछा करें और उपलब्ध विकल्प रहस्यमय रहना बंद कर देते हैं।
क्लाइंट इसे क्यों नहीं दे सकता
गंतव्य राउटिंग गंतव्य पते की तुलना प्रीफ़िक्स से करती है और सबसे लंबा मेल रखती है। उस पल हर पैकेट एक जैसा दिखता है, चाहे उसे किसी ने भी बनाया हो। स्रोत नीति राउटिंग तुलना को स्रोत पते तक बढ़ा देती है, और यही वह हुक है जिसका हर व्यावहारिक समाधान उपयोग करता है: स्रोत बदलें, और दूसरी तालिका योग्य हो जाती है।
पोर्ट मदद नहीं करते। पोर्ट के आधार पर बहिष्करण का मूल्यांकन गंतव्य खोज से पहले करना पड़ता, और उस निर्णय में पोर्ट की कोई भूमिका नहीं है। पोर्ट-आधारित बहिष्करण के रूप में जो भी विज्ञापित होता है, वह वास्तव में किसी दूसरे फ़ील्ड से बाहर रखता है और उसे ढीले ढंग से वर्णित करता है।
सच्ची ऐप-वार राउटिंग वहाँ मौजूद है जहाँ प्लेटफ़ॉर्म ने इसके लिए तंत्र जोड़ा है, जैसे Windows पर फ़िल्टर कॉलआउट या Android पर VPN सेवा बाइंडिंग। डेस्कटॉप OpenVPN इंस्टेंस इसमें से कुछ नहीं लाता, और कोई कॉन्फ़िगरेशन फ़्लैग इसे गढ़ता नहीं।
Linux: प्रक्रिया को चिह्नित करें, फिर चिह्न को राउट करें
सबसे साफ़ दृष्टिकोण निर्णय को उस प्रक्रिया से बाँधता है जो सॉकेट की मालिक है। owner मेल OUTPUT श्रृंखला में स्थानीय रूप से उत्पन्न ट्रैफ़िक के लिए काम करता है, इसलिए वहाँ लगाया गया चिह्न अलग तालिका चुन सकता है:
iptables -t mangle -A OUTPUT -m owner --uid-owner 1001 -j MARK --set-mark 0x1
ip rule add fwmark 0x1 table 200
ip route add 192.168.1.0/24 dev eth0 src 192.168.1.0 table 200
ip route add default via 192.168.1.1 dev eth0 table 200
उपयोगकर्ता 1001 के पैकेट फिर तालिका 200 से परामर्श करते हैं और सामान्य गेटवे से बाहर जाते हैं, जबकि मुख्य तालिका बाकी सब कुछ टनल में भेजती रहती है। owner मेल केवल स्थानीय रूप से उत्पन्न पैकेट पर लागू होता है, जो ठीक वही ट्रैफ़िक है जो यहाँ मायने रखता है, और यह किसी दूसरे होस्ट के लिए फ़ॉरवर्ड किए गए पैकेट को वर्गीकृत नहीं कर सकता। उपकरणों से जाँचें, इरादे से नहीं: ss -tnp स्थापित कनेक्शनों का स्थानीय पता और उनका मालिक प्रक्रिया दिखाता है, और ip route get 1.1.1.1 mark 0x1 दिखाता है कि चिह्न कौन सी तालिका चुनता है।
नेटवर्क नेमस्पेस एक स्वतंत्र प्रोग्राम के लिए अधिक मज़बूत उत्तर है, क्योंकि उसके भीतर बनाया गया हर सॉकेट निर्माण से ही उससे बँधा होता है, इसलिए सहायक प्रक्रियाएँ और संतान कनेक्शन बिना किसी वर्गीकरण के व्यवहार विरासत में पाते हैं। कीमत प्लंबिंग है: एक veth जोड़ी, हर सिरे पर एक पता, और नेमस्पेस के भीतर एक डिफ़ॉल्ट रूट जो होस्ट की ओर वापस इंगित करता है।
ip netns add novpn
ip link add veth-host type veth peer name veth-ns
ip link set veth-ns netns novpn
ip addr add 10.200.0.1/24 dev veth-host
ip netns exec novpn ip addr add 10.200.0.2/24 dev veth-ns
ip netns exec novpn ip route add default via 10.200.0.1
Windows: गंतव्य अब भी तय करता है
Windows गंतव्य से आउटगोइंग इंटरफ़ेस चुनता है, इसलिए अलग रास्ता चाहने वाले प्रोग्राम को कुछ ऐसा बदलना होगा जिससे स्टैक उस चयन से पहले परामर्श करता है। ForceBindIP पहला आधा हिस्सा संभालता है: यह प्रोग्राम को ऐसे सॉकेट के साथ शुरू करता है जो पहले से आपके बताए स्थानीय पते से बँधे होते हैं। अकेले यह नहीं बदलता कि पैकेट किस इंटरफ़ेस से बाहर जाता है, क्योंकि रूट अब भी गंतव्य ही चुनता है। जिस लैपटॉप का डिफ़ॉल्ट रूट टनल की ओर इंगित करता है उस पर स्रोत बाँधें, और पैकेट फिर भी टनल में चला जाता है।
लक्षण का एक पठनीय आकार है, एक बार जान लेने के बाद। यह ऐसे LAN पते के लिए लागू होता है जिस तक चुना गया इंटरफ़ेस सीधे पहुँचता है, और इंटरनेट की हर उस चीज़ के लिए विफल होता है जिसका रूट टनल की ओर इंगित करता है। यह तब तक काम करता भी दिखता है जब तक प्रोग्राम काम किसी सहायक को नहीं सौंपता, क्योंकि जो सहायक अपना सॉकेट खोलता है उसे बंधन के बारे में कभी नहीं बताया गया।
जब एक प्रक्रिया गलत इकाई हो तो निर्णय हटाएँ
यदि असली आवश्यकता प्रोग्राम नहीं बल्कि डिवाइस है, तो उसे अपने SSID या VLAN पर रखें और राउटर को तय करने दें: वह स्रोत सामान्य मार्ग लेता है जबकि अन्य स्रोत टनल का उपयोग करते हैं। समर्पित गेटवे मशीन दूसरा ईमानदार डिज़ाइन है: यह VPN रखती है और केवल वही गंतव्य प्राप्त करती है जो राउटर उसे भेजता है। VLAN पर नीति डिवाइस द्वारा खोले गए हर प्रवाह को कवर करती है, जिनमें वे सहायक प्रक्रियाएँ भी शामिल हैं जिन्होंने Windows दृष्टिकोण तोड़ा। अदला-बदली दायरा है: उस डिवाइस पर दो प्रोग्रामों को अब अलग तरह से नहीं देखा जा सकता।
दोनों स्रोत या गंतव्य नीतियाँ हैं जिनका दायरा एक वाक्य में कहा जा सकता है। कोई भी ऐप-वार नहीं है, और जो डिज़ाइन खुद को ऐप-वार बताता है वह पहली बार विफल होता है जब प्रोग्राम अपना काम दूसरी प्रक्रिया को सौंपता है।