سؤال IPTABLES - الحد من معدل عنوان IP الوارد


لا أرغب في الحد من معدل خدمة معينة. أهدافي هو تحديد السعر الذي يعتمد فقط على عنوان IP الوارد. على سبيل المثال باستخدام قاعدة زائفة:

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

كيف يمكنني تحديد الحد باستخدام IPTables استنادًا إلى عناوين IP الواردة؟


101
2018-04-28 21:09


الأصل




الأجوبة:


لا يتم إعداد IPTables لهذا النوع من العمل ، حيث يلزم تحليل الكثير والكثير من الحزم لاتخاذ هذه القرارات. IPTables هو جزئيا الجواب على الرغم من!

الجواب الحقيقي على ذلك هو تسهيلات التحكم المرورية وغير المستغلة في لينكس. لاحظ أن التلويث بهذا بدون معرفة ما يحدث قد يؤدي إلى فقد اتصال الشبكة بالآلة! لقد تم تحذيرك!

بافتراض أن eth0 هو الجهاز الصادر ، ستحتاج إلى إنشاء قائمة انتظار للتحكم في حركة المرور حسب الفئة والتي ستقوم بشكل افتراضي بإخراج معظم حركة المرور من خلال قائمة الانتظار "السريعة" ووضع قائمة محددة بالأشخاص في قائمة الانتظار "البطيئة".

يكمن جمال هذا في إمكانية إنشاء موقف تسمح فيه بالكثير من حركة المرور الصادرة للمستخدم البطيء ، ما لم يرغب أحد الأشخاص الفائزين في عرض النطاق الترددي ، ولكن هذا المثال لا يفعل ذلك (سيوفر دائمًا 10 كيلوبت في الثانية للمستخدمين البطيئين). سيبدو نظام الطابور على النحو التالي:

                         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

هذا يُعلم النواة أنه إذا قمت بمطابقة عنوان IP للوجهة مع المنفذ المصدر من المجموعة ، فقم بتصنيفه في قائمة الانتظار البطيئة التي قمت بإعدادها للتحكم في حركة المرور.

الآن ، وأخيرًا عندما تريد إبطاء IP ، يمكنك استخدام الأمر ipset لإضافة عنوان IP إلى المجموعة مثل:

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

يمكنك اختباره باستخدام الأمر "tc -s class show dev eth0" وستظهر لك إحصائيات تشير إلى الحزم التي يتم إعادة توجيهها إلى قائمة الانتظار البطيئة.

لاحظ أن الجانب السلبي الحقيقي الوحيد هو جعله ينجو من إعادة التشغيل. لا أعتقد أن هناك أي برامج نصية أولية متاحة لإنشاء ipsets من مقالب إعادة التشغيل (ويجب أيضًا إنشاء قبل قواعد iptables) وأنا متأكد من عدم وجود مخطوطات المبادرة لإعادة ضبط قواعد التحكم في حركة المرور على إعادة التشغيل. إذا كنت لا تهتم ، يمكنك فقط إعادة إنشاء كل شيء من استدعاء برنامج نصي في rc.local.


165
2018-04-28 23:35



حسنا ، لا أستطيع أن أشكرك بما فيه الكفاية. هذا وصفي جدا ومفيد جدا. أدركت في وقت لاحق أن المعرفة TC ستكون مطلوبة ولقد بدأت منذ ذلك الحين النظر في هذا. شكرا لك مرة أخرى! - James
أوه وفقدان الاتصال. أنا أتأكد من أني أحتفظ بالتكوين قبل الانتقال من جهاز VPS إلى الجهاز المضيف. أيضا ، لدي وصول VPN إلى الشبكة الخاصة على ETH0. سأعمل فقط على ETH1 لذا من الناحية النظرية لن أواجه المشكلة. لكن تحذير سمعت! - James
لا أستطيع أن أخبركم كم مرة قرأت فيها برامج تعليمية مماثلة ، هذه هي المرة الأولى التي تكون منطقية - RC1140
كما sidenote ، عادة ما يكون أكثر ملاءمة لفرض قيود الموارد مثل هذا في مجموعات التحكم (مرة أخرى ، أيضا ممكن وغير مستغل ورائع) كما يمكنك تحديد حدود لكل تطبيق على وحدة المعالجة المركزية والذاكرة ، IO والشبكة في "مخزن سياسة" مركزي ". ولكن لم يتم بعد رؤية مثل هذا السؤال الذي يتم طرحه لتقديم إجابة. - Matthew Ife
إذا كنت لا تحب tc بناء الجملة يمكن أن تعطي tcng محاولة تضيف لغة أكثر ملاءمة للمستخدمين لتوليدها tc أوامر. اعتدت أن أحب هذا في مخطوطات شل: echo '... multi line tcng configuration ...' | tcng | sh. - Mattias Wadman


انها بسيطة مثل أخذ قاعدة الحد من المعدل وإضافة -s مفتاح كهربائي. ال -s التبديل مباريات عناوين IP الواردة. فمثلا iptables -A INPUT -s 1.1.1.1 ثم الانتهاء من طريقة تحديد السعر المفضل لهذه القاعدة.


5
2018-04-28 21:12



شكرا لك على الإجابة السريعة. للأسف مشكلتي الرئيسية هي النصف الثاني. لقد نظرت إلى - وأنا لم أر أي شيء يسمح لي بالحد استناداً إلى KB / s - أي اتجاه يمكنك الإشارة لي؟ - James
James كنت قد حصلت على العودة لك ولكن كان علي أن أخرج إلى منزل أحد الأصدقاء. عادت للتو وأرى أن MIfe قامت بعمل جيد. =) - Wesley