كيفية إعداد جدار ناري (UFW) وFail2Ban على Ubuntu
لتأمين سيرفر Ubuntu، فعّل UFW وFail2Ban معًا. اضبط UFW على رفض كل الاتصالات الواردة افتراضيًا، واسمح فقط بـ SSH وHTTP وHTTPS. بعد ذلك ثبّت Fail2Ban مع jail باسم sshd ليحظر تلقائيًا عناوين IP التي تتكرر منها محاولات تسجيل الدخول الفاشلة. يشرح هذا الدليل الأداتين على VPS سحابي أو سيرفر مخصص يعمل بنظام Ubuntu 24.04 أو 22.04، مع صلاحيات root أو sudo. إذا كنت تستخدم cPanel/WHM، فراجع القسم الخاص بـ CSF/LFD بدلًا من ذلك.
المتطلبات المسبقة
- سيرفر يعمل بنظام Ubuntu 24.04 أو 22.04، مثل VPS سحابي من Cloudesta.
- وصول عبر SSH بحساب root أو بمستخدم لديه صلاحية
sudo. - منفذ SSH الذي يستخدمه السيرفر فعليًا (22 ما لم تكن قد غيّرته).
- عنوان IP العام الخاص بك، لتضيفه إلى القائمة البيضاء في Fail2Ban.
لماذا تحتاج إلى جدار ناري على VPS جديد تمامًا؟
يحصل أي VPS جديد على عنوان IPv4 عام. وعادةً ما تكتشفه أدوات الفحص الآلية خلال دقائق وتبدأ في تخمين كلمات مرور SSH. كما أن أي خدمة تثبّتها لاحقًا قد تستمع على الشبكة أيضًا، بما في ذلك قواعد البيانات وRedis ولوحات الإدارة. الجدار الناري الذي يرفض كل شيء افتراضيًا يحجب أي منفذ لم تفتحه عن قصد، ثم يتولى Fail2Ban إيقاف محاولات التخمين (brute-force) على المنافذ التي فتحتها.
1. كيف أثبّت UFW وأضبط السياسات الافتراضية؟
يأتي UFW مثبّتًا مسبقًا على Ubuntu لكنه يكون غير مفعّل. تأكد من وجوده، ثم اضبط السياسات الافتراضية:
sudo apt update
sudo apt install -y ufw
sudo ufw default deny incoming
sudo ufw default allow outgoing
لا تسري هذه السياسات إلا عند تفعيل UFW في الخطوة 4. ويشمل ذلك IPv6 تلقائيًا، لأن IPV6=yes هو الإعداد الافتراضي في /etc/default/ufw.
2. كيف أسمح بـ SSH دون أن أغلق الباب على نفسي؟
اسمح دائمًا بـ SSH قبل تفعيل الجدار الناري. أولًا، تحقق من المنفذ الذي يستخدمه SSH:
sudo sshd -T | grep -i '^port'
ثم اسمح بهذا المنفذ. استخدم الأمر الأول للمنفذ الافتراضي 22. وإذا كنت تستخدم منفذًا مخصصًا، مثل 2222، فاستخدم الأمر الثاني بدلًا منه:
sudo ufw allow 22/tcp
# or, for a custom port:
sudo ufw allow 2222/tcp
OpenSSH (ufw allow OpenSSH) يفتح المنفذ 22 فقط. إذا نقلت SSH إلى منفذ آخر، فاسمح برقم هذا المنفذ صراحةً. وأبقِ جلسة SSH الحالية مفتوحة إلى أن تتأكد من أن جلسة جديدة تستطيع الاتصال.3. كيف أفتح المنفذين 80 و443 لموقع ويب؟
sudo ufw allow 80/tcp
sudo ufw allow 443/tcp
إذا كان سيرفر الويب لديك يدعم HTTP/3، فنفّذ أيضًا sudo ufw allow 443/udp. ويمكنك قصر الوصول إلى خدمة ما على عنوان واحد فقط، مثل السماح بـ MySQL من سيرفر تطبيقات واحد:
sudo ufw allow from 203.0.113.10 to any port 3306 proto tcp
4. كيف أفعّل UFW وأتحقق من حالته؟
sudo ufw enable
sudo ufw status verbose
سيحذّرك UFW من أن التفعيل قد يقطع اتصالات SSH الحالية. لا تُجب بـ y إلا بعد إضافة قاعدة SSH. يجب أن تُظهر نتيجة الحالة Status: active وdeny (incoming), allow (outgoing) والمنافذ التي سمحت بها.
5. كيف أحذف قاعدة من UFW؟
اعرض القواعد مرقّمة، ثم احذف القاعدة برقمها أو بصيغتها الدقيقة:
sudo ufw status numbered
sudo ufw delete 3
# or
sudo ufw delete allow 80/tcp
تتغير أرقام القواعد بعد كل عملية حذف، لذا نفّذ status numbered مرة أخرى قبل حذف قاعدة أخرى.
6. كيف أحدّ من معدل اتصالات SSH باستخدام UFW؟
يرفض الإجراء limit أي عنوان IP يفتح 6 اتصالات أو أكثر خلال 30 ثانية. وعند تطبيقه على منفذ لديه بالفعل قاعدة allow، فإنه يحدّث هذه القاعدة:
sudo ufw limit 22/tcp
sudo ufw status
يجب أن يظهر سطر SSH الآن بالقيمة LIMIT. الأدوات التي تفتح اتصالات كثيرة متتالية بسرعة، مثل Ansible أو أوامر scp المؤتمتة بالسكربتات، قد تتجاوز هذا الحد. في هذه الحالة، أبقِ على قاعدة allow عادية واعتمد على Fail2Ban.
7. كيف أثبّت Fail2Ban وأضبط إعداداته؟
sudo apt install -y fail2ban python3-systemd
لا تعدّل الملف jail.conf، لأن تحديثات الحزمة تستبدله. ضع إعداداتك الخاصة في /etc/fail2ban/jail.local بدلًا منه:
sudo nano /etc/fail2ban/jail.local
[DEFAULT]
bantime = 1h
findtime = 10m
maxretry = 5
ignoreip = 127.0.0.1/8 ::1 198.51.100.25
[sshd]
enabled = true
port = 22
backend = systemd
تعمل هذه الإعدادات كالتالي:
maxretryيحدد عدد المحاولات الفاشلة المسموح بها خلال المدة المحددة فيfindtimeقبل حظر عنوان IP.bantimeيحدد مدة الحظر.ignoreipيضم العناوين التي لا تُحظر أبدًا. استبدل198.51.100.25بعنوان IP الخاص بك.portيجب أن يطابق منفذ SSH لديك، مثلport = 2222إذا كنت قد غيّرته.backend = systemdيقرأ سجلات SSH من الـ journal، وهذا يجنّبك مشكلات مسارات ملفات السجل.
اختبر الإعدادات، ثم فعّل الخدمة وأعد تشغيلها:
sudo fail2ban-client -t
sudo systemctl enable fail2ban
sudo systemctl restart fail2ban
8. كيف أتحقق من حالة Fail2Ban وأرفع الحظر عن عنوان IP؟
sudo fail2ban-client status
sudo fail2ban-client status sshd
sudo fail2ban-client set sshd unbanip 198.51.100.25
تعرض نتيجة الأمر status sshd عدد المحاولات الفاشلة وقائمة عناوين IP المحظورة حاليًا.
ماذا لو كان السيرفر يعمل بـ cPanel/WHM؟
لا تثبّت UFW أو Fail2Ban على سيرفر cPanel. تستخدم سيرفرات cPanel عادةً CSF (ConfigServer Security & Firewall) مع خدمة رصد محاولات الدخول الفاشلة التابعة له LFD، وغالبًا إلى جانب cPHulk أو Imunify360. تشغيل جدارين ناريين في الوقت نفسه يسبب تعارضات.
إذا حظر LFD عنوان IP الخاص بك وكان لديك وصول root إلى WHM من اتصال آخر، فارفع الحظر بإحدى الطريقتين التاليتين:
- في WHM، انتقل إلى Plugins → ConfigServer Security & Firewall، ثم أدخل عنوان IP في خانة Search for IP أو Quick Unblock.
- من خلال SSH، نفّذ
csf -g 198.51.100.25للعثور على الحظر، ثمcsf -dr 198.51.100.25لإزالته.
تحقق أيضًا من Security Center → cPHulk Brute Force Protection، لأن cPHulk يحتفظ بقائمة حظر خاصة به. أما على الاستضافة المشتركة من Cloudesta، فنحن من ندير الجدار الناري. افتح تذكرة دعم واذكر فيها عنوان IP العام الخاص بك لنرفع عنه الحظر.
التحقق من أن كل شيء يعمل
افتح جلسة SSH جديدة لتتأكد من أنك لا تزال قادرًا على تسجيل الدخول. ثم افحص المنافذ من جهازك المحلي:
nc -zv 203.0.113.10 22
nc -zv 203.0.113.10 443
nc -zv -w 3 203.0.113.10 3306
يجب أن ينجح الاتصال بالمنفذين 22 و443، وأن تنتهي مهلة الاتصال بالمنفذ 3306. وعلى السيرفر، تأكد من أن Fail2Ban يقرأ الـ journal ويسجّل المحاولات الفاشلة:
sudo fail2ban-client status sshd
sudo tail -n 20 /var/log/fail2ban.log
على السيرفرات العامة، تبدأ قيمة Total failed في الارتفاع عادةً خلال ساعة. وإذا أردت تجربة الحظر بنفسك، فاختبر من عنوان IP غير موجود في ignoreip، مثل نقطة اتصال من هاتف محمول.
مشكلات شائعة
فعّلت UFW والآن تنتهي مهلة اتصال SSH
لم يُسمح بمنفذ SSH، أو سمحت بالمنفذ 22 بينما يستمع SSH على منفذ مخصص. ستحتاج إلى الوصول عبر الكونسول لإصلاح ذلك. افتح تذكرة دعم وسنوفّر لك وصولًا عبر الكونسول أو وضع الإنقاذ (rescue). ومن الكونسول، نفّذ sudo ufw allow 2222/tcp (مع استخدام منفذك الفعلي) أو sudo ufw disable.
حظرت عنوان IP الخاص بي باستخدام Fail2Ban
اتصل من شبكة أخرى أو عبر الكونسول، ثم نفّذ sudo fail2ban-client set sshd unbanip YOUR_IP. وأضف عنوان IP الخاص بك إلى ignoreip حتى لا يتكرر ذلك.
Fail2Ban يعمل لكنه لا يحظر أحدًا أبدًا
يرجع هذا عادةً إلى مشكلة في مصدر السجلات. إذا كنت تستخدم file backend، فيجب أن يشير logpath إلى ملف موجود بالفعل، وهو عادةً /var/log/auth.log. الصور المصغّرة (minimal images) التي لا تحتوي على rsyslog لا يوجد فيها هذا الملف. استخدم backend = systemd كما هو موضح أعلاه، وتأكد من تثبيت python3-systemd. وتحقق كذلك من أن قيمة port في الـ jail تطابق منفذ SSH لديك.
يمكن الوصول إلى حاوية Docker رغم أن UFW يحجب المنفذ
يكتب Docker قواعد iptables خاصة به للمنافذ المنشورة، وتُطبَّق هذه القواعد قبل قواعد UFW. لحل المشكلة، اربط منافذ الحاويات بـ localhost، ولا تتِحها إلا من خلال reverse proxy على المنفذين 80/443. على سبيل المثال، استخدم في docker-compose.yml القيمة "127.0.0.1:5678:5678" بدلًا من "5678:5678". وهذا مهم للتطبيقات التي تستضيفها بنفسك، مثل التطبيقات العاملة على استضافة n8n.
الأسئلة الشائعة
هل يتعارض UFW وFail2Ban مع بعضهما؟
لا. يضيف Fail2Ban سلسلة حظر خاصة به إلى الجدار الناري في نواة النظام، وتعمل هذه السلسلة جنبًا إلى جنب مع قواعد UFW. ويمكنك أيضًا ضبط banaction = ufw إذا كنت تفضّل ظهور عمليات الحظر في ufw status.
هل يكفي تغيير منفذ SSH بدلًا من استخدام Fail2Ban؟
المنفذ المخصص يقلل الضوضاء في السجلات، لكنه لا يوقف الهجمات الموجّهة. استخدم مفاتيح SSH والجدار الناري وFail2Ban معًا.
كيف أجعل مدة الحظر أطول للمخالفين المتكررين؟
أضف bantime.increment = true إلى قسم [DEFAULT] في jail.local. بعدها ستكون مدة كل حظر متكرر أطول من سابقتها. أعد تشغيل Fail2Ban بعد إجراء التغيير.
تحتاج إلى مساعدة؟ إذا فقدت الوصول إلى السيرفر أو احتجت إلى وصول عبر الكونسول أو وضع الإنقاذ، فافتح تذكرة من خلال https://cloudesta.com/submitticket.php واذكر فيها عنوان IP الخاص بالسيرفر.