كيفية إعداد جدار حماية Iptables لتمكين الوصول عن بُعد إلى الخدمات في Linux – الجزء 8

Linux Foundation Certified Engineer – Part 8

تقديم برنامج شهادات مؤسسة لينكس سيندي

سوف تتذكر من الجزء 1 – حول Iptables من هذه السلسلة LFCE (مهندس معتمد من مؤسسة لينكس) أننا قدمنا وصفًا أساسيًا لما هو جدار ناري: وهو آلية لإدارة الحزم القادمة إلى الشبكة والمغادرة منها. بـ “إدارة” نقصد في الواقع:

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

بناءً على معايير محددة.

في هذه المقالة سنناقش كيفية تنفيذ تصفية الحزم الأساسية وكيفية تكوين الجدار الناري باستخدام iptables، واجهة أمامية لـ netfilter، وهو وحدة النواة الأصلية المستخدمة لعمليات تصفية الحزم.

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

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

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

قد نجد تشبيه المطار مفيدًا خلال بقية هذا البرنامج التعليمي. فقط ضع في اعتبارك العلاقات التالية كما نتابع:

  1. الأشخاص = البطاقات
  2. الحماية = المطار
  3. بلد #1 = شبكة #1
  4. بلد #2 = شبكة #2
  5. لوائح المطار التي تفرضها الضباط = قواعد الحماية

Iptables – الأساسيات

على المستوى المنخفض، هو النواة نفسها التي “تقرر” ماذا يجب القيام به مع البطاقات بناءً على القواعد المجمعة في السلاسل، أو الجمل. تحدد هذه السلاسل الإجراءات التي يجب اتخاذها عندما يطابق الباقة المعايير المحددة من قبلهم.

الإجراء الأول الذي سيتخذه iptables سيتضمن تحديد ما يجب القيام به مع الباقة:

  1. قبولها (السماح لها بالمرور إلى شبكتنا؟)
  2. رفضها (منعها من الوصول إلى شبكتنا؟)
  3. توجيهها (إلى سلسلة أخرى؟)

فقط في حالة أنك كنت تتساءل لماذا يطلق على هذه الأداة اسم iptables، فإن ذلك لأن هذه السلاسل منظمة في جداول، مع جدول التصفية يكون الأكثر شهرة والمستخدم لتنفيذ تصفية البطاقات مع السلاسل الافتراضية الثلاثة:

1. سلسلة INPUT تتعامل مع البطاقات الواردة إلى الشبكة، التي تهدف إلى البرامج المحلية.

2. يتم استخدام سلسلة OUTPUT لتحليل الحزم التي تنشأ في الشبكة المحلية والتي يجب إرسالها إلى الخارج.

3. تقوم سلسلة FORWARD بمعالجة الحزم التي يجب إعادتها إلى وجهة أخرى (كما هو الحال في حالة جهاز التوجيه).

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

# iptables -L

السياسات المتاحة هي كما يلي:

  1. ACCEPT → يسمح بمرور الحزمة. يُسمح بدخول أي حزمة لا تتطابق مع أي قواعد في السلسلة إلى الشبكة.
  2. DROP → يسقط الحزمة بصمت. يتم منع دخول أي حزمة لا تتطابق مع أي قواعد في السلسلة إلى الشبكة.
  3. REJECT → يرفض الحزمة ويعيد رسالة إعلامية. هذه السياسة بشكل خاص لا تعمل كسياسة افتراضية. بدلاً من ذلك، يتم استخدامها لتكملة قواعد تصفية الحزم.
Linux Iptables Policies

عندما يتعلق الأمر باتخاذ القرار بشأن السياسة التي ستنفذها، يجب عليك مراعاة المزايا و العيوب لكل نهج كما هو موضح أعلاه – لاحظ أنه لا يوجد حلاً يناسب الجميع.

إضافة القواعد

لإضافة قاعدة إلى جدار الحماية، قم بتنفيذ أمر iptables على النحو التالي:

# iptables -A chain_name criteria -j target

حيث،

  1. -A يعني إلحاق (إلحاق القاعدة الحالية في نهاية السلسلة).
  2. chain_name هو إما INPUT، OUTPUT، أو FORWARD.
  3. الهدف هو الإجراء أو السياسة المراد تطبيقها في هذه الحالة (قبول، رفض، أو إسقاط).
  4. المعايير هي مجموعة الشروط التي يتم فحص الحزم وفقاً لها. وتتألف على الأقل من واحدة (ولعل أكثر) من العلامات التالية. الخيارات داخل القوسين، مفصولة بخط رأسي، مكافئة لبعضها البعض. بقية العناصر تمثل مفاتيح اختيارية:
[--protocol | -p] protocol: specifies the protocol involved in a rule.
[--source-port | -sport] port:[port]: defines the port (or range of ports) where the packet originated.
[--destination-port | -dport] port:[port]: defines the port (or range of ports) to which the packet is destined.
[--source | -s] address[/mask]: represents the source address or network/mask.
[--destination | -d] address[/mask]: represents the destination address or network/mask.
[--state] state (preceded by -m state): manage packets depending on whether they are part of a state connection, where state can be NEW, ESTABLISHED, RELATED, or INVALID.
[--in-interface | -i] interface: specifies the input interface of the packet.
[--out-interface | -o] interface: the output interface.
[--jump | -j] target: what to do when the packet matches the rule.

بيئة الاختبار الخاصة بنا

دعونا نجمع كل ذلك في 3 أمثلة كلاسيكية باستخدام بيئة الاختبار التالية للأمثلتين الأوليين:

Firewall: Debian Wheezy 7.5 
Hostname: dev2.gabrielcanepa.com
IP Address: 192.168.0.15
Source: CentOS 7 
Hostname: dev1.gabrielcanepa.com
IP Address: 192.168.0.17

وهذا للمثال الأخير

NFSv4 server and firewall: Debian Wheezy 7.5 
Hostname: debian
IP Address: 192.168.0.10
Source: Debian Wheezy 7.5 
Hostname: dev2.gabrielcanepa.com
IP Address: 192.168.0.15
المثال 1: تحليل الفرق بين سياسات الإسقاط والرفض

سنقوم أولاً بتعريف سياسة الإسقاط أولاً للعبور الـ pings إلى جدار حمايتنا. وبمعنى آخر، سيتم إسقاط حزم icmp بصمت.

# ping -c 3 192.168.0.15
# iptables -A INPUT --protocol icmp --in-interface eth0 -j DROP
Drop ICMP Ping Request

قبل المتابعة مع جزء الـ الرفض، سنقوم بتفريغ جميع القواعد من سلسلة الـ INPUT للتأكد من أن حزمنا ستتم اختبارها بواسطة هذه القاعدة الجديدة:

# iptables -F INPUT
# iptables -A INPUT --protocol icmp --in-interface eth0 -j REJECT
# ping -c 3 192.168.0.15
Reject ICMP Ping Request in Firewall
المثال 2: تعطيل / إعادة تمكين تسجيل الدخول عن طريق ssh من dev2 إلى dev1

سنتعامل مع سلسلة الـ OUTPUT حيث نتعامل مع حركة المرور الصادرة:

# iptables -A OUTPUT --protocol tcp --destination-port 22 --out-interface eth0 --jump REJECT
Block SSH Login in Firewall
المثال 3: السماح / منع عملاء NFS (من 192.168.0.0/24) من ربط حصص NFS4

قم بتشغيل الأوامر التالية في خادم NFSv4 / جدار الحماية لإغلاق منافذ 2049 و 111 لجميع أنواع حركة المرور:

# iptables -F
# iptables -A INPUT -i eth0 -s 0/0 -p tcp --dport 2049 -j REJECT
# iptables -A INPUT -i eth0 -s 0/0 -p tcp --dport 111 -j REJECT
Block NFS Ports in Firewall

الآن دعونا نفتح تلك الأبواب ونرى ما يحدث.

# iptables -A INPUT -i eth0 -s 0/0 -p tcp --dport 111 -j ACCEPT
# iptables -A INPUT -i eth0 -s 0/0 -p tcp --dport 2049 -j ACCEPT
Open NFS Ports in Firewall

كما ترون، تمكنا من ربط حصة NFSv4 بعد فتح حركة المرور.

إدخال، إلحاق وحذف القواعد

في الأمثلة السابقة، أظهرنا كيفية إلحاق القواعد بسلاسل INPUT و OUTPUT. إذا أردنا إدراجها بدلاً من ذلك في موضع محدد مسبقًا، يجب علينا استخدام البدال -I (الأحرف الكبيرة) بدلاً من ذلك.

يجب أن تتذكر أن القواعد سيتم تقييمها واحدة تلو الأخرى، وأن التقييم يتوقف (أو يقفز) عندما يتم مطابقة سياسة DROP أو ACCEPT. لهذا السبب، قد تجد نفسك بحاجة إلى نقل القواعد لأعلى أو لأسفل في قائمة السلاسل حسب الحاجة.

سنستخدم مثالًا تافهًا لتوضيح ذلك:

Check Rules of Iptables Firewall

لنضع القاعدة التالية،

# iptables -I INPUT 2 -p tcp --dport 80 -j ACCEPT

في الموضع 2) في سلسلة INPUT (مما ينقل الرقم السابق #2 إلى #3)

Iptables Accept Rule

باستخدام الإعداد أعلاه، سيتم فحص حركة المرور للتحقق مما إذا كانت موجهة إلى المنفذ 80 قبل التحقق من المنفذ 2049.

بالإضافة إلى ذلك، يمكنك حذف قاعدة وتغيير هدف القواعد المتبقية إلى REJECT (باستخدام البدال -R):

# iptables -D INPUT 1
# iptables -nL -v --line-numbers
# iptables -R INPUT 2 -i eth0 -s 0/0 -p tcp --dport 2049 -j REJECT
# iptables -R INPUT 1 -p tcp --dport 80 -j REJECT
Iptables Drop Rule

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

حفظ قواعد جدار الحماية:

# iptables-save > /etc/iptables/rules.v4		[On Ubuntu]
# iptables-save > /etc/sysconfig/iptables		[On CentOS / OpenSUSE]

استعادة القواعد:

# iptables-restore < /etc/iptables/rules.v4		[On Ubuntu]
# iptables-restore < /etc/sysconfig/iptables		[On CentOS / OpenSUSE]

هنا يمكننا رؤية إجراء مماثل (حفظ واستعادة قواعد جدار الحماية يدويًا) باستخدام ملف وهمي يسمى iptables.dump بدلاً من الافتراضي كما هو موضح أعلاه.

# iptables-save > iptables.dump
Dump Linux Iptables

لجعل هذه التغييرات ثابتة عبر عمليات التمهيد:

أوبونتو: قم بتثبيت حزمة iptables-persistent، التي ستقوم بتحميل القواعد المحفوظة في ملف /etc/iptables/rules.v4.

# apt-get install iptables-persistent

سنت أو إس: أضف السطرين التاليين إلى ملف /etc/sysconfig/iptables-config.

IPTABLES_SAVE_ON_STOP="yes"
IPTABLES_SAVE_ON_RESTART="yes"

أوبن سوزي: قم بإدراج قائمة بالمنافذ المسموح بها والبروتوكولات والعناوين، وما إلى ذلك (مفصولة بفواصل) في /etc/sysconfig/SuSEfirewall2.

لمزيد من المعلومات، راجع الملف نفسه الذي يحتوي على تعليقات كثيرة.

الاستنتاج

الأمثلة المقدمة في هذا المقال، على الرغم من عدم تغطيتها لجميع ميزات iptables، تخدم الغرض من توضيح كيفية تمكين وتعطيل حركة المرور الواردة أو الصادرة.

بالنسبة لمحبي جدران الحماية، تذكروا أننا سنعود إلى هذا الموضوع مع تطبيقات أكثر تحديدًا في الجزء 10 من هذه السلسلة LFCE.

لا تتردد في إعلامي إذا كان لديك أي أسئلة أو تعليقات.

Source:
https://www.tecmint.com/configure-iptables-firewall/