دليل النشر

Fail2Ban Enhanced على خادم VPS: حجب الهجمات المتكرّرة

انشر على VPS Cloud ←

دليل عملي

الأمان والمراقبة

Fail2Ban Enhanced على خادم VPS: حجب الهجمات المتكرّرة

بمجرّد أن يُعرّض خادم VPS خدمة SSH أو تطبيق ويب، تصل المحاولات الآلية بسرعة. يوفّر Fail2Ban Enhanced شبكة أمان بسيطة: قراءة السجلات، واكتشاف حالات الفشل المتكرّرة، وحظر عناوين IP التي تُصرّ. يمضي هذا الدليل من الإعداد الأولي إلى التشغيل اليومي: الـ jails والعتبات، واختيار الـ backend، والتحقّق من أن الـ jail ما زال يراقب، واستكشاف الأعطال بالرسائل الحقيقية للأخطاء، وانسجامه مع جدار الحماية الخاص بالخادم VPS، ونسخ الإعداد احتياطيًا. الخيارات المذكورة مستمدّة من الوثائق الأصلية لـ Fail2Ban.

11 دقيقةً للقراءةعدد الخطوات: 11
المحتويات· لماذا تستضيف Fail2ban ذاتيًا على خادم افتراضي VPS1/14
  1. 01لماذا تستضيف Fail2ban ذاتيًا على خادم افتراضي VPS
  2. 02الفوائد الملموسة لهذا القالب
  3. 03المتطلبات المحدّدة بالأرقام لاستضافته
  4. 04تثبيت Fail2ban وإعداده على خادمك VPS
  5. 05ignoreip ومدة الحظر والمعاودة
  6. 06الحظر التصاعدي: الصيغة والسقف والذاكرة
  7. 07اختيار الـ backend: auto أو pyinotify أو polling أو systemd
  8. 08الـ backends الأربعة في Fail2ban
  9. 09التحقّق من أن الـ jail ما زال يراقب
  10. 10التحقّق في أربع خطوات من أن الـ jail ما زال يقرأ
  11. 11استكشاف الأعطال: رسائل الأخطاء الحقيقية
  12. 12رسائل الأخطاء الشائعة وعلاجها
  13. 13nftables أو iptables وجدار حماية الخادم VPS والنسخ الاحتياطي
  14. 14الوثائق الرسمية

لماذا تستضيف Fail2ban ذاتيًا على خادم افتراضي VPS

Fail2ban من أبسط أدوات الحماية وأوسعها انتشارًا لخادم معرَّض: يقرأ سجلاتك باستمرار، ويطبّق تعبيرات نمطية (المرشّحات) لرصد محاولات الاختراق، ويحظر عنوان IP المخالف بإضافته إلى nftables أو iptables لمدة قابلة للضبط. على خادم VPS، يمثّل خط دفاع أول يجب إعداده قبل بقية الأمور، لأنه لا يعتمد على أي خدمة خارجية، ويستهلك القليل، ويحمي SSH من القوة الغاشمة بمجرّد تفعيل الـ jail. وإلى جانب SSH، يمكنك توسيعه ليشمل Nginx (محاولات المصادقة، مسح عناوين URL) و Postfix و WordPress أو أي خدمة تكتب سجلات. يعمل كل شيء محليًا على جهازك: لا تخرج أي بيانات، ولا تتدخّل أي خدمة طرف ثالث. إنه حل مستقل وسهل التدقيق، شريطة أن تتحقّق منه من حين إلى آخر كما سنرى أدناه.

الفوائد الملموسة لهذا القالب

  • حظر تلقائي — تُحظر عناوين IP التي تهاجم SSH بالقوة الغاشمة بمجرّد بلوغ العتبة maxretry ضمن نافذة findtime.
  • مرشّحات لخدمات عديدة — SSH وNginx وApache وPostfix وWordPress، ومرشّحات مخصّصة تُكتب في filter.d.
  • بصمة ضئيلة — يعمل دون مشاكل على أصغر خوادم VPS.
  • حظر تصاعدي (التكرار) — كلما عاود عنوان IP المخالفة، طالت مدة الحظر.
  • إشعارات بالبريد الإلكتروني — ممكنة عند كل حظر، عبر الإجراءين action_mw أو action_mwl من jail.conf.
  • مستقل ومحلّي — بلا اعتماد على الشبكة في التشغيل اليومي، سهل التدقيق وإدارة الإصدارات.

المتطلبات المحدّدة بالأرقام لاستضافته

Fail2ban اقتصادي: يكفي لتشغيله خادم VPS بمعالج vCPU واحد و512 ميغابايت من الذاكرة، دون أثر ملحوظ (توصية تحريرية، تُقاس على حمل خادمك). من جهة البرمجيات، يطلب ملف README الأصلي للإصدار 1.1.1 لغة Python 3.5 أو أحدث. ويبقى مكوّنان اختياريان: pyinotify 0.8.3 أو أحدث لمراقبة الملفات (نواة Linux 2.6.13 أو أحدث)، و systemd 204 أو أحدث مع حزمة python-systemd لقراءة السجل (journal). يُثبَّت Fail2ban مباشرةً على النظام (دون حاجة إلى Docker) ويتطلّب صلاحية root، وواجهة خلفية لجدار ناري (nftables أو iptables)، والوصول إلى سجلات الخدمات المراد حمايتها: سجل systemd أو /var/log/auth.log لـ SSH بحسب التوزيعة، وسجلات access و error لـ Nginx. يحتفظ بحالته في قاعدة SQLite هي /var/lib/fail2ban/fail2ban.sqlite3 افتراضيًا. لا يلزم أي نطاق أو منفذ إضافي. القاعدة الذهبية: املأ ignoreip بعنوان IP الخاص بك قبل تفعيل الحظر، كي لا تحبس نفسك خارج خادمك.

تثبيت Fail2ban وإعداده على خادمك VPS

  1. تثبيت Fail2ban

    على Debian أو Ubuntu: sudo apt update && sudo apt install fail2ban. تبدأ الخدمة تلقائيًا. تحقّق باستخدام sudo systemctl status fail2ban.

  2. إنشاء ملف jail.local

    لا تعدّل jail.conf مباشرةً أبدًا. اكتب إعداداتك في /etc/fail2ban/jail.local الذي يتقدّم عليه: هناك تحدّد bantime و findtime و maxretry وقبل كل شيء ignoreip = 127.0.0.1/8 ::1 VOTRE_IP لحماية نفسك من الحظر الذاتي. القيم الافتراضية في jail.conf هي bantime = 10m و findtime = 10m و maxretry = 5.

  3. تفعيل حماية SSH

    جميع الـ jails معطّلة افتراضيًا في jail.conf: فعّل [sshd] صراحةً في jail.local مع enabled = true، وعلى سبيل المثال maxretry = 3 و bantime = 1h. بعد 3 حالات فشل ضمن نافذة findtime، يُحظر عنوان IP لمدة ساعة على مستوى الجدار الناري.

  4. إضافة jail لـ Nginx

    فعّل الـ jails المسمّاة [nginx-http-auth] و [nginx-botsearch] التي يوفّرها jail.conf، وتأكّد من أن logpath يشير إلى سجلات Nginx لديك. يحظر ذلك محاولات المصادقة المتكرّرة وعمليات مسح عناوين URL الخبيثة.

  5. اختبار الإعداد ثم إعادة تحميله

    تحقّق من الصياغة أولًا: sudo fail2ban-client -t. ثم طبّقه: sudo fail2ban-client reload (أو sudo systemctl restart fail2ban). يسرد sudo fail2ban-client status الـ jails النشطة، ويُظهر sudo fail2ban-client status sshd عناوين IP المحظورة حاليًا.

  6. اختبار الحظر وإلغاؤه

    تحقّق من المرشّح على سجلك أنت بالأمر sudo fail2ban-regex systemd-journal sshd. ولمحاكاة حظر دون مهاجمة أحد: sudo fail2ban-client set sshd banip 203.0.113.10، ثم اقرأ sudo fail2ban-client status sshd. لتحرير عنوان IP مشروع حُظر بالخطأ: sudo fail2ban-client set sshd unbanip X.X.X.X.

  7. أول تسجيل دخول

    لا توجد واجهة ويب ولا حساب يجب إنشاؤه: fail2ban خدمة نظام تحظر، بإعداد القالب، عناوين IP بعد 4 محاولات SSH فاشلة خلال 10 دقائق. عبر SSH: fail2ban-client status sshd (العناوين المحظورة)، و fail2ban-client set sshd unbanip <IP> (رفع الحظر). اضبط هذه العتبات في jail.local.

ignoreip ومدة الحظر والمعاودة

يقبل ignoreip عناوين IP أو أقنعة CIDR أو أسماء مضيفين عبر DNS، تفصل بينها مسافات أو فواصل. افتراضيًا ignoreself = true: العناوين المحلية للخادم نفسه لا تُحظر أبدًا، لكن عنوان IP في مكتبك أو منزلك غير مشمول بذلك. وإن كان يتغيّر كثيرًا فاعتمد اسم مضيف ديناميكيًا أو استخدم ignorecommand، وهو أمر خارجي يتلقّى عنوان IP ويجيب هل يجب تجاهله. واحتفظ كذلك بمنفذ طوارئ لا يعتمد على SSH، مثل وحدة تحكّم مزوّد الخادم VPS، فيُعالَج الحظر الذاتي حينئذٍ دون مساعدة خارجية. تُضبط المدة بـ bantime، بالثواني أو باللواحق m و h و d و w و mo و y. وتعمل مدةً أولية حين يكون الحظر التصاعدي مفعّلًا. وللمعاودين، يضمّ jail.conf أيضًا jail اسمه recidive يقرأ سجل fail2ban نفسه.

الحظر التصاعدي: الصيغة والسقف والذاكرة

فعّل الحظر التصاعدي في jail.local بالقيمة bantime.increment = true. تضرب الصيغة الافتراضية bantime في 1 ثم 2 ثم 4 ثم 8 ثم 16 وهكذا عند كل معاودة؛ و bantime.factor (القيمة 1 افتراضيًا) معامل ضرب مشترك، و bantime.maxtime يضع سقفًا للمدة بالثواني، مثلًا bantime.maxtime = 604800 لسبعة أيام. وثمة نقطة كثيرًا ما تُغفل: يجد fail2ban عمليات الحظر السابقة في قاعدة بياناته، التي تُنظَّف وفق dbpurgeage (يوم واحد افتراضيًا في fail2ban.conf). ولكي تُرصد المعاودات المتباعدة، ارفعه؛ ويذكر تعليق الـ jail المسمّى recidive في jail.conf القيمة 648000 ثانية. اقرن ذلك كله بتعطيل المصادقة بكلمة المرور (مفاتيح SSH فقط): عندئذٍ يصبح Fail2ban شبكة أمان بدلًا من أن يكون حصنك الوحيد.

اختيار الـ backend: auto أو pyinotify أو polling أو systemd

الـ backend هو الطريقة التي يقرأ بها الـ jail سجلاته. القيمة الافتراضية في jail.conf هي backend = auto، ويمكن لكل jail تجاوزها. على Debian و Ubuntu، يضبط الملف paths-debian.conf في الأرشيف الأصلي 1.1.1 القيمة sshd_backend = systemd: فيُقرأ sshd عندئذٍ من سجل systemd لا من /var/log/auth.log. اقرأ sudo fail2ban-client status sshd لتعرف ما يُراقَب فعلًا: يدلّ السطر File list على ملفات، ويدلّ السطر Journal matches على سجل systemd. وقد تغيّر التوزيعة هذه القيم، فلا تفترض شيئًا: عايِن. يتم تغيير الـ backend لكل jail على حدة في jail.local، ثم sudo fail2ban-client reload.

الـ backends الأربعة في Fail2ban

مرّر الجدول أفقيًا

الـ backendما يراقبهما يجب تذكّره
autoملفات (pyinotify ثم polling)؛ ينتقل إلى systemd إن لم يوجد أي ملف في `logpath` وكان المرشّح يعرّف `journalmatch`القيمة الافتراضية في `jail.conf`
pyinotifyملفات، عبر أحداث inotify في النواةLinux فقط، ويتطلّب وحدة Python المسمّاة pyinotify؛ أنسب للملفات من polling بحسب الوثائق
pollingملفات، بإعادة قراءتها على فترات منتظمةبلا مكتبة خارجية، وهو الحل البديل الأبسط
systemdسجل systemd، عبر python-systemd`logpath` غير صالح؛ يمرّ المرشّح عبر `journalmatch`؛ إعدادات `journalflags` و `rotated`

التحقّق من أن الـ jail ما زال يراقب

الـ jail المُشغَّل ليس بالضرورة jail يقرأ. بلاغ مرفوع لم يؤكّده القائمون على الصيانة: في البلاغ رقم 4250 في fail2ban، المفتوح في أكتوبر 2026، يصف مدير نظام على Debian مع fail2ban 1.1.1 حالة jail من نوع sshd بـ backend من نوع systemd يتوقّف عن الحظر بعد يوم إلى يومين من التشغيل، بينما يواصل jail كل من Nginx و Postfix عمله. ويبلغ مديران آخران، كلاهما على FreeBSD بحسب رسائلهما، عن عرَض مشابه مع الـ backend من نوع pyinotify؛ ويقول أحدهما إن الوضع استقرّ بعد الانتقال إلى polling. ونبّه أحد القائمين على الصيانة إلى أن البلاغ الأصلي كان عن الـ backend من نوع systemd، وأن العرَضين قد لا يكونان مرتبطين. ويصف مشارك أخير، على Arch مع الـ backend من نوع systemd، التوقّف نفسه بعد تدوير السجل ويطرح فرضية تخصّ الإعداد rotated: وتبقى غير مؤكّدة. السبب غير ثابت حتى الآن، ولا شيء يسمح بتعميم الأمر على خادمك. أما التحقّق نفسه فيستغرق دقيقة.

التحقّق في أربع خطوات من أن الـ jail ما زال يقرأ

  1. قراءة حالة الـ jail

    يعرض sudo fail2ban-client status sshd الحقلين Currently failed و Total failed للمرشّح، و File list أو Journal matches للمصدر، ثم Currently banned و Total banned و Banned IP list للإجراء. دوّن قيمة Total failed.

  2. المقارنة مع السجل

    احسب حالات الفشل الفعلية في الفترة نفسها: sudo journalctl _COMM=sshd --since "1 hour ago" | grep -c "Failed password"، أو sudo grep -c "Failed password" /var/log/auth.log إن كان الـ jail يقرأ هذا الملف. ثم أعد قراءة Total failed: يُفترض أنه ازداد. قارن الاتجاه لا التساوي التام، لأن عناوين IP الواردة في ignoreip لا تُحتسب.

  3. قراءة سجل fail2ban نفسه

    sudo tail -n 50 /var/log/fail2ban.log: يكتب الـ jail السليم أسطر Found ثم Ban. وتدلّ عدة أيام من أسطر Unban وحدها، بينما يُظهر سجل المصادقة محاولات، على jail أعمى.

  4. إعادة التشغيل وتغيير الـ backend عند الحاجة

    يعيد sudo systemctl restart fail2ban تشغيل القراءة؛ ويصف البلاغ عملًا طبيعيًا لمدة يوم إلى يومين بعد كل تشغيل. وبالنسبة إلى jail يقرأ ملفات، فإن backend = polling هو الحل البديل الأبسط. جدوِل هذا التحقّق (cron أو أداة مراقبة) بدل الاعتماد على غياب التنبيهات.

استكشاف الأعطال: رسائل الأخطاء الحقيقية

تأتي هذه الرسائل من الشيفرة المصدرية لـ Fail2ban 1.1.1 (العملاء وقارئات الإعداد)؛ ومستوى التسجيل الافتراضي هو INFO. والأمر الذي يُبدأ به واحد في كل حالة: يختبر sudo fail2ban-client -t الإعداد، ويعطي sudo journalctl -u fail2ban بداية القصة.

رسائل الأخطاء الشائعة وعلاجها

  • Have not found any log file for 'sshd' jail. — لا يشير logpath الخاص بالـ jail إلى أي ملف موجود فيفشل التشغيل، إلا مع skip_if_nologs = true. ومع الـ backend من نوع auto، ينتقل الـ jail الذي يعرّف مرشّحه journalmatch إلى systemd بدلًا من ذلك. صحّح المسار أو اضبط backend = systemd.
  • No file(s) found for glob /var/log/nginx/error.log — نمط في logpath لا يطابق شيئًا. تحقّق من الموضع الحقيقي لسجلات Nginx بالأمر ls /var/log/nginx.
  • Unable to read the filter 'nginx-xyz' — الاسم المعطى لـ filter = غير موجود في filter.d. صحّح الخطأ الإملائي أو أضف ملف المرشّح الخاص بك.
  • Failed to access socket path: /var/run/fail2ban/fail2ban.sock. Is fail2ban running? — لا يجد العميل مقبس الخادم. الخدمة متوقّفة أو معطّلة: sudo systemctl status fail2ban ثم سجلّها.
  • Permission denied to socket: ... (you must be root) — شُغّل الأمر fail2ban-client دون الصلاحيات الكافية. أعد تشغيله بـ sudo.
  • Unable to contact server. Is it running? — المقبس موجود لكن الخادم لا يستجيب. أعد تشغيل الخدمة ثم اقرأ سجل إقلاعها.
  • [sshd] Journal reader seems to be offline, reopen journal — رصد fail2ban أن قراءته لسجل systemd قد انقطعت (تدوير) فيعيد فتحه. هذه الرسالة من المستوى MSG أي دون INFO: وغيابها من سجل عادي لا يثبت شيئًا، ومن هنا جاء التحقّق في القسم السابق.
  • Error reading line from systemd journal — خطأ قراءة في سجل systemd، يتبعه سبب النظام. تحقّق من صلاحيات الخدمة ومن حالة السجل بالأمر journalctl --verify.

nftables أو iptables وجدار حماية الخادم VPS والنسخ الاحتياطي

يُختار إجراء الحظر بـ banaction. يقترح jail.conf القيمة iptables-multiport مثالًا معلّقًا؛ ويضبط الملف paths-debian.conf في الأرشيف 1.1.1 القيمتين banaction = nftables و banaction_allports = nftables[type=allports]. وينشئ إجراء nftables افتراضيًا الجدول f2b-table (من عائلة inet) والسلسلة f2b-chain المعلّقة على الدخول بأولوية -1؛ ويعرض sudo nft list table inet f2b-table عناوين IP المحظورة. اختر عائلة واحدة من الإجراءات، هي نفسها المستعملة في بقية جدار الحماية لديك، وإلا بحثت عن قواعدك في الجدول الخطأ. يعمل جدار حماية الخادم VPS في المنبع: يرشّح ما يصل إلى الجهاز، كأن يحصر SSH في عناوينك، بينما يتفاعل Fail2ban مع ما تقوله السجلات. وهما يتكاملان، لكن أبقِ ignoreip متّسقًا مع قواعدك. خلف وكيل (proxy) أو شبكة CDN، تُظهر السجلات عنوان IP الخاص بالوكيل: استعد العنوان الحقيقي قبل الحظر، وإلا حظرت الوكيل. أما النسخ الاحتياطي، فأرشِف الإعداد (sudo tar czf fail2ban-config.tar.gz /etc/fail2ban) ومخرجات sudo fail2ban-client --dp التي توثّق الإعداد الفعلي. وتحتفظ قاعدة /var/lib/fail2ban/fail2ban.sqlite3 بذاكرة عمليات الحظر.

الوثائق الرسمية

للإعداد المتقدّم والخيارات الخاصة بالأداة وتغييرات الإصدارات، ارجع إلى الوثائق الرسمية لـ Fail2Ban. يغطّي هذا الدليل النشر على خادم ServOrbit VPS؛ وتبقى وثائق الناشر المرجع للضبط الدقيق.

حصّن الوصول إلى خادمك VPS

يمنحك خادم ServOrbit Cloud VPS صلاحية الوصول بحساب root وجدارًا ناريًا جاهزًا للاستخدام لإعداد Fail2ban في دقائق قليلة وإيقاف هجمات القوة الغاشمة تمامًا.