دليل

Fail2ban: إعداد حماية SSH من تخمين كلمات المرور

آخر تحديث: · Skillaria.Top

يقرأ fail2ban سجلات الخدمات، ويلاحظ محاولات الدخول الفاشلة المتكررة، ثم يحظر مؤقتاً عنوان IP المهاجم عبر الجدار الناري. ولحماية SSH يكفي تثبيت الحزمة، وإنشاء الملف /etc/fail2ban/jail.local مع قسم [sshd] (enabled = true وmaxretry وfindtime وbantime)، ثم إعادة تشغيل الخدمة. ويُتحقق من الحالة بالأمر fail2ban-client status sshd.

Fail2ban برنامج خلفي يراقب سجلات الخدمات، ويلاحظ محاولات الدخول الفاشلة المتكررة، ويحظر مؤقتاً عنوان IP الذي صدرت منه تلك المحاولات. وبالنسبة لـ SSH فهذه أبسط حماية من تخمين كلمات المرور: تتوقف الروبوتات عن الطرق على الخادم بعد عدد قليل من الأخطاء. فيما يلي إعداد fail2ban خطوة بخطوة، من التثبيت حتى التحقق من الحظر والأخطاء الشائعة.

لماذا يلزم fail2ban إذا كانت لديك مفاتيح SSH

أي خادم يفتح المنفذ 22 يبدأ بتلقي محاولات دخول من الروبوتات بعد دقائق قليلة من تشغيله. انظر بنفسك:

$ sudo journalctl -u ssh --since "1 hour ago" | grep -c "Failed password"
412

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

كيف يعمل fail2ban

يتكون المنطق من ثلاثة أجزاء:

  • المرشِّح (filter) — مجموعة تعبيرات نمطية تجد في السجل أسطر المحاولات الفاشلة وتستخرج منها عنوان IP. تُخزَّن المرشحات في /etc/fail2ban/filter.d/.
  • الإجراء (action) — ما الذي يُفعل بالمخالف: إضافة قاعدة إلى iptables أو nftables أو ufw أو firewalld. وتُخزَّن الإجراءات في /etc/fail2ban/action.d/.
  • السجن (jail) — ربط بين المرشّح والإجراء ومصدر السجلات والحدود. فمثلاً يراقب السجن sshd سجل SSH.

إذا تجمعت من عنوان IP واحد maxretry مطابقات خلال مدة findtime، يُحظر العنوان لمدة bantime. وينتهي الحظر تلقائياً بعد المدة.

تثبيت fail2ban

على Debian وUbuntu:

sudo apt update
sudo apt install fail2ban

على RHEL وRocky وAlmaLinux توجد الحزمة في مستودع EPEL:

sudo dnf install epel-release
sudo dnf install fail2ban

فعّل التشغيل التلقائي وتحقق من حالة الخدمة:

sudo systemctl enable --now fail2ban
sudo systemctl status fail2ban

في Debian وUbuntu يكون سجن SSH مفعلاً افتراضياً عبر /etc/fail2ban/jail.d/defaults-debian.conf. أما في عائلة RHEL فلا يُفعَّل شيء بعد التثبيت، ويجب تفعيل السجون يدوياً.

مكان الإعدادات: jail.conf وjail.local

الملف الرئيسي هو /etc/fail2ban/jail.conf، لكن لا يجوز تعديله: إذ سيُستبدل عند تحديث الحزمة. تُكتب الإعدادات الخاصة بك في /etc/fail2ban/jail.local أو في ملفات منفصلة /etc/fail2ban/jail.d/*.local. يقرأ fail2ban الملفات بهذا الترتيب، وكل ملف لاحق يتجاوز ما قبله:

  1. jail.conf
  2. jail.d/*.conf
  3. jail.local
  4. jail.d/*.local

لا تنسخ jail.conf كاملاً إلى jail.local، فستجمّد القيم الافتراضية القديمة. اكتب في jail.local ما تغيّره فقط.

إعداد fail2ban لـ SSH: ملف jail.local بسيط

أنشئ الملف:

sudo nano /etc/fail2ban/jail.local

وأضف إليه:

[DEFAULT]
# عناوين خاصة بك لا تُحظر أبداً
ignoreip = 127.0.0.1/8 ::1 203.0.113.10
bantime  = 1h
findtime = 10m
maxretry = 5
# مصدر السجلات: سجل systemd أو الملفات
backend  = systemd

[sshd]
enabled  = true
port     = ssh
maxretry = 3

أعد تشغيل الخدمة وتأكد من أن السجن قد عمل:

$ sudo systemctl restart fail2ban
$ sudo fail2ban-client status
Status
|- Number of jail:      1
`- Jail list:   sshd

معنى المعاملات

المعاملالمعنىمثال
enabledهل السجن مفعّلtrue
portالمنفذ (أو المنافذ) التي تُحظر على المخالفssh، 2222، ssh,2222
maxretryعدد الأخطاء المسموح به قبل الحظر3
findtimeالنافذة الزمنية التي تُحسب فيها الأخطاء10m
bantimeمدة الحظر؛ -1 تعني دائماً1h، 1d
ignoreipعناوين وشبكات فرعية بلا حظر10.0.0.0/8
backendمصدر السجلاتsystemd، auto
logpathمسار ملف السجل عند استخدام backend الملفات/var/log/auth.log
banactionأي جدار ناري يُستخدم للحظرnftables-multiport، ufw

يمكن كتابة الزمن مع اللواحق: s ثوانٍ، وm دقائق، وh ساعات، وd أيام، وw أسابيع. والأرقام بلا لاحقة تُعد ثوانٍ.

backend: سجل systemd أم ملف

في Debian 12 وUbuntu 24.04 الحديثين قد لا يوجد الملف /var/log/auth.log إذا لم يكن rsyslog مثبتاً، إذ تعيش سجلات SSH في سجل systemd فقط. عندها تحتاج إلى backend = systemd، وإلا فلن يبدأ fail2ban ويعطي خطأ بأن ملف السجل غير موجود. أما إذا كان rsyslog مثبتاً فيمكن إبقاء الإعداد القائم على الملفات:

[sshd]
enabled  = true
backend  = auto
logpath  = /var/log/auth.log

في أنظمة RHEL يكون الملف المقابل هو /var/log/secure.

SSH على منفذ غير قياسي

إذا كان sshd يستمع على المنفذ 2222 مثلاً، فحدده في السجن، وإلا فسيحظر fail2ban المنفذ 22 بينما يستمر الهجوم على 2222:

[sshd]
enabled = true
port    = 2222

ولحظر كل المنافذ للمخالف دفعة واحدة يمكن استخدام الإجراء iptables-allports أو nftables-allports عبر المعامل banaction.

اختيار الجدار الناري: iptables وnftables وufw وfirewalld

الافتراضي في Debian هو banaction = nftables (في الإصدارات القديمة iptables)، وفي RHEL يكون firewalld. وإذا كان ufw مُعداً على الخادم، فمن الأفضل أن تظهر عمليات الحظر فيه:

[DEFAULT]
banaction = ufw

وبالنسبة لـ firewalld:

[DEFAULT]
banaction = firewallcmd-rich-rules

للتأكد من أن القواعد أُضيفت فعلاً استخدم sudo nft list ruleset | grep f2b أو sudo iptables -L -n | grep f2b، فيُنشئ fail2ban سلاسل تبدأ بالبادئة f2b-.

التحقق من العمل: fail2ban-client status

الأداة الرئيسية للإدارة هي fail2ban-client. حالة سجن محدد:

$ sudo fail2ban-client status sshd
Status for the jail: sshd
|- Filter
|  |- Currently failed: 2
|  |- Total failed:     147
|  `- Journal matches:  _SYSTEMD_UNIT=sshd.service + _COMM=sshd
`- Actions
   |- Currently banned: 4
   |- Total banned:     38
   `- Banned IP list:   45.148.10.12 92.118.39.7 185.224.128.40 218.92.0.112

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

سجل fail2ban نفسه موجود في /var/log/fail2ban.log:

$ sudo tail -n 3 /var/log/fail2ban.log
2026-10-14 09:12:41,118 fail2ban.filter  [812]: INFO    [sshd] Found 218.92.0.112
2026-10-14 09:12:44,302 fail2ban.filter  [812]: INFO    [sshd] Found 218.92.0.112
2026-10-14 09:12:47,551 fail2ban.actions [812]: NOTICE  [sshd] Ban 218.92.0.112

كيف تفك حظر IP في fail2ban

إذا حظرت نفسك أو زميلاً بالخطأ، فارفع الحظر من وحدة التحكم في الخادم (عبر لوحة الاستضافة أو من عنوان IP آخر):

sudo fail2ban-client set sshd unbanip 203.0.113.25

لرفع كل عمليات الحظر في كل السجون:

sudo fail2ban-client unban --all

لحظر عنوان يدوياً دون انتظار المرشّح:

sudo fail2ban-client set sshd banip 198.51.100.7

حتى لا يتكرر الأمر، أضف عناوينك الثابتة أو شبكة مكتبك إلى ignoreip.

حظر متزايد للمخالفين المتكررين

كثير من الروبوتات تعود فور رفع الحظر. ومنذ الإصدار 0.11 يدعم fail2ban زيادة مدة الحظر للمخالفين المتكررين:

[DEFAULT]
bantime = 1h
bantime.increment = true
bantime.factor = 2
bantime.maxtime = 4w

كل حظر لاحق للعنوان نفسه سيكون أطول من السابق، لكن بحد أقصى أربعة أسابيع. والبديل للإصدارات القديمة هو السجن recidive، الذي يقرأ سجل fail2ban نفسه ويحظر لفترة طويلة العناوين التي تكررت في الحظر:

[recidive]
enabled  = true
logpath  = /var/log/fail2ban.log
bantime  = 1w
findtime = 1d
maxretry = 5

اختبار المرشّح: fail2ban-regex

إذا كان السجن يعمل لكنه لا يحظر أحداً، فتحقق من أن المرشّح يجد أسطراً في السجل. للسجل النصي:

sudo fail2ban-regex /var/log/auth.log /etc/fail2ban/filter.d/sshd.conf

لسجل systemd:

sudo fail2ban-regex systemd-journal sshd

في المخرجات انظر إلى السطر Lines: ... matched. صفر مطابقات يعني أن المرشّح لا يناسب صيغة السجلات أو أن المصدر خاطئ. وقبل إعادة التشغيل يُفيد فحص صياغة الإعداد كله:

sudo fail2ban-client -t

الأخطاء الشائعة

  • الخدمة لا تبدأ: «Have not found any log file for sshd jail». الملف /var/log/auth.log غير موجود. ضع backend = systemd أو ثبّت rsyslog.
  • توجد عناوين محظورة في الحالة لكن الهجوم مستمر. المنفذ المحدد خاطئ (نُقل SSH)، أو قاعدة سماح أسبق في الجدار الناري تتغلب على الحظر. تحقق من port ومن مخرجات nft list ruleset.
  • التغييرات لم تُطبَّق. عدّلت jail.conf، بينما jail.local أو jail.d/*.local فيه قيمة أخرى. اعرف القيمة النهائية: sudo fail2ban-client get sshd maxretry.
  • حظرت نفسك. ارفع الحظر من وحدة التحكم وأضف عنوانك إلى ignoreip.
  • fail2ban في Docker لا يرى الهجمات. منافذ الحاويات تُنشر عبر سلسلة DOCKER التي تتجاوز INPUT. لهذه الخدمات استخدم chain = DOCKER-USER في الإجراء.

ما الذي تفعله أيضاً لحماية SSH

يعمل fail2ban بشكل أفضل مع الإجراءات الأساسية في /etc/ssh/sshd_config:

PasswordAuthentication no
PermitRootLogin no
MaxAuthTries 3

بعد التعديل تحقق من الإعداد بالأمر sudo sshd -t ثم أعد تشغيل الخدمة. ولا تغلق جلستك الحالية قبل أن تتأكد في جلسة جديدة أن الدخول بالمفتاح يعمل. ويمكنك كذلك تقييد الوصول إلى SSH على مستوى الجدار الناري بعناوين محددة فقط.

الخلاصة

يتلخص إعداد fail2ban في عدة خطوات: تثبيت الحزمة، وإنشاء ملف jail.local فيه قسم [sshd]، واختيار المصدر والمنفذ الصحيحين، وضبط maxretry وfindtime وbantime، وإضافة عناوينك إلى ignoreip، ثم التحقق بالأمر fail2ban-client status sshd. ومع الدخول بالمفاتيح فقط يغلق هذا الإعداد SSH بإحكام أمام تخمين كلمات المرور. وتُشرح حماية الخادم وfail2ban عملياً في دورة Linux.

الأسئلة الشائعة

هل يلزم fail2ban إذا كان الدخول بكلمة المرور معطلاً؟

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

كيف أرى كل العناوين المحظورة في كل السجون؟

نفّذ sudo fail2ban-client banned، فيعرض الأمر قوائم العناوين المحظورة لكل سجن. ولسجن واحد استخدم fail2ban-client status sshd.

هل يبقى الحظر بعد إعادة تشغيل الخادم؟

نعم، يحفظ fail2ban عمليات الحظر في قاعدة SQLite الخاصة به (/var/lib/fail2ban/fail2ban.sqlite3) ويستعيد الحظر الفعّال عند التشغيل، ما لم يكن معامل dbpurgeage قد حذف السجلات القديمة قبل ذلك.

هل يمكن حماية خدمات أخرى غير SSH بـ fail2ban؟

نعم، تأتي الحزمة بمرشحات لـ nginx وApache وPostfix وDovecot وغيرها. يكفي تفعيل السجن المطلوب في jail.local، مثلاً [nginx-http-auth] مع enabled = true.

ما الفرق بين fail2ban والتقييد في الجدار الناري؟

يسمح الجدار الناري أو يمنع عناوين بشكل ثابت، أما fail2ban فيحظر ديناميكياً من أظهر سلوكاً مشبوهاً في السجلات. وغالباً يُجمعان: قائمة بيضاء في الجدار الناري وfail2ban لكل ما عداها.

تعلّم هذا الموضوع بالفيديو

يُشرح هذا الموضوع بالتفصيل مع التطبيق العملي في دورة «Linux: с нуля до уверенного администрирования».

الانتقال إلى الدورة