अनुरोध सधैं एउटै वाक्यको एउटा रूप हुन्छ: ब्राउजिङका लागि 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 का रूपमा आउँछ, र एउटा अनुप्रयोगले विभिन्न प्रकारका धेरै प्रवाह खोल्न सक्छ। वास्तविक आवश्यकता यो कार्यक्रमले सामान्य लिङ्क प्रयोग गरोस् भन्ने हो भने राउटिङ तह गलत ठाउँ हो; नेटवर्क नेमस्पेस वा प्रति-अनुप्रयोग प्रोक्सी बढी उपयुक्त हुन्छन्।

आवश्यकता यो सबनेटले सामान्य लिङ्क प्रयोग गरोस् भन्ने हो भने मार्क पूरै छोडेर अझ विशिष्ट रुट थप्नुहोस्। यो सरल छ, एउटै तालिकामा देखिन्छ, र अर्को व्यक्तिले नियमसमूह नपढी यसको अडिट गर्न सक्छ।

फायरवाल छुनुअघि तीन आवश्यकतामध्ये कुन वास्तवमा तपाईंको हो लेख्नुहोस्। माथिको क्रियाविधि सटीक छ, र गलत तहमा लगाइएको सटीकता केवल लामो अवरोध मात्र हो।

सम्बन्धित लेखहरू