مستوى المقال: مبتدئ — مناسب لأي حد بيدير سيرفر لينكس لأول مرة وعايز يأمّن الدخول عليه. مش مطلوب منك أي خبرة سابقة في الأمان، بس تعرف تفتح Terminal وتكتب أمر.
بعد ما تفعّل fail2ban على سيرفرك، أي عنوان IP بيحاول يخمّن كلمة مرور الـ SSH بيتحظر تلقائيًا بعد 5 محاولات فاشلة، وانت مش قاعد قدام الشاشة أصلاً. النتيجة العملية: محاولات الاختراق على سيرفرك بتقل بنسبة تتعدى 99% في أول يوم.
fail2ban: خلّي سيرفرك يحظر مهاجمي SSH وهو شغّال لوحده
لو عندك سيرفر على الإنترنت — VPS رخيص أو سيرفر إنتاج — فهو دلوقتي بيتضرب بمحاولات دخول مش انت اللي عاملها. الحل مش إنك تقعد تراقب، الحل إنك تحط حارس أوتوماتيكي. المقال ده بيوريك الحارس ده وبيركّبه معاك خطوة بخطوة.
المشكلة باختصار
أول ما سيرفرك ياخد IP عام، بوتات آلية بتبدأ تفحص المنفذ 22 (منفذ الـ SSH) وتجرّب أسماء مستخدمين وكلمات مرور شائعة. ده مش استهداف شخصي ليك، ده مسح تلقائي بيمشي على الإنترنت كله. سيرفر جديد على السحابة ممكن يشوف من 5,000 لـ 20,000 محاولة دخول فاشلة في اليوم الواحد من غير ما تعمل حاجة.
طول ما بتعتمد على كلمة مرور، كل محاولة دي هي فرصة. المهاجم مش محتاج يعرف كلمة مرورك، هو محتاج بس يجرّب لحد ما يصيب. وهنا بييجي دور fail2ban: يقطع الفرص دي قبل ما تكفي للإصابة.
الافتراض هنا: انك بتستخدم OpenSSH على نظام Debian أو Ubuntu مع systemd. لو عندك توزيعة تانية الخطوات قريبة جدًا بس أسماء الحزم بتختلف.
يعني إيه هجوم تخمين كلمة المرور؟ (مثال بسيط الأول)
تخيّل إن عندك باب بقفل، وواقف قدامه شخص معاه شنطة فيها 10 آلاف مفتاح. هو مش عارف المفتاح الصح، فبيجرّب واحد واحد بسرعة. لو سيبته يجرّب على راحته، هيوصل للمفتاح الصح في وقت ما. الحل الذكي مش إنك تقف تتفرّج، الحل إنك تحط قاعدة: أي حد يجرّب 5 مفاتيح غلط، يتقفل بره العمارة ساعة كاملة. كده حتى لو معاه مليون مفتاح، مش هيعرف يجرّب منهم غير كام واحد في الساعة، والتخمين بيبقى مستحيل عمليًا.
علميًا، ده بالظبط اللي بيحصل: المهاجم بيشغّل سكربت بيعمل ما يسمّى هجوم قاموسي (dictionary attack) — بيجرّب قائمة جاهزة من كلمات المرور المسرّبة والشائعة. fail2ban بيحوّل عدد المحاولات من "لا نهائي وبسرعة" إلى "عدد صغير جدًا كل فترة"، وده لوحده بيكسر جدوى الهجوم.
إزاي fail2ban بيشتغل بالظبط
fail2ban مش جدار ناري ومش برنامج تشفير. هو ببساطة برنامج بيقرأ ملفات السجل (logs) ويتصرّف بناءً على اللي بيلاقيه. آلية عمله أربع خطوات:
- يراقب السجل: بيتابع ملف زي
/var/log/auth.logلحظة بلحظة. - يطابق النمط: عنده "فلتر" (filter) وهو تعبير نمطي بيمسك السطور اللي معناها فشل دخول، ويستخرج منها الـ IP.
- يعُدّ داخل نافذة زمنية: لو نفس الـ IP فشل أكتر من عدد معيّن (
maxretry) خلال فترة معيّنة (findtime)، يعتبره هجوم. - يحظر الـ IP: بيضيف قاعدة في الجدار الناري (
iptablesأوnftables) تمنع الـ IP ده مؤقتًا لمدةbantime.
المجموعة اللي بتحدد كل ده لخدمة معيّنة اسمها jail (سجن). أشهر jail هو sshd، وهو اللي هنفعّله دلوقتي.
التركيب والإعداد خطوة بخطوة
1) ثبّت fail2ban:
sudo apt update
sudo apt install -y fail2ban2) اعمل ملف إعداد خاص بيك. متعدّلش ملف jail.conf الأصلي، لأنه بيتكتب فوقه مع كل تحديث. بدل كده اعمل ملف jail.local اللي بيغلب عليه:
sudo nano /etc/fail2ban/jail.local3) حط الإعداد ده جواه:
[DEFAULT]
# مدة الحظر: ساعة
bantime = 1h
# النافذة الزمنية اللي بيتعدّ فيها الفشل: 10 دقايق
findtime = 10m
# أقصى عدد محاولات فاشلة قبل الحظر
maxretry = 5
# مهم جدًا: استثنِ الـ IP بتاعك علشان متحظرش نفسك
ignoreip = 127.0.0.1/8 ::1 203.0.113.25
[sshd]
enabled = true
port = ssh
backend = systemdغيّر 203.0.113.25 للـ IP الحقيقي بتاعك (اعرفه بأمر curl ifconfig.me من جهازك). ده أهم سطر في الملف، لأنه اللي بيضمن إنك متقفلش على نفسك.
4) شغّل الخدمة وخلّيها تبدأ مع الإقلاع:
sudo systemctl enable --now fail2ban
sudo systemctl restart fail2banالتحقق إنه شغّال فعلاً
اكتب الأمر ده بعد شوية:
sudo fail2ban-client status sshdهيطلعلك حاجة زي كده:
Status for the jail: sshd
|- Filter
| |- Currently failed: 3
| |- Total failed: 428
| `- File list: /var/log/auth.log
`- Actions
|- Currently banned: 6
|- Total banned: 47
`- Banned IP list: 45.13.x.x 61.177.x.x ...الرقم Total banned أكبر من صفر معناه إن الحارس اصطاد فعلاً. على سيرفر إنتاج حقيقي، الأرقام دي بتوصل لعشرات ومئات المحاولات المحظورة في أول 24 ساعة، وده بيترجم لانخفاض محاولات الدخول الفاشلة بأكتر من 99% مقارنة بسيرفر من غير حماية.
ولو حظرت نفسك بالغلط، مفيش مشكلة، فكّ الحظر بأمر واحد:
sudo fail2ban-client set sshd unbanip 203.0.113.25الـ trade-offs (بتكسب إيه وبتخسر إيه)
بتكسب: حماية تلقائية 24/7 بدون أي تدخل يدوي، وتقليل ضخم في ضجيج ملفات السجل، وحمل أقل على الـ SSH daemon لأن المحاولات بتتقطع من الجدار الناري قبل ما توصله.
بتخسر: استهلاك بسيط للذاكرة والمعالج (عادة أقل من 30 ميجابايت رام). والأهم: خطر إنك تحظر نفسك لو نسيت ignoreip وغلطت في كلمة المرور كذا مرة. وفي فخ تاني: لو ناس شرعيين بيدخلوا من نفس شبكة (زي مكتب ورا NAT واحد)، حظر IP واحد ممكن يقفل عليهم كلهم.
متى لا تستخدم هذه الطريقة
fail2ban على الـ SSH فايدته بتقل في حالات:
- لو انت أصلاً قافل الدخول بكلمة مرور ومستخدم مفاتيح SSH فقط (
PasswordAuthentication no). ساعتها الهجمات القاموسية بتفشل من الأساس، و fail2ban بيبقى دوره تقليل ضجيج السجل بس. - لو عندك أسطول كبير من مئات السيرفرات. هنا حل زي CrowdSec بيبقى أنسب لأنه بيشارك قوائم الحظر بين السيرفرات.
- لو الـ SSH مش مكشوف على الإنترنت أصلاً (ورا VPN أو Cloudflare Tunnel أو bastion host). ساعتها مفيش سطح هجوم يستاهل.
الخطوة التالية
افتح سيرفرك دلوقتي، نفّذ أمر التثبيت وحط ملف jail.local باللي فوق (ومتنساش تحط الـ IP بتاعك في ignoreip). بعد 10 دقايق شغّل sudo fail2ban-client status sshd؛ لو لقيت رقم Total banned أكبر من صفر، يبقى الحارس شغّال وبيصطاد فعلاً وانت مش عامل حاجة.
المصادر
- التوثيق الرسمي لـ fail2ban (ويكي المشروع على GitHub): github.com/fail2ban/fail2ban/wiki
- شرح خيارات jail.local (man page): manpages.debian.org — jail.conf(5)
- DigitalOcean: How To Protect SSH with Fail2Ban on Ubuntu: digitalocean.com — Protect SSH with Fail2Ban
- توثيق OpenSSH الرسمي: openssh.com/manual.html