كيفية إعداد جدار حماية Iptables لحماية حركة المرور بين خوادمك

المقدمة

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

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

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

للتوضيح في هذا الدليل، سنستخدم خادمين Ubuntu 22.04. سيكون أحدهما يحتوي على تطبيق ويب يتم تقديمه بواسطة Nginx والآخر سيستضيف قاعدة بيانات MySQL للتطبيق. على الرغم من أننا سنستخدم هذا الإعداد كمثال، يجب أن تكون قادرًا على استخلاص التقنيات المعنية لتلائم متطلبات الخادم الخاصة بك.

المتطلبات المسبقة

للبدء، ستحتاج إلى وجود خادمين Ubuntu 22.04 جديدين. أضف حساب مستخدم عادي بامتيازات sudo على كلٍ منهما. للقيام بذلك، اتبع دليل إعداد الخادم الأولي لـ Ubuntu 22.04.

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

الخطوة 1 — إعداد جدار الحماية

ستبدأ بتنفيذ تكوين جدار حماية أساسي لكلٍ من خوادمك. السياسة التي سنقوم بتنفيذها تتبع نهج الأمان أولاً. سنقوم بتأمين كل شيء تقريبًا بخلاف حركة مرور SSH، ثم نقوم بفتح ثغرات في جدار الحماية لتطبيقنا المحدد.

يتبع هذا الدليل بنية جدول الحماية. يتم تثبيت جدول الحماية تلقائيًا على Ubuntu 22.04 باستخدام backend nftables، لذا يجب أن لا تحتاج إلى تثبيت أي حزم إضافية.

باستخدام nano أو محرر النصوص المفضل لديك، افتح ملف /etc/iptables/rules.v4:

  1. sudo nano /etc/iptables/rules.v4

الصق التكوين من دليل قالب جدار الحماية:

/etc/iptables/rules.v4
*filter
# السماح بجميع الحزم الصادرة، ولكن إسقاط الحزم الواردة والتوجيهية بشكل افتراضي
:INPUT DROP [0:0]
:FORWARD DROP [0:0]
:OUTPUT ACCEPT [0:0]

# سلاسل مخصصة حسب البروتوكول
:UDP - [0:0]
:TCP - [0:0]
:ICMP - [0:0]

# حركة مرور UDP المقبولة

# حركة مرور TCP المقبولة
-A TCP -p tcp --dport 22 -j ACCEPT

# حركة مرور ICMP المقبولة

# سياسة قبول نموذجية
-A INPUT -m conntrack --ctstate ESTABLISHED,RELATED -j ACCEPT
-A INPUT -i lo -j ACCEPT

# إسقاط الحزم غير الصحيحة
-A INPUT -m conntrack --ctstate INVALID -j DROP

# تمرير حركة المرور إلى سلاسل متخصصة في البروتوكول
## السماح فقط بالاتصالات الجديدة (المؤسسة والمتعلقة يجب أن تكون معالجة بالفعل)
## بالنسبة ل TCP، السماح فقط بحزم SYN الجديدة بما أنها الطريقة الوحيدة الصالحة
## لإنشاء اتصال TCP جديد
-A INPUT -p udp -m conntrack --ctstate NEW -j UDP
-A INPUT -p tcp --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

# تأكيد التغييرات
COMMIT

*raw
:PREROUTING ACCEPT [0:0]
:OUTPUT ACCEPT [0:0]
COMMIT

*nat
:PREROUTING ACCEPT [0:0]
:INPUT ACCEPT [0:0]
:OUTPUT ACCEPT [0:0]
:POSTROUTING ACCEPT [0:0]
COMMIT

*security
:INPUT ACCEPT [0:0]
:FORWARD ACCEPT [0:0]
:OUTPUT ACCEPT [0:0]
COMMIT

*mangle
:PREROUTING ACCEPT [0:0]
:INPUT ACCEPT [0:0]
:FORWARD ACCEPT [0:0]
:OUTPUT ACCEPT [0:0]
:POSTROUTING ACCEPT [0:0]
COMMIT

حفظ وإغلاق الملف. إذا كنت تستخدم nano، اضغط Ctrl+X للخروج، ثم عندما يطلب منك ذلك، اضغط Y ثم اضغط Enter.

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

الخطوة ٢ — اكتشاف المنافذ المستخدمة من قبل خدماتك

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

يمكنك استخدام أداة netstat لمعرفة ذلك. نظرًا لأن تطبيقك يتواصل فقط عبر IPv4 ، سنضيف الوسم -4 ولكن يمكنك إزالته إذا كنت تستخدم IPv6 أيضًا. الوسوم الأخرى التي تحتاج إليها للعثور على خدماتك الجارية هي -p ، -l ، -u ، -n ، و -t ، يمكنك توفيرها ك -plunt.

يمكن تفكيك هذه الوسوم على النحو التالي:

  • p: Show the PID and name of the program to which each socket belongs.
  • l: Show only listening sockets.
  • u: Show UDP traffic.
  • n: Show numeric output instead of service names.
  • t: Show TCP traffic.
  1. sudo netstat -4plunt

على خادم الويب الخاص بك ، قد يبدو إخراجك مثل هذا:

Output
Active Internet connections (only servers) Proto Recv-Q Send-Q Local Address Foreign Address State PID/Program name tcp 0 0 0.0.0.0:22 0.0.0.0:* LISTEN 1058/sshd tcp 0 0 0.0.0.0:80 0.0.0.0:* LISTEN 4187/nginx

تظهر العمود المميز الأول عنوان IP والمنفذ الذي تستمع إليه الخدمة المميزة نحو نهاية السطر. يعني عنوان 0.0.0.0 الخاصية أن الخدمة في المسألة تستمع على جميع العناوين المتاحة.

على خادم قاعدة البيانات الخاص بك ، قد يبدو إخراجك مثل هذا:

  1. sudo netstat -4plunt
Output
Active Internet connections (only servers) Proto Recv-Q Send-Q Local Address Foreign Address State PID/Program name tcp 0 0 0.0.0.0:22 0.0.0.0:* LISTEN 1097/sshd tcp 0 0 192.0.2.30:3306 0.0.0.0:* LISTEN 3112/mysqld

يمكنك قراءة هذه الأعمدة بالضبط بنفس الطريقة. في هذا المثال ، يمثل العنوان 192.0.2.30 عنوان IP الخاص بخادم قاعدة البيانات. في البرنامج التعليمي السابق ، قمت بتقييد MySQL لواجهة الشبكة الخاصة لأسباب أمان.

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

على خادم الويب الخاص بك ، تحتاج إلى التأكد من إمكانية الوصول إلى المنافذ التالية:

  • المنفذ 80 على جميع العناوين
  • المنفذ 22 على جميع العناوين (تم احتسابه بالفعل في قواعد جدار الحماية)

يجب أن يضمن خادم قاعدة البيانات الخاص بك إمكانية الوصول إلى المنافذ التالية:

  • المنفذ 3306 على العنوان 192.0.2.30 (أو الواجهة المرتبطة به)
  • المنفذ 22 على جميع العناوين (تم احتسابه بالفعل في قواعد جدار الحماية)

الخطوة 3 — ضبط قواعد جدار الحماية لخادم الويب

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

  1. sudo nano /etc/iptables/rules.v4

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

سيقوم زوار موقع الويب الخاص بك باستخدام بروتوكول TCP للاتصال. إطار العمل لديك بالفعل سلسلة مخصصة تسمى TCP لاستثناءات تطبيق TCP. يمكنك إضافة المنفذ 80 إلى تلك السلسلة، مباشرة تحت الاستثناء لمنفذ SSH الخاص بك:

/etc/iptables/rules.v4
*filter
. . .

# حركة المرور TCP المقبولة
-A TCP -p tcp --dport 22 -j ACCEPT
-A TCP -p tcp --dport 80 -j ACCEPT

. . .

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

احفظ وأغلق الملف عند الانتهاء. الآن لدى خادم الويب لديك سياسة جدار حماية ستسمح بكل حركة مرور شرعية بينما تمنع كل شيء آخر.

قم بفحص ملف القواعد الخاص بك للعثور على أخطاء الصياغة:

  1. sudo iptables-restore -t < /etc/iptables/rules.v4

إذا لم يتم عرض أخطاء الصياغة، أعد تحميل جدار الحماية لتنفيذ مجموعة القواعد الجديدة:

  1. sudo service iptables-persistent reload

الخطوة 4 — ضبط قواعد جدار حماية خادم قاعدة البيانات

على خادم قاعدة البيانات الخاص بك، ستحتاج إلى السماح بالوصول إلى المنفذ 3306 على عنوان IP الخاص بخادمك. في هذه الحالة، كان هذا العنوان هو 192.0.2.30. يمكنك تقييد الوصول المُوجَّه إلى هذا العنوان بشكل خاص، أو يمكنك تقييد الوصول عن طريق المطابقة مع الواجهة التي يتم تعيين هذا العنوان لها.

للعثور على واجهة الشبكة المرتبطة بهذا العنوان، قم بتشغيل ip -4 addr show scope global:

  1. ip -4 addr show scope global
Output
2: eth0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP group default qlen 1000 inet 203.0.113.5/24 brd 104.236.113.255 scope global eth0 valid_lft forever preferred_lft forever 3: eth1: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP group default qlen 1000 inet 192.0.2.30/24 brd 192.0.2.255 scope global eth1 valid_lft forever preferred_lft forever

تظهر المناطق المظللة أن واجهة eth1 مرتبطة بهذا العنوان.

بعد ذلك، ستقوم بضبط قواعد جدار الحماية على خادم قاعدة البيانات. افتح ملف القواعد بامتيازات sudo على خادم قاعدة البيانات الخاص بك:

  1. sudo nano /etc/iptables/rules.v4

مرة أخرى، ستقوم بإضافة قاعدة إلى سلسلة \code{TCP} الخاصة بك لتشكيل استثناء للاتصال بين خوادم الويب وقواعد البيانات الخاصة بك.

لتقييد الوصول بناءً على العنوان الفعلي المطلوب، يمكنك إضافة القاعدة بهذا الشكل:

/etc/iptables/rules.v4
*filter
. . .

# حركة مرور TCP المقبولة
-A TCP -p tcp --dport 22 -j ACCEPT
-A TCP -p tcp --dport 3306 -d 192.0.2.30 -j ACCEPT

. . .

إذا كنت تفضل السماح بالاستثناء بناءً على الواجهة التي تستضيف هذا العنوان، يمكنك إضافة قاعدة مماثلة لهذه بدلاً من ذلك:

/etc/iptables/rules.v4
*filter
. . .

# حركة مرور TCP المقبولة
-A TCP -p tcp --dport 22 -j ACCEPT
-A TCP -p tcp --dport 3306 -i eth1 -j ACCEPT

. . .

احفظ وأغلق الملف عند الانتهاء.

تحقق من أخطاء الصيغة باستخدام هذا الأمر:

  1. sudo iptables-restore -t < /etc/iptables/rules.v4

عندما تكون جاهزًا، أعد تحميل قواعد جدار الحماية:

  1. sudo service iptables-persistent reload

يجب الآن أن تكون كلتا الخوادم محمية دون تقييد تدفق البيانات اللازم بينهما.

الختام

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

لمعرفة المزيد حول جدران الحماية و \code{iptables} على وجه الخصوص، تحقق من الدلائل التالية:

Source:
https://www.digitalocean.com/community/tutorials/how-to-set-up-an-iptables-firewall-to-protect-traffic-between-your-servers