الاستخدامات المتقدمة للـ IPtables

الاستخدامات المتقدمة للـ IPtables

مقدمة:


إن الجداري الناري في نظام لينوكس يحتوي العديد من الخيارات و يمتلك المرونة الكافية لأي مدير شبكة يحتاج جدار ناري متكامل و احترافي. في موضوعنا إن شاء الله سنتكلم عن البعض القليل للاستخدامات المتقدمة في الجدار الناري لنظامنا الحبيب, ولا يعني هذا أننا عرفنا ولو 1% من بحر هذا الجدار الناري.

ملاحظة: سأفترض في هذا المقال أنك تعرف أساسيات Iptables جيدا.

سنغطي في هذا الموضوع النقاط التالية:

1- تحديد أكثر من منفذ(port) و التعامل معهم في سطر واحد

2- موازنة الحمل (Load Balancing).

3- تحديد عدد الاتصالات أو الطلبات.

4- الإبقاء على الاتصالات الحالة فقط.

5- مطابقة الاتصالات التي تحتوي على أحمال.

6- تنفيذ قاعدة عند وقت معين.

7- تحديد حصص النقل.


1- تحديد أكثر من منفذ(port) و التعامل معهم في سطر واحد

لنعرف مدى حاجتنا إلى حل مناسب يجب أن نفرض المشكلة, لو أردنا أن نسمح للمنافذ التالية فقط أن تكون مفتوحة (80,22,25,443,21) , فإن القواعد اللتي يجب أن تُكتب هي ..

iptables -A INPUT -i eth0 -p tcp -m state --state NEW --dport 22   -j ACCEPT
iptables -A INPUT -i eth0 -p tcp -m state --state NEW --dport 25   -j ACCEPT
iptables -A INPUT -i eth0 -p tcp -m state --state NEW --dport 80   -j ACCEPT
iptables -A INPUT -i eth0 -p tcp -m state --state NEW --dport 443  -j ACCEPT
iptables -A INPUT -i eth0 -p tcp -m state --state NEW --dport 21   -j ACCEPT

ما رأيك لو جعلنا الخمس سطور في سطر واحد؟ بإضافة إضافة(module) صغيرة و فعالة.

iptables -A INPUT -i eth0 -p tcp -m state --state NEW -m multiport --dports 22,25,80,443,21 -j ACCEPT

وهو هذا الـ Module المسمى (multiport) يدعم حتى 15 منفذ في سطر واحد

2- موازنة الحمل (Load Balancing)

تخيل أنك تمتلك أربعة خوادم ويب يعلمون كمرآة لبعضهم(Mirrored Web Server) و تريد توزيع الحمل عليهم بحيث لا يزد الضغط أو الطلب على أحدهم دون الأخر. ستكون اﻵن مخير في أن تجعل توزيع الحمل بطريقة(nth) أو(random) و ما بين الأقواس السابقة ما هي إلا إضافات (modules) سنضيفها للجدار الناري كما فعلنا سابقا و ينشرح فكرة عملة كل طريقة .. لنرى

  • توزيع بطريقة nth

iptables -A  PREROUTING -i eth0 -p tcp --dport 80 -m state --state NEW -m nth --counter 0 --every 4 --packet 0 -j DNAT --to-destination 192.168.0.5:80
iptables -A  PREROUTING -i eth0 -p tcp --dport 80 -m state --state NEW -m nth --counter 0 --every 4 --packet 1 -j DNAT --to-destination 192.168.0.6:80
iptables -A  PREROUTING -i eth0 -p tcp --dport 80 -m state --state NEW -m nth --counter 0 --every 4 --packet 2 -j DNAT --to-destination 192.168.0.7:80
iptables -A  PREROUTING -i eth0 -p tcp --dport 80 -m state --state NEW -m nth --counter 0 --every 4 --packet 3 -j DNAT --to-destination 192.168.0.8:80

إن هذه الإضافة (nth) تحتوي على عدّادات(counter) عددها 16 عدّاد, من (0 إلى 15). مهمتها هي عندما يصل عدد الPKTs إلى العدد المحدد

(في مثالنا كل أربعة حزم (every 4)) فإنه يقوم بتصفير العداد مرة أخرى.في قواعدنا الأربعة السابقة تم استخدام العداد رقم صفر في جمعهم لكي يعدوا كل أربع حزم قادمة. طريقة علمهم: تستقبل أول قاعدة أول حزمة من الأربع حزم , ثم تستقبل القاعدة الثانية ثانية حزمة من الأربعة حزم وهكذا في القاعدة الثالثة و الرابعة. ثم تعود القاعدة الأولى باستقبال أول حزمة من الأربعة حزمة التالية.

  • توزيع بطريقة random

iptables -A  PREROUTING -i eth0 -p tcp --dport 80 -m state --state NEW -m random --average 25  -j DNAT --to-destination 192.168.0.5:80
iptables -A  PREROUTING -i eth0 -p tcp --dport 80 -m state --state NEW -m random --average 25  -j DNAT --to-destination 192.168.0.6:80
iptables -A  PREROUTING -i eth0 -p tcp --dport 80 -m state --state NEW -m random --average 25  -j DNAT --to-destination 192.168.0.7:80
iptables -A  PREROUTING -i eth0 -p tcp --dport 80 -m state --state NEW -j DNAT --to-destination 192.168.0.8:80

هذه الإضافة(random) تقوم بمطابقة الحزمة بالنسبة المئوية قياسا على حجم جميع الحزم المتجهة إلى منفذ معين عن طريق بروتوكول معين (في مثالنا بروتوكول الاتصال TCP و المنفذ 80). طريقة عملهم: تأخذ أول قاعدة نسبة من مجموع الحزم يتضح ذلك هنا (average 25) هنا في مثالنا ستأخذ أول قاعد 25% فقط من مجموع عدد الحزم و سترسل جميع الـ75% المتبقية إلى القاعدة الثانية و لو نظرنا للقاعدة الثانية سنجد أنها ستأخذ أيضا 25% من مجموع عدد الحزم و سترسل بقية 50% إلى القاعدة الثالثة و القاعدة الثالثة ستأخذ 25% أما الرابعة فلم نحدد لها average لكي تأخذ ما تبقى و على العلم أننا نستطيع أن نغير في average كيفما نشاء

نستطيع أن نستخدم هذه الإضافة في غرض آخر ألا و هو اختبار الشبكة و الحمل عليها و قياس حالة البرامج و الأجهزة في الشبكة و اللتي تعتمد في علمها على الشبكة.

3- تحديد/تحجيم عدد الاتصالات أو الطلبات في وقت محدد

هناك إضافتين مسؤولة عن هذه المهمة الأولى “limit” و التي تقوم بتحديد زمن معين لعدد الطلبات المحدد. الإضافة الثانية “iplimit” و التي تقوم بتحديد عدد الاتصالات من عنوان أو شبكة معينه. بمعنى أخر أن نسمح بعدد من الاتصالات في زمن محدد لعنوان محدد . نستفيد من هذه الخاصية في ..

  • الحماية من هجمات حجب الخدمة DoS كأن نمنع هجمات إغراق خادم الويب بالطلبات مثلا
  • الحماية من هجمات Brute Force و التي تعتمد على تخمين كلمات المرور.
  • الحد من الاستهلاك المفرط للإنترنت خلال ساعات العمل.

iptables -A FORWARD -m state --state NEW -p tcp -m multiport --dport http,https -o eth0 -i eth1 -m limit --limit 50/hour --limit-burst 5 -j ACCEPT

في القاعدة السابقة, افترضنا أننا نمتلك خادم بروكسي و هو اللذي يقوم بإيصال الإنترنت للموظفين خلال ساعات العمل. نريد أيضا أن نحدد تصفح المواقع , يحتوي خادمنا على كرتين شبكة eth0 موصل بالإنترنت و eth1 موصل بالشبكة المحلية. و في القاعدة السابقة سمحنا للشبكة ب50 اتصال جديد بمواقع الإنترنت في الساعة حيث يظهر هذا هنا (limit 50/hour) و أما في معامل (limit-burst) فهو يقوم بمنع جهاز واحد أن يأخذ كامل الـ 50 اتصال دفعة واحدة و سيتم شرحة بعد قليل.

ملاحظة:

  • تستطيع أن تغير الوحدة الزمنية إلى ثانية/sec أو دقيقة/minute أوساعة/hour أو يوم/day ,
  • إن لم تضع قيم للموديول limit فإنه سأخذ قيم افتراضية تساوي 3/hour

لو نظرنا في القاعدة السابقة إلى قيمة المعامل (limit-burst) سنجدها تساوي 5.

حسنا ماذا تعني 5 ؟ هل هي زمن أم نسبة أم عدد اتصالات أم ماذا ؟ سأشرح ما سيحدث عند تطبيق القاعدة السابقة

المعامل (limit-burst 5) سيسمح بخمسة حزم جديدة(خمس اتصالات) مرة واحدة.

عند ربط المعالم (limit-burst 5) مع الـموديول (limit 5/hour) فسيخرج لنا وظيفة تربط بين كلاهما و هي أنه سيقوم بقبول خمس اتصالات مرة واحدة

iptables -A INPUT -p tcp -m state --state NEW --dport http -m iplimit --iplimit-above 5 -j DROP

للمزيد من المعلومات نفذ الأمر :

iptables -m iplimit –help

4- الإبقاء على عدد اتصالات محددة فقط

نواجه دوما مشاكل عمل المسح على منافذ الخوادم و قد نجد المسح مركز على منافذ مهمة. و مهمة قواعدنا التالية هي معرفة العناوين التي تقوم بعمل مسح أو محاولات دخول على المنافذ المهمة و تضعها في قائمة مؤقتة ثم نقوم بالتعامل معها في قاعدة تليها مباشرة حيث نستطيع أن نقوم بحظرها أو توجيهها إلى عنوان آخر أو التحكم في الرد عليها بشكل معين.

مثلا عندنا المنفذ 22 الخاص بخدمة الـ SSH و اللذي دوما نعاني من محاولة المسح عليه, لذا لنتعامل مع هذه المشكلة بالشكل التالي.

  • نستخدم الإضافة recent لننشئ قائمة مؤقته نحظر فيها كل العناوين التي تقوم بالمسح
  • بما أننا سننشى قائمة في ملف فلزاما أن يأخذ هذا الملف اسما. نقوم بإعطاء إسم لهذه القائمة/الملف عن طريق المعامل name فإن لم نعطيها أسم فإنها ستأخذ اسما افتراضية وهو DEFAUL
  • بما أننا سننشئ قائمة نضع فيها العناوين إذا يجب أن نتأكد من وجود هذه العنوان مسبقا أم لا لقي لا نضيف عناوين موجدة أصلا و نملأ القائمه بما لا يفيد. و هذا عن طريق المعامل rcheck
  • بما أننا قلنا قائمة/ملف مؤقت فإننا يجب أن نحدد وقت لهذا التوقيت حيث ليس من المفترض أن نحظره مطلقا فقد يكون من يحاول الاتصال بالمنفذ مسموح له بالاتصال لكنه نفذ العملية أكثر من مرة بشكل خاطئ عن طريق المعامل

iptables -A FORWARD -m recent --name portscan - -rcheck --seconds 300 -j DROP
iptables -A FORWARD -p tcp -i eth0 --dport 22 -m recent --name portscan --set -j DROP

للمزيد من المعلومات نفذ الأمر :

iptables -m recent --help

5- مطابقة ومنع/السماح للاتصالات التي تحتوي على امتداد معين

بحكم أن شبكات الشركات و المنظمات تحتوي على أنظمة متعددة بناء على متطلباتها, فإنه لزاما علينا تحديد نوع الملفات المسموح بها من الإنتر خاصة و إن كانت شبكة تحتوي على نظام تشغيل Microsoft Windows فهو مستهدف و بكثرة من الفيروسات و الديدان و لهذا من الأفضل منع تحميل الملفات التنفيذية بأي شكل من الأشكال إلا إذا دعت الضرورة لذلك و يكون تحت إشراف/مراقبة مدير الشبكة

iptables -A FORWARD -m string --string '.bat' -j DROP
iptables -A FORWARD -m string --string '.exe' -j DROP

عيب تلك القواعد السابقة أنها تقوم بمطابقة القاعدة على شكل“string” أي أنه لا يفهم طبيعة المحتوى فإذا قمت بتحميل برنامج فإنه سيقوم بمنع التحميل. و إذا احتوى بريد إلكتروني على كلمة exe أو bat فإنه سيتم منعه ,, قس على ذلك كل البيانات الخارجة و الداخلة.

للمزيد من المعلومات نفذ الأمر :

iptables -m string --help

6- تنفيذ قواعد عند وقت محدد

نستطيع تطبيق قاعدة أو عدة قواعد في زمن معين في يوم معين أو في يوم معين في أسبوع معين. و هذا مفيد لتحديد وقت استخدام الإنترنت للشركات أو لمنع استخدام خدمات معينه في أوقات معينه مثل البريد و خلافه. أيضا يفيد في إيقاف الخدمات لوقت معين يحتاجه مدير الشبكة للقيام بصيانة الشبكة و أخذ نسخ احتياطي أو لوجود ثغرة أمنية في الشبكة و يتم حلها في وقت معين .. إلخ.

iptables -A FORWARD -p tcp -m multiport --dport http,https -o eth0 -i eth1 -m time --timestart 12:30 --timestop 13:30 --days Mon,Tue,Wed,Thu,Fri -j ACCEPT

تستخدم الساعات بشكل 24-ساعة أي أنك لو أردت إغلاق الخدمة الساعة الثانية و النصف بعد الظهر فإن التوقيت سيكون 14:30 و يفصل بين الساعات و الدقائق نقطتان فوق بعضهما.

تستخدم الأيام الأسبوع باختصارات و هي حساسة لحالة الحروف و تكتب كالتالي : Sat, Sun, Mon, Tue, Wed, Thu, Fri

تستخدم أيام الشهور بنفس الطريقة.

للمزيد من المعلومات نفذ الأمر :

iptables -m time --help

7- تحديد حصص النقل

تحديد حجم نقل و تحميل البيانات أمر مفيد جدا و يستخدما جليا عند شركات توزيع الإنترنت في الاشتراكات محدودة التحميل. فإذا أردت أن تقوم بتحديد حجم تحميل معين للشبكة و لنفرض على سبيل المثال أنك تريد أن تحدد حجم التحميل و يكون 4GB, و لكن في هذه الإضافة لا يقبل إلا قيمة بوحدة الـ Byte عندها ستكون معادلتنا كالتالي

230 × 4 = 4294967296

iptables -A INPUT -p tcp -m quota --quota 4294967296 -j ACCEPT
iptables -A INPUT -j DROP

عيب هذه الطريقة أنك لا تستطيع إضافة وقت محدد لكي تقوم القاعدة بتصفير عدادها اللذي امتلاء. و لكن الطرق المقترحة. إما أن تقوم بمسح القاعدة يدويا و كتابتها مرة أخرى . أو تقوم بعمل إعادة تشغيل restart للـ iptables . أو أن تضع القاعدة في Cron Job .

إن شاء الله إن وجدت أشياء جديدة و جميلة سأضعها, وإن كنت تعرف أخي القارئ بعض المهارات المفيدة تستطيع أن تضعها و عندها سأتشرف بإضافتها للموضوع

تحياتي و احترامي

13 رأي على “الاستخدامات المتقدمة للـ IPtables

  1. السلام عليكم ورحمة الله وبركاته
    هو ده الكلام المظبوط
    استاذى وحبيبى الملك king Sabri اخبارك ايه
    ما شاء الله عليك بالفعل هذا الجدار يبرز مدى قوة نظام التشغيل لينكس فمن خلاله يمكن تطبيق الكثير والكثير من الافكار الاحترافية وهو بحق لا غنى عنه لاى مدير شبكة
    تسلم ايدك ودمت بود

  2. عليكم السلام ورحمة الله

    يا دكتور إنت مش عارف إنك بتوحشنى ؟ مختفي ليه ؟

    الحمدلله أنا بخير و نعمة و نسأل الله الوصول إلى مبتاغانا

    تحياتي و احترامي

  3. بسم الله الرحمن الرحيم
    بسم الله ما شاء الله
    اضافة جيدة للقارئ العربى
    وفقك الله
    بالمناسبة 🙂
    الف مبروك على اجتيازك RHCE
    علمت بالخبر من مدونة اخونا الفاضل على الشمرى
    http://www.binary-zone.com/2009/12/25/%D8%B9%D9%86%D8%A7%D9%88%D9%8A%D9%86-%D9%83%D8%AB%D9%8A%D8%B1%D8%A9-%D9%81%D9%8A-%D8%B9%D9%86%D9%88%D8%A7%D9%86-%D9%88%D8%A7%D8%AD%D8%AF/comment-page-1/#comment-5172
     
    من باب العلم بالشئ :
    كم استغرق وقت الاعداد و المذاكرة للوصول لمستوى يؤهلك لاجتياز الامتحان
    أسابيع ام ……
    هذا بافتراض Self Study  ثم التدريب العملى على جهاز عندك فى المنزل
    ام انك اخذت Courses فى  Redhat Partner مثل { اذا كنت فى مصر}
    http://www.linux-plus.com
    http://www.masterlinux.net
    و جزاكم الله خيرا

  4. # محمد: أولا  مرحبا بك في زيارتك الأولى و أرجوا أن تشرفني بك دوما

    ثانيا.. بالنسبه للكورس أعتقد و الله أعلم (إن اجتهدت) فأظن أنه يكفي أن تدرسه في البيت مع وجود الكتب و التطبيق الكثير  و التمكن من كل ما تفعله و أن تكون مرن في النظام و واصق من نفسك بأنك ستعرف أن تحل المشاكل و بثقة نفس

     

    الإمتحان و الله إنه غير صعب لمن ذاكر و طبق و تمكن من النظام و فعلا الإمتحان أسهل مما تتخيل لكن بالشروط السابقة

    مدة الإمتحان 3.5 ساعات و الحمدلله أنهيت الإمتحان بعد ما يقارب الساعة و نصف فقط

    طبق كل الـ Labs الموجوده في الكتب و ستجد الإمتحان أسهل من الـ Lab  بكثير و هذا وعد

     

    بالتوفيق لك و لكل من يريد أن يتقدم للإمتاح

     

    تحياتي و احترامي

  5. السلام عليكم اخوي صبري الله يعطيك العافية يا رب موضوع فعلا قرأته عدة مرات واستفدت منه يا ورد
    اخوك ابو رأفت

  6. الله يعافيك يا خوي و إن شاء الله قريبا بإذن الله تجد أشياء أحلى و تليق بمقامكم

  7. الصراحة درس لا يعلى عليه اخوي صبري هههه وشكلي الأن رح ابلش اسئله كثير استحملني عاد
    اول شيء مثلا اا فهمت شغلات كثير ما كانت واضحة الي وخاصه ب iptable لأنه يوميا بواجهني مشاكل وبحث وقوانين فحبيت اني اسأل اكم سؤال
    الفرضيات او الاسئله الي بدي اسألها كلها خاصه بويب سيرفر وليس شبكة lan
    حاليا لو عملنا استعلام من خلال الشل عن عدد المتصلين على سيرفر و ip الواحد كم اتصال فاتح مع الخادم انت فوق كتبت لشبكة محلية في الامر هذا
    netstat -plan|grep :80|awk {‘print $5’}|cut -d: -f 1|sort|uniq -c|sort -nk 1
    مثلا بظهر النا عدد من ايبيات وكم اتصال على سيرفر احيانا تجد اي بي واحد فاتح 100 اتصال مع السيرفر
    ما هو تعديل القانون الي بنقدر نحدد مثلا لكل اي بي يقدر يفتح على الاكثر 5 اتصلات فقط على سيرفر او شو رأيك هل العدد قليل او كثير وغير هيك يتم منعه او اي حاجه بتقترحها
    ثاني شي :
    لدي المنفذ التالي على سيرفر
    123.123.123.123:2312
    البورت رقم 2313
    حاليا بدي امنع اي اتصال على المنفذ التالي ويعطي مثلا كونيكشن ايرور
    ولما ادخل على الرابط التالي
    123.123.123.123:2000
    يدخللني على نفس البورت الي كان يدخلني عليه 2313 لكن عباره عن عملية تزوير او اي شيء بتقدر تسميه
    انا وجدت حل لسؤال الثاني لكنه مقعد كثير فحبيت اشوف اذا عندك فكره او شيء بتقدر تريحني من هذا الشيء
    احترامي يا ورد
     

  8. الرد هذا على السؤال الثاني فقط بسبب ضيق الوقت

    حلك هو عمل NAT من نوع Port Forwarding
    ستجد شروحات كثيره لها هذه النقطة بالذات فضلا عن بقية الـ NATing لأن أناس كثير يحتاجونها

    ولو وجودت الحل قبل ما أرد ,, أكون شاكر لك لو أخبرتنا به

    أطلب العذر على عدم الرد الكامل ,, بسبب الوقت

    تحياتي و احترامي

  9. درس رائع يا اخي صبري
    تسلم ايدك افدتني كتيير
    الله يسعد ايامك

  10. صبرى باشا إيه اﻷخبار؟؟ واحشنى والله .. أول مره أدخل على المدونه ويا ريتنى دخلت من زمان بجد مجهود ممتاز يا صبرى … معظم الناس ( ومنهم أنا حتى وقت قريب ) يظنون أن الإستخدام الوحيد لل IPtables هو كـ Firewall فى حين أنه يمكن إستخدامه فى الكثير من التطبيقات … لكن عندى سؤال بخصوص استخدام ال IPtables لتحديد quota للمستخدمين على L2TP/IPSEC VPN server حيث أن يتم تحديد quota مجمعه لكل المستخدمين وفى نفس الوقت quota لكل مستخدم على حده. فى حالة استخدام ال quota الكليه يتم عمل rate limitting للـ interface المستخدمه من كل المستخدمين، أما فى حالة إستهلاك مستخدم واحد للـ quota الخاصه به يتم عمل rate limitting للـ PPP interface الخاصه به … ما أعرفه هو أنه سيتم استخدام ال iptables لتحديد ال quota و ال HTB لعمل ال rate limitting ولكن سؤال كيف يمكن لل iptables أن تتابع استهلاك المستخدمين لحصصهم بإسم المستخدم وليس ال PPP interface حيث أنها متغيره كل مره يقوم المستخدم بانشاء اتصال جديد؟

  11. طاب بالنسبه للسؤال إيه ؟؟؟؟ 🙂

اترك تعليقاً

لن يتم نشر عنوان بريدك الإلكتروني. الحقول الإلزامية مشار إليها بـ *