एक पोर्ट VPNबाहेर ठेवण्यासाठी धोरणाधारित राउटिंग लागते
NAT नियम पत्ते पुन्हा लिहितो, पण बाहेर जाणारी लिंक निवडत नाही. एक TCP पोर्ट बोगद्याबाहेर ठेवणारा नियम, तक्ता आणि मार्क येथे आहे.
विनंती नेहमी एकाच वाक्याची आवृत्ती असते: ब्राउझिंगसाठी VPN ठेवा, पण SSH किंवा बॅकअप काम सामान्य कनेक्शन वापरू द्या. याबद्दल फिरणारा सल्ला, म्हणजे iptables NAT नियमांनी पोर्ट फॉरवर्ड करणे, ते करत नाही. NAT नियम प्रवाहाच्या आतले पत्ते आणि पोर्ट पुन्हा लिहितो; पॅकेट कोणत्या इंटरफेसने बाहेर पडेल हे तो कधीच निवडत नाही. तो निर्णय राउटिंग शोधाचा आहे, आणि राउटिंग शोधाला पोर्ट पाहण्यासाठी मदत लागते.
साधा रूट पोर्टशी जुळू शकत नाही का
Linux तक्त्यातील गंतव्य पत्ता शोधून रूट निवडतो, आधी धोरण नियमांनी उमेदवार तक्ते गाळल्यानंतर. ते नियम फायरवॉल मार्क, स्रोत पत्ता, येणारा इंटरफेस किंवा UID शी जुळू शकतात. रूट नोंदीत स्वतःचे पोर्ट फील्ड नसते, कारण ट्रान्सपोर्ट हेडर महत्त्वाचे होण्यापूर्वीच रूट निवडला जातो.
आधुनिक iproute2 आणि कर्नेल नियमाचा निवडक विस्तारतात: ipproto, sport आणि dport स्वीकारले जातात, म्हणून ip rule add ipproto tcp dport 22 table 100 हेतू एकाच ओळीत व्यक्त करतो. खऱ्या होस्टवर ip rule add help चालवा आणि तुमचा बिल्ड dport सूचीबद्ध करतो का पाहा. करत असेल तर एकाच आदेशात काम संपले; नसेल तर खालील मार्क मार्ग समतुल्य आहे.
कसेही असो, नियम फक्त निर्देशक आहे. तक्ता 100 ला अजूनही रूट लागतो, आणि लोक हाच भाग विसरतात.
तीन भाग, किंवा एक
आधुनिक स्वरूप म्हणजे वरील एकच नियम आणि पर्यायी तक्त्यातील रूट. पारंपरिक स्वरूप मध्यभागी netfilter जोडते: पॅकेटला मार्क लावा, नंतर नियमात मार्क जुळवा. दोन्ही एकाच शोधात संपतात; फरक पोर्ट कुठे वाचला जातो यात आहे.
मार्क पद्धत यामुळे आहे की netfilter ट्रान्सपोर्ट हेडर पाहतो आणि राउटिंग कोड ऐतिहासिकदृष्ट्या पाहत नव्हता. हीच संपूर्ण यंत्रणा आहे, आणि पर्याय एक हुशार आदेश नसून तीन सहयोगी भाग का आहेत हे त्यातून स्पष्ट होते.
तीन भाग क्रमाने
प्रथम, जे प्रवाह वळवायचे आहेत त्यांना मार्क लावा, रूट निर्णयापूर्वी मार्क असेल इतक्या लवकर चालणाऱ्या साखळीत:
nft add table inet vpnexempt
nft 'add chain inet vpnexempt out { type route hook output priority mangle; }'
nft add rule inet vpnexempt out tcp dport 22 meta mark set 0x1दुसरे, मार्क केलेले पॅकेट वेगळ्या तक्त्यात पाठवा:
ip rule add fwmark 0x1/0x1 table 100तिसरे, त्या तक्त्याला भौतिक लिंकमधून डीफॉल्ट रूट द्या. पत्ते उदाहरण आहेत; तुमचे घाला:
ip route add default via 192.168.1.1 dev wlan0 table 100तिसरी पायरी वगळल्यास मार्क केलेल्या पॅकेटला तक्ता 100 मध्ये रूट सापडत नाही, त्यामुळे ते अयशस्वी होते. लक्षण नियमाने नेटवर्क तोडल्यासारखे वाटते, प्रत्यक्षात त्याने पॅकेटपाशी उरलेला एकमेव मार्ग काढून टाकला.
पहिल्या पॅकेटनंतरही ते कार्यरत काय ठेवते
मार्क बाहेर जाणाऱ्या पॅकेटना लागू होतात. उत्तर भौतिक इंटरफेसवर त्या लिंकने दिलेल्या पत्त्यासह येते, आणि मुख्य तक्ता त्या गंतव्यासाठी अजूनही बोगद्याला प्राधान्य देऊ शकतो. दोन यंत्रणा उत्तराचा मार्ग सुसंगत ठेवतात: लिंक पत्त्यासाठी स्रोत-आधारित नियम, आणि प्रवाहाच्या पूर्ण आयुष्यभर निर्णय जपणारे कनेक्शन ट्रॅकिंग. मार्क conntrack मध्ये साठवून उत्तरादरम्यान पुनर्संचयित करणे हा स्थिती-आधारित अपवाद स्थिर ठेवण्याचा नेहमीचा मार्ग आहे.
उलट्या मार्गाचे गाळणे हा दुसरा शांत घातक आहे. कर्नेल परतीचा मार्ग कडकपणे तपासत असेल आणि उत्तर अशा इंटरफेसवर आले जे मुख्य तक्ता निवडणार नाही, तर पॅकेट कोणत्याही संदेशाशिवाय टाकून दिले जाते. rp_filter ची डीफॉल्ट मूल्ये वितरणानुसार आणि इंटरफेस फॉरवर्ड होतो का यानुसार बदलतात, म्हणून बंद आहे असे गृहीत धरण्याऐवजी प्रत्यक्ष मूल्य वाचा.
बोगद्याच्या स्वतःच्या ट्रान्सपोर्टला मार्क लावू नका. WireGuard किंवा UDP OpenVPN बोगदा TCP 22 नाही, त्यामुळे वरील कृती सुरक्षित आहे, पण बोगद्याचे गंतव्य सोडून बाकी सर्व असा लिहिलेला अपवाद एन्क्रिप्टेड पॅकेट पकडू शकतो आणि बोगदा राउटिंग लूपसारखा दिसणाऱ्या पद्धतीने तोडू शकतो.
गृहीत धरण्याऐवजी तपासा
कर्नेलला विचारा तो कोणता मार्ग घेईल, गंतव्य आणि पोर्टसाठी, नंतर प्रत्यक्ष हस्तांतरण चालवा:
ip route get 203.0.113.10
ip rule show
nft list rulesetमार्क असेल पण काउंटर कधीच हलत नसतील, तर नियम जुळत नाही. काउंटर म्हणजे तुम्ही लिहिलेली संरचना आणि कर्नेल लागू करत असलेले धोरण यातील फरक.
हे चुकीचे साधन कधी असते
पोर्ट-आधारित अपवाद स्वभावतः नाजूक असतात. सेवा पोर्ट बदलतात, HTTP/3 UDP 443 म्हणून येते, आणि एक अनुप्रयोग वेगवेगळ्या प्रकारचे अनेक प्रवाह उघडू शकतो. खरी गरज ही असेल की हा कार्यक्रम सामान्य लिंक वापरावा, तर राउटिंग स्तर चुकीचे स्थान आहे; नेटवर्क नेमस्पेस किंवा प्रति-अनुप्रयोग प्रॉक्सी अधिक योग्य आहेत.
गरज ही असेल की हे सबनेट सामान्य लिंक वापरावे, तर मार्क पूर्णपणे वगळा आणि अधिक विशिष्ट रूट जोडा. ते सोपे आहे, एकाच तक्त्यात दिसते, आणि पुढची व्यक्ती नियमसंच न वाचता त्याचे ऑडिट करू शकते.
फायरवॉलला हात लावण्यापूर्वी तीनपैकी कोणती गरज प्रत्यक्षात तुमची आहे ते लिहा. वरील यंत्रणा अचूक आहे, आणि चुकीच्या स्तरावर लावलेली अचूकता म्हणजे फक्त मोठा खंड.