كيفية سرد وحذف قواعد جدار IPTables الناري


kinan mawed

iptables عبارة عن جدار ناري firewall يلعب دورًا أساسيًّا في أمان الشبكات لمعظم أنظمة لينِكس، وبينما تقوم العديد من دروس iptables بتعليمنا كيفيّة إنشاء قواعد الجدار النّاري لتأمين خادومنا، يُركِّز هذا الدرس على ناحية مختلفة من إدارة الجدار النّاري: سرد listing وحذف القواعد rules.

iptables-list-delete-rules.png

سنشرح في هذا الدّرس كيفيّة القيام بمهام iptables التالية:

  • سرد القواعد list rules
  • مسح عدادات Packet وByte
  • حذف القواعد
  • إفراغ السلاسل Flush chains (حذف جميع القواعد في السلسلة)
  • إفراغ السلاسل والجداول، حذف السلاسل، وقبول أي حركة مرور البيانات traffic

ملاحظة: احذر عند التعامل مع الجدار النّاري من حظر نفسك عن خادومك عن طريق حظر حركة مرور بيانات SSH (المنفذ 22 افتراضيًّا)، وإن فقدت النفاذ إليه بسبب إعدادات الجدار النّاري فربّما تحتاج للاتصال إليه عن طريق الـ console لإصلاح نفاذنا إليه، حيث تستطيع بعدها تغيير إعدادات الجدار النّاري للسماح بنفاذ SSH (أو أي حركة مرور بيانات traffic)، وإن كانت قواعد الجدار النّاري المحفوظة لديك تسمح بنفاذ SSH فمن الطرق الأخرى هي إعادة تشغيل خادومك.

المتطلبات الأساسية

ينبغي قبل أن تبدأ باتّباع هذا الدّرس أن تمتلك على خادومك حساب superuser غير جذري non-root مُنفصِل (مُستخدِم مع صلاحيّات sudo)، إن أردت إعداده اتبع الدّرس التّالي: الإعداد الابتدائي لخادوم أوبنتو 14.04.

فلنقم بإلقاء نظرة على كيفيّة سرد list القواعد أولًا. توجد طريقتان مختلفتان لعرض قواعد iptables النشيطة active: إمّا في جدول أو على شكل قائمة من مواصفات القواعد، تُزوِّدنا هاتان الطريقتان بنفس المعلومات تقريبًا في صيغ مختلفة.

سرد القواعد بحسب المواصفات Specification

لسرد جميع قواعد iptables النشيطة بحسب المواصفات نقوم بتنفيذ الأمر iptables مع الخيار S-:

sudo iptables -S
-P INPUT DROP 
-P FORWARD DROP 
-P OUTPUT ACCEPT 
-N ICMP 
-N TCP 
-N UDP 
-A INPUT -m conntrack --ctstate RELATED,ESTABLISHED -j ACCEPT 
-A INPUT -i lo -j ACCEPT 
-A INPUT -m conntrack --ctstate INVALID -j DROP 
-A INPUT -p udp -m conntrack --ctstate NEW -j UDP 
-A INPUT -p tcp -m tcp --tcp-flags FIN,SYN,RST,ACK SYN -m conntrack --ctstate NEW -j TCP 
-A INPUT -p icmp -m conntrack --ctstate NEW -j ICMP 
-A INPUT -p udp -j REJECT --reject-with icmp-port-unreachable 
-A INPUT -p tcp -j REJECT --reject-with tcp-reset 
-A INPUT -j REJECT --reject-with icmp-proto-unreachable 
-A TCP -p tcp -m tcp --dport 22 -j ACCEPT

يبدو الخرْج Output كما نرى مُشابِهًا للأوامر التي اعتدنا على إنشائها ولكن بدون أن يسبقها الأمر iptables، يبدو هذا أيضًا مُشابِهًا لملفّات إعدادات قواعد iptables إن قمت سابقًا باستخدام iptables-persistent أو iptables save.

سرد سلسلة محددة

إن أردنا تحديد الخَرْج إلى سلسلة مُحدّدة (مثل INPUT، OUTPUT، TCP، إلخ..) فبإمكاننا تحديد اسم السلسلة مباشرة بعد الخيار S-، على سبيل المثال لإظهار كافّة مواصفات القواعد في سلسلة TCP نقوم بتنفيذ الأمر التالي:

sudo iptables -S TCP
-N TCP 
-A TCP -p tcp -m tcp --dport 22 -j ACCEPT

فلنقم بإلقاء نظرة على الطريقة البديلة لعرض قواعد iptables النشيطة كجدول من القواعد.

سرد القواعد كجداول

يُمكِن أن يكون عرض قواعد iptables في طريقة عرض الجدول مفيدًا لمقارنة القواعد المختلفة مع بعضها.

لإخراج كافّة قواعد iptables النشيطة في جدول نقوم بتنفيذ الأمر iptables مع الخيار L-:

sudo iptables -L

سيقوم هذا بإخراج جميع القواعد الحاليّة مُرتّبة بحسب السلسلة.

إن أردنا تحديد الخَرْج إلى سلسلة مُحدّدة (مثل INPUT، OUTPUT، TCP، إلخ..) فبإمكاننا تحديد اسم السلسلة مباشرة بعد الخيار L-.

دعونا نلقي نظرة على مثال عن سلسلة الدّخل INPUT:

sudo iptables -L INPUT
Chain INPUT (policy DROP) 
target    prot opt source    destination 
ACCEPT    all  --  anywhere  anywhere        ctstate RELATED,ESTABLISHED 
ACCEPT    all  --  anywhere  anywhere 
DROP      all  --  anywhere  anywhere        ctstate INVALID 
UDP       udp  --  anywhere  anywhere        ctstate NEW 
TCP       tcp  --  anywhere  anywhere        tcp flags:FIN,SYN,RST,ACK/SYN ctstate NEW 
ICMP      icmp --  anywhere  anywhere        ctstate NEW 
REJECT    udp  --  anywhere  anywhere        reject-with icmp-port-unreachable 
REJECT    tcp  --  anywhere  anywhere        reject-with tcp-reset 
REJECT    all  --  anywhere  anywhere        reject-with icmp-proto-unreachable

يُشير السّطر الأول من الخَرْج إلى اسم السلسلة (في هذه الحالة INPUT) متبوعًا بسياسته policy الافتراضيّة (DROP).

يتكوّن السّطر التالي من ترويسة كل عمود في الجدول متبوعة بقواعد السلسلة، فلنقم بالمرور على دلالة كل ترويسة:

  • target: إن كانت الرزمة packet تُطابِق القاعدة يُحدِّد الهدف target ما ينبغي فعله معها، يُمكن على سبيل المثال أن يتم قبول، إسقاط drop، تسجيل، أو إرسال الرزمة إلى سلسلة أخرى لتتم مقارنتها مع قواعد أخرى
  • prot: الميفاق protocol، مثل tcp، udp، icmp، أو all
  • opt: يُشير هذا العمود إلى خيارات عنوان IP ونادرًا ما يتم استخدامه
  • source: عنوان IP المصدر أو الشبكة الفرعية subnet لحركة مرور البيانات traffic، أو anywhere
  • destination: عنوان IP الوجهة destination أو الشبكة الفرعية subnet لحركة مرور البيانات traffic، أو anywhere

يُشير العمود الأخير الذي لا يملك عنوان إلى خيارات options القاعدة، والتي هي أي جزء من القاعدة لم يتم الإشارة إليه في الأعمدة السابقة، يُمكن لها أن تكون أي شيء من منافذ ports المصدر والوجهة، وحتى حالة اتصال الرزمة.

إظهار تعداد الرزم Packet Counts والحجم الكلي Aggregate Size

من الممكن أيضًا عند سرد قواعد iptables أن نظهر عدد الرُّزَم packets والحجم الكلّي لها بالبايت، والذي يُقابل كل قاعدة مُحدّدة، يكون هذا مُفيدًا عادةً عندما نحاول أخذ فكرة تقريبيّة عن القواعد التي تُطابِق الرُّزَم، ولفعل هذا نستخدم ببساطة الخيارين L- وv- معًا.

فلنلقِ نظرة على سبيل المثال على سلسلة الدّخل INPUT مرّة أخرى مع الخيار v-:

sudo iptables -L INPUT -v
Chain INPUT (policy DROP 0 packets, 0 bytes) 
 pkts bytes  target  prot opt  in   out  source    destination 
 284K   42M  ACCEPT  all  --   any  any  anywhere  anywhere      ctstate RELATED,ESTABLISHED 
    0     0  ACCEPT  all  --   lo   any  anywhere  anywhere 
    0     0  DROP    all  --   any  any  anywhere  anywhere      ctstate INVALID 
  396 63275  UDP     udp  --   any  any  anywhere  anywhere      ctstate NEW 
17067 1005K  TCP     tcp  --   any  any  anywhere  anywhere      tcp flags:FIN,SYN,RST,ACK/SYN ctstate NEW 
 2410  154K  ICMP    icmp --   any  any  anywhere  anywhere      ctstate NEW 
  396 63275  REJECT  udp  --   any  any  anywhere  anywhere      reject-with icmp-port-unreachable 
 2916  179K  REJECT  all  --   any  any  anywhere  anywhere      reject-with icmp-proto-unreachable 
    0     0  ACCEPT  tcp  --   any  any  anywhere  anywhere      tcp dpt:ssh ctstate NEW,ESTABLISHED

نلاحظ أنّ القائمة تحتوي الآن على عمودين إضافيين وهما pkts وbytes.

الآن وقد عرفنا كيفيّة سرد قواعد الجدار النّاري النشيطة بطرق متعدّدة، فلنلقِ نظرة على كيفيّة تصفير reset عدادات الرُّزم والبايتات.

تصفير تعداد الرزم Packet Counts والحجم الكلي Aggregate Size

إن أردنا مسح أو تصفير عدادات الرُّزَم والبايتات لقواعدنا نستخدم الخيار Z-، يتم أيضًا تصفيرها عند حدوث إعادة تشغيل، وهذا مفيد لمعرفة إن كان خادومنا يتلقّى حركة مرور بيانات جديدة تتوافق مع قواعدنا الحاليّة.

لمسح العدادات لجميع السلاسل والقواعد نستخدم الخيار Z-:

sudo iptables -Z

ولمسح العدادات لجميع القواعد في سلسلة مُحدّدة نستخدم الخيار Z- مع تحديد السلسلة المطلوبة، على سبيل المثال لمسح عدادات سلسلة الدّخل INPUT نكتب هذا الأمر:

sudo iptables -Z INPUT

إن أردنا مسح العدادات من أجل قاعدة مُحدّدة نُحدِّد اسم السلسلة ورقم القاعدة، على سبيل المثال لتصفير العدادات للقاعدة الأولى في سلسلة الدّخل INPUT نقوم بتنفيذ الأمر التالي:

sudo iptables -Z INPUT 1

الآن وقد عرفنا كيفيّة تصفير عدادات الرُّزَم والبايتات في iptables فلنلقِ نظرة على طريقتي حذفهما.

حذف القاعدة بحسب المواصفات Specification

إنّ إحدى طرق حذف قواعد iptables هي عن طريق مواصفات القاعدة، ولفعل هذا نستطيع تنفيذ الأمر iptables مع الخيار D- متبوعًا بمواصفات القاعدة، إن أردنا استخدام هذه الطريقة لحذف القواعد فبإمكاننا استخدام خَرْج سرد القواعد (iptables –S) من أجل المساعدة.

إن أردنا على سبيل المثال حذف القاعدة التي تقوم بإسقاط (drop) الرُّزَم الخاطئة القادمة فبإمكاننا تنفيذ هذا الأمر:

sudo iptables -D INPUT -m conntrack --ctstate INVALID -j DROP

نلاحظ أنّه يجب علينا استبعاد الخيار A- والذي يُستخدَم للإشارة إلى موقع القاعدة في وقت إنشائها.

حذف القاعدة بحسب السلسلة والرقم

الطريقة الأخرى لحذف قواعد iptables هي عن طريق سلسلتها chain ورقم سطرها line number، ولتحديد هذا الرقم نقوم بسرد القواعد في صيغة جدول مع إضافة الخيار line-numbers--:

sudo iptables -L --line-numbers
Chain INPUT (policy DROP) 
num target prot opt source   destination 
  1 ACCEPT all  --  anywhere anywhere     ctstate RELATED,ESTABLISHED 
  2 ACCEPT all  --  anywhere anywhere 
  3 DROP   all  --  anywhere anywhere     ctstate INVALID 
  4 UDP    udp  --  anywhere anywhere     ctstate NEW 
  5 TCP    tcp  --  anywhere anywhere     tcp flags:FIN,SYN,RST,ACK/SYN ctstate NEW 
  6 ICMP   icmp --  anywhere anywhere     ctstate NEW 
  7 REJECT udp  --  anywhere anywhere     reject-with icmp-port-unreachable 
  8 REJECT tcp  --  anywhere anywhere     reject-with tcp-reset 
  9 REJECT all  --  anywhere anywhere     reject-with icmp-proto-unreachable 
 10 ACCEPT tcp  --  anywhere anywhere     tcp dpt:ssh ctstate NEW,ESTABLISHED ...

يُضيف هذا الخيار رقم السطر لكل قاعدة مع الإشارة إليه بالترويسة num.

بعد أن نعرف ما هي القاعدة التي نريد حذفها نتأكد من سلسلة ورقم سطر هذه القاعدة ثم نقوم بتنفيذ الأمر iptables –D متبوعًا بسلسلة ورقم القاعدة.

على سبيل المثال إن أردنا حذف قاعدة input التي تُسقِط الرُّزَم الخاطئة نستطيع أن نرى أنّها القاعدة 3 من السلسلة INPUT لذا نقوم بتنفيذ الأمر التالي:

sudo iptables -D INPUT 3

الآن وقد عرفنا كيفيّة حذف قواعد الجدار النّاري المفردة فلننتقل إلى كيفيّة إفراغ flush سلاسل القواعد.

إفراغ السلاسل

تُزوّدنا iptables بطريقة لحذف كافّة القواعد في سلسلة، أي إفراغ flush السلسلة، يُغطّي هذا القسم الطرق المتعدّدة لفعل هذا.

ملاحظة: انتبه، فقد تحظر نفسك عن خادومك عبر SSH عن طريق إفراغ سلسلة تمتلك سياسة افتراضيّة drop أو deny، إن فعلت ذلك فربّما تحتاج للاتصال بخادومك عبر الـ console لإصلاح النفاذ إليه.

1- إفراغ سلسلة مفردة

لإفراغ سلسلة مُحدّدة، والذي يقوم بحذف كافّة القواعد في هذه السلسلة، فبإمكاننا استخدام الخيار F- (أو الخيار flush-- المُكافِئ له) مع اسم السلسلة التي نريد إفراغها.

على سبيل المثال لحذف جميع القواعد في سلسلة الدّخل INPUT نقوم بتنفيذ هذا الأمر:

sudo iptables -F INPUT

2- إفراغ كافة السلاسل

لإفراغ كافّة السلاسل، والذي يقوم بحذف كامل قواعد الجدار النّاري لدينا، فبإمكاننا استخدام الخيار F- (أو الخيار flush-- المُكافِئ له):

sudo iptables -F

إفراغ جميع القواعد، حذف كامل السلاسل، وقبول أي حركة مرور بيانات traffic

سنشاهد في هذا القسم كيفيّة إفراغ كامل قواعد الجدار النّاري لدينا، الجداول، والسلاسل، والسماح بأي حركة مرور بيانات traffic على الشبكة.

ملاحظة: سيقوم هذا بتعطيل الجدار النّاري لديك بشكل كامل، ينبغي فقط أن تتبع هذا القسم إن أردت البدء من جديد في إعداد الجدار النّاري لديك.

نُعيّن في البداية السياسات الافتراضيّة لكل سلسلة مُضمَّنة إلى ACCEPT، السبب الأساسي لفعل هذا هو التأكد من عدم حظر أنفسنا عن خادومنا عبر SSH:

sudo iptables -P INPUT ACCEPT sudo iptables -P FORWARD ACCEPT sudo iptables -P OUTPUT ACCEPT

نقوم بعدها بإفراغ الجداول nat وmangle، إفراغ كامل السلاسل (F-)، وحذف كافّة السلاسل غير الافتراضيّة (X-):

sudo iptables -t nat -F sudo iptables -t mangle -F sudo iptables -F sudo iptables -X

سيسمح الآن جدارنا النّاري بكافة حركة مرور البيانات traffic على الشبكة، وإن قمنا بسرد قواعدنا الآن سنشاهد أنّه لا توجد أي قاعدة، وأنّه فقط بقيت لنا السلاسل الثلاث الافتراضية (INPUT، FORWARD، وOUTPUT).

الخاتمة

ينبغي بعد قراءة هذا هذا الدّرس أن تتكوّن لديك صورة واضحة حول كيفيّة سرد وحذف قواعد جدار iptables النّاري لديك.

تذكّر أنّ أي تغيير لـ iptables عبر الأمر iptables هو تغيير عابر، ويجب حفظه ليبقى بشكل دائم بعد إعادة تشغيل الخادوم، وقد تم شرح هذا في قسم حفظ القواعد من درس قواعد وأوامر شائعة للجدار النّاري.

ترجمة -وبتصرّف- لـ How To List and Delete Iptables Firewall Rules لصاحبه Mitchell Anicas.





تفاعل الأعضاء


لا توجد أيّة تعليقات بعد



يجب أن تكون عضوًا لدينا لتتمكّن من التعليق

انشاء حساب جديد

يستغرق التسجيل بضع ثوان فقط


سجّل حسابًا جديدًا

تسجيل الدخول

تملك حسابا مسجّلا بالفعل؟


سجّل دخولك الآن