IPTABLES - एक विशिष्ट आने वाले IP की सीमा दर


103

मैं किसी विशिष्ट सेवा की दर को सीमित नहीं करना चाहता। मेरा लक्ष्य केवल आने वाले आईपी पते के आधार पर दर को सीमित करना है। उदाहरण के लिए छद्म नियम का उपयोग कर:

john.domain.local (192.168.1.100) can only download from our httpd/ftp servers at "10KB/s" (instead of 1MB/s)

आने वाले IP पतों के आधार पर मैं IPTables का उपयोग करके किस प्रकार सीमा कर सकता हूं?

जवाबों:


165

IPTables इस तरह के काम के लिए नहीं बनाया गया है, जहाँ इन निर्णयों को करने के लिए बहुत सारे और बहुत सारे पैकेटों का विश्लेषण किया जाना चाहिए। IPTables आंशिक रूप से हालांकि उत्तर है!

इसका वास्तविक उत्तर लिनक्स में भयानक और अप्रयुक्त यातायात नियंत्रण सुविधाएं हैं। ध्यान दें कि यह जानने के बिना कि यह मशीन के लिए नेटवर्क कनेक्टिविटी खोने के कारण क्या हो रहा है, इस पर ध्यान दें! आपको चेतावनी दी गई है!

Eth0 मानते हुए आउटगोइंग डिवाइस आपको एक क्लास-आधारित ट्रैफिक कंट्रोल कतार बनाने की आवश्यकता होगी जो डिफ़ॉल्ट आउटपुट अधिकांश ट्रैफ़िक को 'तेज़' कतार के माध्यम से बनाएगी और लोगों की एक विशिष्ट सूची को 'धीमी' कतार में डाल देगी।

इसकी सुंदरता यह है कि आप एक ऐसी स्थिति बना सकते हैं जिससे आप धीमे उपयोगकर्ता के लिए बहुत से आउटबाउंड ट्रैफ़िक की अनुमति दे सकते हैं जब तक कि कोई ओवरराइडिंग क्लास बैंडविड्थ नहीं चाहता है, लेकिन यह उदाहरण ऐसा नहीं करता है (हमेशा धीमे उपयोगकर्ताओं को 10kbps प्रदान करेगा)। कतारबद्ध प्रणाली कुछ इस तरह दिखाई देगी:

                         Inbound traffic
                              +
                              |
                              |
                              v
                     +------------------+
                     |   Class 1:1      |
                     |------------------|
                     |  Root (all flows)|
                     |       100mbit    |
                     +-----+-----+------+
                           |     |
                           |     |
                           |     |
                           |     |
                           |     |
          +----------+     |     |     +----------+
          |    1:11  +-----+     +-----+    1:12  |
          |----------|                 |----------|
          | Default  |                 | Slow     |
          |100mb-80kb|                 |   80kb   |
          +----------+                 +----------+

ऐसा करने के लिए, पहले आपको कर्नेल में पंक्तिबद्ध अनुशासन सेटअप करना होगा। निम्नलिखित आपके लिए यह करेंगे .. आपको इसे एक पूरी स्क्रिप्ट के रूप में चलाना होगा

#!/bin/bash
tc qdisc add dev eth0 parent root handle 1: hfsc default 11
tc class add dev eth0 parent 1: classid 1:1 hfsc sc rate 100mbit ul rate 100mbit
tc class add dev eth0 parent 1:1 classid 1:11 hfsc sc rate 99920kbit ul rate 100000kbit
tc class add dev eth0 parent 1:1 classid 1:12 hfsc sc rate 80kbit ul rate 80kbit

tc qdisc add dev eth0 parent 1:11 handle 11:1 pfifo
tc qdisc add dev eth0 parent 1:12 handle 12:1 pfifo

"डिफ़ॉल्ट 11" महत्वपूर्ण है क्योंकि यह कर्नेल को बताता है कि यातायात के साथ क्या करना है वर्गीकृत नहीं।

एक बार यह हो जाने के बाद, आप एक निश्चित मानदंडों से मेल खाने वाले पैकेटों को वर्गीकृत करने के लिए एक iptables नियम सेट कर सकते हैं। यदि आप बहुत से और बहुत से लोगों को इस धीमे नियम में रखने की योजना बनाते हैं, तो एक ipset नियम अधिक उपयुक्त है (जो मुझे विश्वास है कि rhel6 पर उपलब्ध होना चाहिए)।

तो, के खिलाफ मिलान करने के लिए एक ipset डेटाबेस बनाएँ ...

ipset create slowips hash:ip,port

फिर मैच करने के लिए iptables नियम बनाएं ।।

iptables -t mangle -I OUTPUT -m set --match-set slowips dst,src -j CLASSIFY --set-class 1:12

यह कर्नेल को निर्देश देता है कि यदि आप सेट से स्रोत पोर्ट के साथ गंतव्य आईपी से मेल खाते हैं, तो इसे ट्रैफ़िक नियंत्रण के साथ आपके द्वारा सेट की गई धीमी कतार में वर्गीकृत करें।

अब, अंत में जब भी आप एक आईपी को धीमा करना चाहते हैं तो आप सेट के लिए आईपी को जोड़ने के लिए ipset कमांड का उपयोग कर सकते हैं जैसे कि:

ipset add slowips 192.168.1.1,80
ipset add slowips 192.168.1.1,21
...

आप कमांड "tc -s class show dev eth0" का उपयोग करके यह परीक्षण कर सकते हैं और आप वहाँ आँकड़ों को धीमी कतार में पुनर्निर्देशित होने के संकेत देते हुए देखेंगे।

केवल वास्तविक नकारात्मक पक्ष यह नोट करें कि यह रिबूट से बच रहा है। मुझे नहीं लगता कि रिबूट पर डिप्स से आईपेट्स बनाने के लिए कोई इनिट स्क्रिप्ट उपलब्ध हैं (और उन्हें iptables नियमों से पहले भी बनाया जाना चाहिए ) और मुझे लगता है कि रीबूट पर ट्रैफिक कंट्रोल नियमों को रीसेट करने के लिए कोई इनिट स्क्रिप्ट नहीं है। यदि आपकी परेशान नहीं है, तो आप किसी स्क्रिप्ट में rc.local को इनवॉइस करने से पूरी चीज़ को फिर से बना सकते हैं।


3
खैर, मैं आपको पर्याप्त धन्यवाद नहीं दे सकता। यह बहुत वर्णनात्मक और बहुत जानकारीपूर्ण है। मुझे बाद में पता चला कि टीसी के ज्ञान की आवश्यकता होगी और मैंने तब से इसे देखना शुरू कर दिया है। एक बार फिर धन्यवाद!
जेम्स

ओह और कनेक्शन खोने के लिए के रूप में। मैं यह सुनिश्चित कर रहा हूं कि मेरे VPS से होस्ट मशीन में जाने से पहले मेरे पास कॉन्फ़िगरेशन है। इसके अलावा, मेरे पास ETH0 पर निजी नेटवर्क के लिए वीपीएन एक्सेस है। मैं केवल ETH1 पर काम करूंगा ताकि सिद्धांत में मुझे समस्या न हो। लेकिन चेतावनी सुनी!
जेम्स

2
मैं आपको बता नहीं सकता कि मैंने कितनी बार इसी तरह के ट्यूटोरियल पढ़े हैं, यह पहला ऐसा अर्थ है जो बनाया गया है
RC1140

5
एक विचारधारा के रूप में, यह आमतौर पर नियंत्रण समूहों में इस तरह की संसाधन सीमा को करने के लिए अधिक उपयुक्त है (फिर से, संभव भी और अप्रयुक्त और भयानक) के रूप में आप एक केंद्रीकृत नीति काउंटर में सीपीयू, मेमोरी, आईओ और नेटवर्क पर प्रति-आवेदन सीमा को परिभाषित कर सकते हैं। '। लेकिन अभी तक इस तरह के सवाल का जवाब देने के लिए प्रस्तुत होने के लिए देखा गया है।
मैथ्यू इफ

2
यदि आपको tcसिंटैक्स पसंद नहीं है, तो आप tcng को एक कोशिश दे सकते हैं जो थोड़ा और उपयोगकर्ता के अनुकूल भाषा जोड़ता है जो tcकमांड उत्पन्न करता है । मुझे शेल स्क्रिप्ट में यह पसंद आया है echo '... multi line tcng configuration ...' | tcng | sh:।
मैटियास वाडमैन

5

यह नियम को सीमित करने और -sस्विच को जोड़ने के रूप में सरल है । -sस्विच भेजे आईपी मेल खाता है। उदाहरण के लिए iptables -A INPUT -s 1.1.1.1और फिर उस नियम के लिए अपनी पसंदीदा विधि को सीमित करने के साथ खत्म करना।


आपके त्वरित उत्तर के लिये धन्यवाद। दुर्भाग्य से मेरी मुख्य समस्या दूसरी छमाही है। मैंने देखा - बिल्कुल और मैंने ऐसा कुछ भी नहीं देखा है जो मुझे KB / s के आधार पर सीमित करने की अनुमति देता है - कोई भी दिशा जो आप मुझे इंगित कर सकते हैं?
जेम्स

1
@ जेम्स मैं तुम्हें वापस मिल गया होगा, लेकिन मुझे एक दोस्त के घर जाना था। बस वापस आ गया और मैं देखता हूं कि मिफे ने काफी काम किया है। =)
वेस्ले
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.