Product SiteDocumentation Site

14.2. الجدار الناري أو ترشيح الرزم

الجدار الناري هو بوابة ترشيح شبكية وهو فعال فقط مع الرزم التي تضطر للمرور عبره. بالتالي، لا يمكن أن يفيد الجدار الناري إلا إذا كان المرور عبره هو الطريق الوحيد المتاح أمام هذه الرزم.
لا يوجد حل جاهز بسبب عدم وجود إعداد قياسي (وبسبب شعار ”عملية، وليست منتج“). لكن هناك، على أي حال، أدوات تبسط إعداد الجدار الناري netfilter، مع تمثيل رسومي لقواعد الترشيح. fwbuilder هي إحدى أفضل هذه الأدوات بلا شك.
تتضمن النواة لينكس الجدار الناري netfilter. يمكن التحكم به من ساحة المستخدم عبر الأمرين iptables و ip6tables. الفرق بين هذين الأمرين هو أن الأول يعمل مع شبكات IPv4، بينما يعمل الثاني مع شبكات IPv6. بما أن كلاً من هذين البروتوكولين سيبقى لعديد من السنوات القادمة على الأغلب، فيجب استخدام الأداتين على التوازي.

14.2.1. عمل Netfilter

يستخدم netfilter أربعة جداول مختلفة تُخزِّن قواعداً تنظم ثلاثة أنواع من العمليات على الرزم:
  • يختص filter بقواعد الترشيح (قبول أو رفض أو تجاهل رزمة)؛
  • يختص nat بترجمة عنوان المصدر أو الوجهة وأرقام المنافذ الخاصة بالرزمة؛
  • يختص mangle بالتعديلات الأخرى التي تجرى على رزم IP (بما فيها حقل ToS — نوع الخدمة Type of Service — وخياراته)؛
  • يسمح raw بإجراء تعديلات يدوية أخرى على الرزم قبل وصولها لنظام تتبع الاتصال.
يحوي كل جدول قوائم من القواعد تدعى السلاسل chains. يستخدم الجدار الناري السلاسل القياسية لمعالجة الرزم بناء على حالات معرّفة مسبقاً. يستطيع مدير النظام إنشاء سلاسل أخرى، تُستَخدم فقط إذا أشارت لها إحدى السلاسل القياسية (إما بشكل مباشر أو غير مباشر).
يحوي الجدول filter ثلاث سلاسل قياسية:
  • INPUT: تختص بالرزم التي وجهتها هي الجدار الناري نفسه؛
  • OUTPUT: تختص بالرزم التي يَبثُّها الجداري الناري؛
  • FORWARD: تختص بالرزم التي تنتقل عبر الجدار الناري (حيث لا يكون الجدار الناري مصدرها ولا وجهتها).
كما يحوي الجدول nat أيضاً ثلاث سلاسل قياسية:
  • PREROUTING: لتعديل الرزم فور وصولها؛
  • POSTROUTING: لتعديل الرزم عندما تجهز للانطلاق في طريقها؛
  • OUTPUT: لتعديل الرزم التي يولدها الجدار الناري نفسه.
طريقة استدعاء سلاسل netfilter

شكل 14.1. طريقة استدعاء سلاسل netfilter

كل سلسلة عبارة عن لائحة من القواعد؛ وكل قاعدة عبارة عن مجموعة من الشروط، وإجراءٌ يجب تنفيذه عند تحقق هذه الشروط. عند معالجة رزمة، يفحص الجدار الناري السلسلة المناسبة، قاعدة تلو أخرى؛ وعند تحقق شروط إحدى القواعد، ”يقفز“ (jump، ومن هنا جاء -j في الأوامر) إلى الإجراء المحدد لمتابعة المعالجة. أكثر التصرفات شيوعاً مُقيَّسَة، وهناك إجراءات خاصة لها. يقاطع تنفيذ إحدى هذه الإجراءات معالجة السلسلة، لأن مصير الرزمة قد حسم أصلاً (إلا في حالة استثنائية مذكورة أدناه):
  • ACCEPT: يسمح للرزمة بالذهاب في سبيلها؛
  • REJECT: يرفض الرزمة مع الرد برزمة ICMP تبيّن الخطأ (يمكن تحديد نوع الخطأ باستخدام الخيار --reject-with type التابع للأمر iptables
  • DROP: حذف (تجاهل) الرزمة؛
  • LOG: تسجيل رسالة (عبر syslogd) فيها وصف الرزمة، لاحظ أن هذا الإجراء لا يقاطع المعالجة، ويستمر تنفيذ السلسلة عند القاعدة التالية، لذلك تحتاج عملية تسجيل الرزم المرفوضة قاعدة LOG وقاعدة REJECT/DROP؛
  • ULOG: تسجيل رسالة عبر ulogd، الذي قد يكون أكثر تكيفاً وفعالية من syslogd عند معالجة أعداد كبيرة من الرسائل؛ لاحظ أن هذا الإجراء، مثله مثل LOG، يعيد المعالجة للمتابعة عند القاعدة التالية من السلسلة؛
  • chain_name: يقفز إلى سلسلة معينة ويقيّم قواعدها؛
  • RETURN: يقاطع معالجة السلسلة الحالية، ويعود إلى السلسلة التي استدعتها؛ وفي حال كانت السلسلة الحالية قياسية، فلا توجد سلسلة مستدعية، وبالتالي يتم اتخاذ الإجراء الافتراضي (المعرّف بالخيار -P الخاص بالأمر iptables) بدلاً من ذلك؛
  • SNAT (في جدول nat): تطبيق Source NAT (تحدد الخيارات الأخرى التعديلات الفعلية التي ستُطبَّق)؛
  • DNAT (في جدول nat): تطبيق Destination NAT (تحدد الخيارات الأخرى التعديلات الفعلية التي ستُطبَّق)؛
  • MASQUERADE (في جدول nat): تطبيق التنكر (حالة خاصة من Source NAT
  • REDIRECT (في جدول nat): إعادة توجيه رزمة إلى منفذ معين من الجدار الناري نفسه؛ يمكن استخدام هذا لإعداد بروكسي وب شفاف يعمل دون إعداد عند العميل، بما أن العميل يظن أنه يتصل مع المتلقي بينما تمر الاتصالات في الحقيقة عبر البروكسي.
الإجراءات الأخرى، وخصوصاً تلك التي تخص الجدول mangle، تقع خارج مدى هذا النص. هناك قائمة شاملة فيiptables(8)‎ و ip6tables(8)‎.

14.2.2. صيغة iptables و ip6tables

يسمح الأمران iptables و ip6tables بتعديل الجداول والسلاسل والقواعد. يشير الخيار -t table التابع لهما إلى الجدول الذي ستجرى التعديلات عليه (filter افتراضياً).

14.2.2.1. الأوامر

ينشئ الخيار -N chain سلسلة جديدة. ويحذف -X chain سلسلة فارغة وغير مستخدمة. يضيف الخيار -A chainrule قاعدة إلى نهاية السلسلة المحددة. يُدخِل الخيار -I chain rule_num rule قاعدة قبل القاعدة ذات الرقم rule_num. يحذف الخيار -D chainrule_num أو (-D chain rule) قاعدة من السلسلة؛ تحدد الصيغة الأولى القاعدة المحذوفة برقمها، أما الصيغة الثانية فتحددها بمحتوياتها. الخيار -F chain يُفرّغ السلسلة (يحذف جميع قواعدها)؛ وإذا لم تذكر له أي سلسلة، سيحذف جميع القواعد في الجدول. يسرد الخيار -L chain القواعد في السلسلة. وأخيراً، يعرّف الخيار -P chain action الإجراء الافتراضي، أو ”السياسة“، للسلسلة المعطاة؛ لاحظ أن السلاسل القياسية فقط هي التي تملك سياسات كهذه.

14.2.2.2. القواعد

تُمثَّل كل قاعدة بالشكل: conditions -j action action_options. إذا كان هناك شروط في القاعدة نفسها، فالمعيار عندئذ هو جمع (and منطقية) هذه الشروط، وسيكون تقييد الناتج الشرط الناتج بنفس تقييد كل واحد من الشروط المستقلة على الأقل.
يطابق الشرط -p protocol حقل البروتوكول لرزمة IP. أكثر القيم شيوعاً هي tcp، وudp، وicmp، وicmp6. يمكن نفي الشرط إذا سبق بعلامة التعجب (وعندها سيطابق أي رزمة يختلف بروتوكولها عن البروتوكول المحدد). لا ينحصر استخدام آلية النفي هذه مع الخيار -p فقط، بل يمكن تطبيقه على جميع الشروط الأخرى أيضاً.
يطابق الشرط -s address أو -s network/mask عنوان مصدر الرزمة. في المقابل، يطابق -d address أو -d network/mask عنوان الوجهة.
ينتخب الشرط -i interface الرزم الواردة من الواجهة الشبكية المحددة. أما -o interface فينتخب الرزم التي ستخرج على واجهة معينة.
هناك شروط أخرى أكثر تحديداً مقارنة بالشروط العامة المذكورة أعلاه. مثلاً، يمكن إكمال الخيار -p tcp بشروط عن منافذ TCP، باستخدام تعبير مثل --source-port port و --destination-port port.
يطابق الشرط --state state حالة الرزمة في الاتصال (هذا يحتاج وحدة النواة ipt_conntrack، لتتبع الاتصال). تُبيّن الحالة NEW أن الرزمة تبدأ اتصالاً جديداً؛ وتدل ESTABLISHED على الرزم التي تنتمي لاتصال منشئ مسبقاً، وتطابق الحالة RELATED الرزم التي تبدأ اتصالاً جديداً متعلقٌ باتصال موجود من قبل (يفيد هذا في اتصالات ftp-data في الوضع ”النشط active“ لبروتوكول FTP).
يذكر القسم السابق الإجراءات المتاحة، لكنه لا يذكر خياراتها. فإجراء LOG، على سبيل المثال، له الخيارات التالية:
  • يدل --log-level على درجة خطورة رسائل syslog، وقيمته الافتراضية warning.
  • يسمح --log-prefix بتحديد سابقة نصية للتمييز بين رسائل السجل؛
  • تدل الخيارات --log-tcp-sequence و --log-tcp-options و --log-ip-options على بيانات إضافية لتضمينها في الرسالة: وهي، على التوالي، رقم تسلسل TCP، خيارات TCP، وخيارات IP.
يوفر الإجراء DNAT الخيار --to-destination address:port للدلالة على عنوان IP الجديد للوجهة و (أو) رقم المنفذ. كما يوفر SNAT خيار --to-source address:port للدلالة على عنوان IP الجديد للمصدر والمنفذ.
يوفر الإجراء REDIRECT (المتاح فقط إذا كان NAT متوفراً) الخيار --to-ports port(s) للدلالة على المنفذ، أو مجال المنافذ، الذي يجب إعادة توجيه الرزم إليه.

14.2.3.  إنشاء قواعد

يحتاج إنشاء كل قاعدة إلى استدعاء واحد للأمر iptables/ip6tables. طباعة هذه الأوامر يدوياً قد تكون مملة، لذلك تُخزَّن الاستدعاءات عادة في سكربت بحيث تُضبَط نفس الإعدادات تلقائياً في كل مرة يقلع فيها الجهاز. يمكن كتابة هذا السكربت يدوياً، لكن قد ترغب باستخدام أداة عالية المستوى لتجهيزه مثل fwbuilder.
# apt install fwbuilder
المبدأ بسيط. في الخطوة الأولى، عليك تحديد جميع العناصر التي ستدخل في القواعد ذاتها:
  • الجدار الناري نفسه، مع واجهاته الشبكية؛
  • الشبكات، مع مجالات عناوين IP الخاصة بها؛
  • المخدمات؛
  • المنافذ التي تنتمي للخدمات المستضافة على المخدمات.
بعدها تُنشَأ القواعد بإجراء عمليات سحب وإفلات بسيطة على الكائنات. هناك بضعة قوائم سياق يمكنها تغيير الشروط (نفيها مثلاً). بعدها يجب تحديد الإجراء وضبطه.
فيما يتعلق ببروتوكول IPv6، فيمكن إنشاء مجموعتين منفصلتين من القواعد واحدة لبروتوكول IPv4 والأخرى لبروتوكول IPv6، أو إنشاء مجموعة واحدة فقط وترك fwbuilder يتولى ترجمة القواعد حسب العناوين المسندة للكائنات.
نافذة fwbuilder الرئيسية

شكل 14.2. نافذة fwbuilder الرئيسية

يمكن بعدها أن يولّد fwbuilder سكربتاً يضبط الجدار الناري وفق القواعد المُعرّفة. تسمح بنية هذا البرنامج التجزيئية بتوليد سكربتات تستهدف نظماً مختلفة (iptables على لينكس، ipf على FreeBSD، و pf على OpenBSD).

14.2.4. تثبيت القواعد عند كل إقلاع

في الحالات الأخرى، الطريقة المفضلة هي تسجيل سكربت الإعداد في تعليمة up توجيهية في الملف /etc/network/interfaces. لقد حفظنا السكربت في المثال التالي في ملف اسمه /usr/local/etc/arrakis.fw.

مثال 14.1. ملف interfaces يستدعي سكربت إعداد الجدار الناري

auto eth0
iface eth0 inet static
    address 192.168.0.1
    network 192.168.0.0
    netmask 255.255.255.0
    broadcast 192.168.0.255
    up /usr/local/etc/arrakis.fw
هذا يفترض طبعاً أنك تستخدم ifupdown لضبط الواجهات الشبكية. أما إذا كنت تستخدم أداة أخرى (مثل NetworkManager أو systemd-networkd)، فعليك مراجعة وثائقها الخاصة لمعرفة طريقة تنفيذ السكربتات بعد إقلاع الواجهة الشبكية.