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


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

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

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


101
2018-04-28 21:09


मूल




जवाब:


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

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

मानना ​​है कि 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 नियम सेट कर सकते हैं। यदि आप इस धीमी नियम में बहुत सारे और बहुत से लोगों को डालने की योजना बना रहे हैं तो एक इप्ससेट नियम अधिक उपयुक्त है (जो कि मुझे विश्वास है कि राहेल 6 पर उपलब्ध होना चाहिए)।

तो, मिलान करने के लिए एक 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
...

आप इसे "टीसी-एस क्लास शो देव eth0" कमांड का उपयोग करके काम कर सकते हैं और आप वहां आंकड़े देखेंगे जो धीमे कतार में रीसेट किए जा रहे पैकेट को इंगित करते हैं।

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


165
2018-04-28 23:35



खैर, मैं आपको पर्याप्त धन्यवाद नहीं दे सकता। यह बहुत वर्णनात्मक और बहुत ही जानकारीपूर्ण है। बाद में मुझे एहसास हुआ कि टीसी के ज्ञान की आवश्यकता होगी और मैंने बाद में इसे देखना शुरू कर दिया है। एक बार फिर धन्यवाद! - James
ओह और कनेक्शन खोने के लिए। मैं यह सुनिश्चित कर रहा हूं कि मेरे वीपीएस से होस्ट मशीन पर जाने से पहले मेरे पास कॉन्फ़िगरेशन हो। इसके अलावा, मेरे पास ईटीएच 0 पर निजी नेटवर्क के लिए वीपीएन पहुंच है। मैं केवल ईटीएच 1 पर काम कर रहा हूं इसलिए सिद्धांत में मुझे समस्या नहीं है। लेकिन चेतावनी सुनी! - James
मैं आपको बता नहीं सकता कि मैंने कितनी बार इसी तरह के ट्यूटोरियल पढ़े हैं, यह पहला ऐसा है जो समझ में आया है - RC1140
एक sidenote के रूप में, यह आमतौर पर नियंत्रण समूहों में संसाधन सीमा (फिर भी, भी संभव और भी उपयोग और भयानक) में संसाधन सीमा करने के लिए अधिक उचित है क्योंकि आप cpu, स्मृति, आईओ और नेटवर्क पर प्रति-आवेदन सीमा को केंद्रीकृत 'पॉलिसी स्टोर में परिभाषित कर सकते हैं '। लेकिन अभी तक ऐसा कोई जवाब देने के लिए एक प्रश्न नहीं देखा गया है। - Matthew Ife
अगर आपको पसंद नहीं है tc वाक्यविन्यास आप दे सकते हैं tcng एक कोशिश जो उत्पन्न करने वाली थोड़ी अधिक उपयोगकर्ता अनुकूल भाषा जोड़ती है tc आदेश देता है। मैंने इसे शेल स्क्रिप्ट में पसंद किया है: echo '... multi line tcng configuration ...' | tcng | sh। - Mattias Wadman


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


5
2018-04-28 21:12



आपके त्वरित उत्तर के लिये धन्यवाद। दुर्भाग्य से मेरी मुख्य समस्या यह दूसरी छमाही है। मैंने --limit में देखा है और मैंने कुछ भी नहीं देखा है जो मुझे केबी / एस के आधार पर सीमित करने की अनुमति देता है - कोई भी दिशा जिसे आप मुझे इंगित कर सकते हैं? - James
@ जेम्स मैं आपको वापस मिल गया होता लेकिन मुझे किसी मित्र के घर जाना पड़ा। बस वापस आ गया और मैंने देखा कि एमआईएफ ने काफी काम किया है। =) - Wesley