केवल कुछ इंटरफेस पर कुछ आउटबाउंड ट्रैफ़िक की अनुमति दें


15

मेरे पास एक अजीब मुद्दा है। मेरे पास दो नेटवर्क इंटरफेस eth0और के साथ एक सर्वर है eth1। प्रत्येक एक अलग नेटवर्क से जुड़े हैं। प्रत्येक नेटवर्क में एक इंटरनेट गेटवे है। सर्वर के विभिन्न आउटबाउंड कनेक्शन हैं: http (सर्वर पर कुछ स्क्रिप्ट वेबसाइटों को खंगालते हैं), nfs क्लाइंट, सांबा क्लाइंट, डीएनएस क्लाइंट और एक ईमेल लाने के लिए नाम लेकिन कुछ।

जिन कारणों से मैं इसमें नहीं जाऊंगा, मुझे इन आउटबाउंड क्लाइंट्स को आउटबाउंड http, nfs, samba और dns ट्रैफ़िक में विभाजित करने की आवश्यकता है, eth0जबकि सब कुछ खत्म हो गया है eth1

मैंने कुछ Google खोजों के आसपास पढ़ा है और ऐसा लगता iptablesहै कि मुझे क्या चाहिए लेकिन मुझे वास्तव में कोई सुराग नहीं मिला है। मैं केवल इनबाउंड फ़ायरवॉल नियमों का प्रबंधन करने के लिए उपयोग किया जाता हूं ufw

क्या कोई मुझे कुछ उदाहरण नियमों के साथ शुरू कर सकता है और मुझे बता सकता है कि बूट पर इन नियमों को अपनाने के लिए सिस्टम कैसे प्राप्त करें? आदर्श रूप से मुझे मेरे SSH कनेक्शन से बाहर किए बिना (मैं भौतिक पहुँच प्राप्त कर सकता हूं , लेकिन मैं ऐसा नहीं करूँगा)।

संपादित करें मैं ग्राहकों को दो उपयोगकर्ताओं से विभाजित कर सकता हूं यदि किसी खाते से एक आउटबाउंड ट्रैफ़िक को एक इंटरफ़ेस तक सीमित करना संभव है। कागज पर ऐसा लगता है कि यह आसान हो सकता है।

जवाबों:


12

मैं एक अलग राउटिंग टेबल और उस टेबल का उपयोग करके चिह्नित पैकेटों को रूट करने के लिए एक नीति स्थापित करूंगा और इन सभी पैकेटों पर iptables / netfilter मार्क करूंगा।

एक तालिका बनाएं: echo 1 known >> /etc/iproute2/rt_tables

एक रूटिंग नियम बनाएं ( ipकमांड iproute2 से है ): ip rule add from all fwmark 1 table known

हमने "ज्ञात" नामक एक तालिका बनाई और एक रूटिंग नियम बनाया जो कहता है कि 1 के बराबर के निशान वाले किसी भी पैकेट को "ज्ञात" तालिका के अनुसार रूट किया जाता है। मैंने केवल इसे ज्ञात कहा क्योंकि यह ज्ञात प्रोटोकॉल की सूची के लिए है - आप इसे जो चाहें नाम दे सकते हैं। अब हम उचित तरीके से रूट करने के लिए ज्ञात तालिका को सेटअप करते हैं।

ip route add default dev eth0 table known

Iptables नियम बनाएँ:

iptables -t mangle -I PREROUTING -p tcp --dport 111 -j MARK --set-mark 1
iptables -t mangle -I PREROUTING -p tcp --dport 2049 -j MARK --set-mark 1

उदाहरण 1 के साथ NFS बंदरगाहों (111, 2049) पर पैकेट को चिह्नित करता है। हम इस नियम को 'mangle' iptable में जोड़ रहे हैं। यह रूटिंग टेबल से अलग है और परिवर्तनशील नहीं है; मैटल टेबल विशेष रूप से NAT के अलावा किसी भी तरह से पैकेट में फेरबदल के लिए है।

अब, अन्य इंटरफ़ेस के माध्यम से बाकी सब कुछ करने के लिए, हम मानक मार्ग तालिका में एक मार्ग जोड़ते हैं।

ip route add default dev eth1

इसे समझने के लिए, LARTC howto के अनुभाग 4 और 11 को पढ़ें ।


खैर, यह वास्तव में बहुत आसान है जितना मैंने आशंका जताई थी। लिनक्स नेटवर्किंग स्टैक वास्तव में एक सुंदर जानवर है, है ना ?! मैंने इसे एक त्वरित परीक्षण दिया है और यह सब उम्मीद के मुताबिक काम करता है। मैं प्रत्येक इंटरफ़ेस की निगरानी कर रहा हूँ iftopऔर वे प्रत्येक को सही प्रकार का ट्रैफ़िक दिखा रहे हैं। बहुत बहुत धन्यवाद।
ओली

मैं नहीं जानता कि कैसे iptables या iproute2 उनके कॉन्फ़िगरेशन को संग्रहीत करते हैं। क्या मुझे प्रत्येक बूट के लिए इन नियमों को बंद करना होगा?
ओली

@ जब वे रिबूट करते हैं तो वे साफ हो जाते हैं। आप को बचा सकता है और साथ नियमों को बहाल iptables-saveऔर iptables-restore। यदि आप NetworkManager का उपयोग कर रहे हैं, तो आप प्रक्रिया को स्वचालित करने के लिए डिस्पैचर स्क्रिप्ट सेटअप कर सकते हैं। दुर्भाग्य से, आधिकारिक NM पेज में फीचर के बारे में दस्तावेज नहीं है, लेकिन उबंटू और आर्क लिनक्स प्रलेखन दोनों इसका उल्लेख करते हैं।
शॉन जे। गोफ

5

खैर, " सबसे आसान " तरीका एकल कार्यक्रमों को एक विशिष्ट इंटरफ़ेस (या इंटरफ़ेस के आईपी) का उपयोग करने के लिए निर्देश देना चाहिए। उदाहरण के लिए।

ping -I eth1 8.8.8.8

एक स्रोत इंटरफ़ेस के रूप में eth1 का उपयोग करने के लिए पिंग को निर्देश देता है, जबकि

wget --bind-address 10.0.0.1 http://www.google.it/

एक आईपी पते के रूप में इंटरफेस के माध्यम से जाने के लिए निर्देश देता है 10.0.0.1

ईमानदारी से मैं नहीं जानता कि क्या यह आपके लिए आवश्यक सभी कार्यक्रमों के साथ संभव है, लेकिन यह उन नियमों को ट्रिम करने के लिए एक शुरुआत है जिन्हें आपको iptablesऔर iprouteकार्यक्रमों के लिए लिखने की आवश्यकता है ।

एक शुरुआत के रूप में आपको कई इंटरनेट कनेक्शन पर इस ट्यूटोरियल को पढ़ना चाहिए । एक अच्छा पढ़ा भी हजारों iptables ट्यूटोरियल में से एक है, बिल्कुल , / और ।outbound filteringprocesspid filteringport filtering


4

इसका उचित तरीका उस इंटरफ़ेस को बांधना () है जिसे आप आउटगोइंग पैकेट के लिए उपयोग करना चाहते हैं। जब से आप अपने आउटगोइंग इंटरफ़ेस के आधार पर पैकेट को रूट करने के तरीके को नियंत्रित करने के लिए ip routeऔर ip ruleकमांड के साथ रूट सेट कर सकते हैं। मेरे उदाहरण के लिए, मैं निम्नलिखित नेटवर्क को मानूंगा:

  • eth0:
    • पता: 192.168.0.2/24
    • डिफ़ॉल्ट गेटवे: 192.168.0.1
  • eth1:
    • पता: 192.168.1.2/24
    • डिफ़ॉल्ट गेटवे: 192.168.1.1

मैं दो रूटिंग टेबल बनाऊंगा, एक के लिए ट्रैफ़िक जा रहा है eth0 के लिए जिसे अल्टरनेट कहा जाता है और एक टेबल के लिए eth1 कहा जाता है। तालिका मुख्य रूटिंग हमेशा मौजूद है और सामान्य तालिका द्वारा प्रयोग किया जाता है routeऔर ip routeआदेशों। अधिकांश लोग कभी भी किसी अन्य तालिकाओं के साथ व्यवहार नहीं करते हैं। वैकल्पिक नामक तालिका बनाने के लिए, हम निम्नलिखित पंक्ति को जोड़ेंगे/etc/iproute2/rt_tables :

10    alternate

तालिका मुख्य में 254 की डिफ़ॉल्ट प्राथमिकता है। नियम जिसके लिए रूटिंग तालिका प्रभावी है, ip ruleकमांड द्वारा नियंत्रित किया जाता है । डिफ़ॉल्ट रूप से, वह आदेश मौजूदा नियमों की एक सूची का प्रिंट आउट करेगा, जो कुछ इस तरह दिखना चाहिए:

0:      from all lookup local 
32766:  from all lookup main 
32767:  from all lookup default 

यह मूल रूप से कहता है कि यह तालिका में एक मार्ग की तलाश करेगा localजो कि एक विशेष तालिका है जो स्थानीय मार्गों जैसे कि मेरे स्वयं के आईपी पते के लिए कर्नेल द्वारा रखी गई है। इसके बाद टेबल मेन और टेबल डिफॉल्ट की कोशिश होगी। टेबल डिफॉल्ट आम तौर पर खाली होता है, यदि मुख्य में कोई मेल नहीं है, तो होस्ट करने का कोई रास्ता नहीं है। सबसे पहले, eth0 के लिए नियमों के साथ तालिका वैकल्पिक भरने की सुविधा देता है।

sudo ip route add table alternate 192.168.0.0/24 dev eth0
sudo ip route add table alternate 192.168.1.0/24 dev eth1
sudo ip route add table alternate default via 192.168.0.1

आप सामान्य रूप से alternateतालिका को समान दिखना चाहेंगेmain । केवल अंतर तब होता है जब रूटिंग अलग होना चाहिए। यदि आप शाब्दिक रूप से सभी NFS, HTTP, इत्यादि को यातायात के लिए डिफ़ॉल्ट रूप से गेटवे से गुजरना चाहते हैं, तो यह दूसरी पंक्ति को ऊपर शामिल नहीं करना चाहेगा, भले ही यह eth1 पर नेटवर्क के लिए नियत हो। अगला कदम इस वैकल्पिक रूटिंग तालिका का उपयोग करने के लिए एक नियम जोड़ना है:

sudo ip rule add from 192.168.0.0/24 pref 10 table alternate

यह नियम कहता है कि 192.168.0 नेटवर्क पर एक पते से आने वाला कोई भी ट्रैफ़िक alternateसामान्य mainटेबल के बजाय रूटिंग टेबल का उपयोग करेगा । अंतिम चरण यह सुनिश्चित करना है कि सभी ग्राहक eth0इसे बांधने का उपयोग करें । साथ wget, उदाहरण के लिए, सेट --bind-address=192.168.0.2, एनएफएस के लिए निर्धारितclientaddr=192.168.0.2माउंट विकल्प। अगर पर्ल के साथ LibWWW का उपयोग कर रहे हैं, तो आप LWP :: UserAgent में स्थानीय इंटरफ़ेस को नियंत्रित करने के लिए इसे सेट कर सकते हैं। यदि आपके पास ऐसा कोई क्लाइंट है, जिसे आप बाइंडिंग को नियंत्रित नहीं कर सकते हैं और संकलन का स्रोत कोई विकल्प नहीं है, तो आप इसका पता बदलने के लिए iptables नियम का उपयोग करने में सक्षम हो सकते हैं, लेकिन यह हैक का अधिक है और काम नहीं कर सकता है। आपको एक एनएटी नियम की आवश्यकता होगी जो एनएटी टेबल या मेंगल टेबल की PREROUTING श्रृंखला में स्थापित हो। इसके बाद भी आपको काम करने के लिए ऊपर दी गई संशोधित रूटिंग टेबल की आवश्यकता होगी।

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.