Fail2ban چیست؟ آموزش نصب و تنظیم Fail2ban برای محافظت از SSH
مقدمه:
Fail2ban ابزاری امنیتی برای لینوکس است که گزارشهای سرویسهایی مانند SSH را بررسی میکند و در صورت مشاهده چند ورود ناموفق از یک IP، آن نشانی را از طریق فایروال مسدود میسازد. در پاسخ به موضوع «Fail2ban چیست؟ آموزش نصب و تنظیم Fail2ban برای محافظت از SSH» باید گفت این ابزار احتمال موفقیت حملات خودکار و آزمون مکرر رمز عبور را کاهش میدهد، اما جایگزین کلید SSH، رمز قوی، فایروال و بهروزرسانی سرور نیست.
فهرست مطالب
- Fail2ban چیست و چگونه کار میکند؟
- پیشنیازها و هشدارهای ضروری
- نصب Fail2ban در Ubuntu و Debian
- فعالسازی Jail مربوط به SSH
- تنظیم پارامترهای امنیتی
- آزمایش و بررسی وضعیت Fail2ban
- مشاهده و آزادسازی IP مسدودشده
- هماهنگی با پورت سفارشی SSH و فایروال
- خطاهای رایج و روش عیبیابی
- چکلیست امنیت SSH
- جمع بندی
- سؤالات متداول
Fail2ban چیست و چگونه از SSH محافظت میکند؟
Fail2ban یک سرویس مانیتورینگ و واکنش خودکار است. این سرویس گزارشهای احراز هویت را بررسی کرده و الگوهایی مانند تکرار ورود ناموفق به SSH را شناسایی میکند. اگر تعداد خطاها در بازه تعیینشده از حد مجاز عبور کند، Fail2ban با اجرای یک Action، دسترسی IP متخلف را محدود میکند.
پروژه رسمی Fail2ban توضیح میدهد که این ابزار فایلهای گزارش مانند /var/log/auth.log را اسکن کرده و با بهروزرسانی قوانین فایروال، اتصالهای جدید IP متخلف را برای مدت قابل تنظیم رد میکند. بااینحال، خود پروژه تأکید میکند که Fail2ban خطر ناشی از احراز هویت ضعیف را از بین نمیبرد. GitHub
فرایند کلی عملکرد آن شامل چهار مرحله است:
- سرویس SSH یک تلاش ورود ناموفق را ثبت میکند.
- فیلتر
sshdگزارش را با الگوهای تعریفشده تطبیق میدهد. - Jail تعداد خطاهای یک IP را در بازه زمانی مشخص میشمارد.
- در صورت عبور از حد مجاز، Action مربوط به مسدودسازی اجرا میشود.
مفاهیم Filter، Jail و Action
Filter مشخص میکند کدام خطوط گزارش بهعنوان رفتار ناموفق یا مشکوک شناخته شوند. فیلتر آماده SSH معمولاً با نام sshd در بسته Fail2ban وجود دارد.
Jail یک فیلتر را به منبع گزارش و تنظیمات مسدودسازی متصل میکند. برای مثال، Jail مربوط به SSH تعیین میکند چند ورود ناموفق در چه بازهای باعث مسدودشدن IP شود.
Action عملی است که پس از تشخیص تخلف انجام میشود. این عمل معمولاً اضافهکردن قانون مناسب به سیستم فایروال است، اما نوع دقیق آن به توزیع لینوکس و تنظیمات شبکه سرور بستگی دارد.
اگر دسترسی SSH، فایروال یا گزارشهای امنیتی سرور شما ساختار متفاوتی دارد، پیش از اعمال تنظیمات میتوانید شرایط سرور را با کارشناسان شرکت تجارت الکترونیک نوژن بررسی کنید تا خطر قطع دسترسی مدیریتی کاهش یابد.
پیشنیازهای نصب Fail2ban
برای اجرای این آموزش باید دسترسی کاربر دارای مجوز sudo یا دسترسی مدیریتی سرور را داشته باشید. دستورات ارائهشده برای توزیعهای مبتنی بر Ubuntu و Debian نوشته شدهاند و ممکن است در توزیعهای دیگر متفاوت باشند.
پیش از شروع، این موارد را بررسی کنید:
- حداقل یک نشست SSH فعال را باز نگه دارید.
- IP و پورت فعلی SSH را یادداشت کنید.
- مطمئن شوید از طریق کنسول ارائهدهنده VPS به سرور دسترسی اضطراری دارید.
- از فایلهای تنظیمات امنیتی نسخه پشتیبان بگیرید.
- وضعیت فایروال و پورتهای مجاز را بررسی کنید.
- از مسدودکردن دائمی IPهای متغیر خودداری کنید.
اگر IP اینترنت شما ثابت نیست، افزودن آن به ignoreip میتواند در آینده مشکل ایجاد کند؛ زیرا ممکن است آن IP به کاربر دیگری اختصاص داده شود یا شما با IP جدید وارد سرور شوید. استفاده از فهرست استثنا باید محدود و آگاهانه باشد.
مطالعه بیشتر: SSH چیست و چگونه به سرور لینوکس متصل شویم
نصب Fail2ban در Ubuntu و Debian
ابتدا فهرست بستههای سیستم را بهروزرسانی کنید:
sudo apt update
سپس Fail2ban را از مخزن توزیع نصب کنید:
sudo apt install fail2ban
پس از نصب، وضعیت سرویس را مشاهده کنید:
sudo systemctl status fail2ban
اگر سرویس فعال نبود، آن را برای اجرای فعلی و راهاندازیهای بعدی فعال کنید:
sudo systemctl enable --now fail2ban
برای مشاهده نسخه نصبشده نیز میتوانید از دستور زیر استفاده کنید:
sudo fail2ban-client version
بهتر است بسته Fail2ban را از مخزن رسمی همان توزیع نصب کنید تا وابستگیها و فایل سرویس با ساختار سیستم سازگار باشند. نصب مستقیم از کد منبع برای کاربران عادی ضروری نیست و نگهداری آینده را پیچیدهتر میکند.
ساخت فایل تنظیمات محلی Fail2ban
فایل اصلی تنظیمات معمولاً در مسیر زیر قرار دارد:
/etc/fail2ban/jail.conf
این فایل را مستقیماً ویرایش نکنید. تنظیمات سفارشی باید در jail.local یا یک فایل دارای پسوند .local در پوشه jail.d ثبت شوند؛ زیرا فایل اصلی ممکن است هنگام بهروزرسانی بسته تغییر کند. این توصیه در فایل پیکربندی رسمی پروژه نیز صراحتاً بیان شده است. GitHub
پیش از تغییرات، از تنظیمات فعلی نسخه پشتیبان تهیه کنید:
sudo cp -a /etc/fail2ban /etc/fail2ban.backup
سپس یک فایل اختصاصی برای Jail سرویس SSH بسازید:
sudo nano /etc/fail2ban/jail.d/sshd.local
پیکربندی پایه زیر را در آن قرار دهید:
[sshd]
enabled = true
port = ssh
backend = systemd
maxretry = 5
findtime = 10m
bantime = 30m
بعد از ذخیره، قبل از راهاندازی مجدد سرویس، صحت پیکربندی را آزمایش کنید:
sudo fail2ban-client -t
اگر نتیجه آزمایش خطایی نشان نداد، تنظیمات را بارگذاری مجدد کنید:
sudo systemctl restart fail2ban
یا در صورت پشتیبانی نسخه نصبشده، از دستور زیر برای بارگذاری مجدد استفاده کنید:
sudo fail2ban-client reload
ابزار fail2ban-client برای کنترل سرویس، آزمایش پیکربندی، بارگذاری مجدد، مشاهده وضعیت Jailها و مدیریت IPهای مسدودشده طراحی شده است. Debian Manpages
معنی تنظیمات Jail مربوط به SSH
| گزینه | کاربرد | نکته تصمیمگیری |
|---|---|---|
enabled |
فعال یا غیرفعالکردن Jail | برای محافظت از SSH باید true باشد |
port |
پورت تحت محافظت | اگر پورت SSH تغییر کرده، مقدار واقعی را وارد کنید |
backend |
روش خواندن گزارشها | در سرورهای مبتنی بر systemd معمولاً systemd مناسب است |
maxretry |
تعداد خطاهای مجاز | مقدار بسیار پایین میتواند کاربران واقعی را مسدود کند |
findtime |
بازه شمارش خطاها | خطاهای یک IP در این بازه محاسبه میشوند |
bantime |
مدت مسدودی IP | با توجه به نوع سرور و الگوی حملات انتخاب شود |
ignoreip |
IP یا شبکه مستثنا | فقط برای IPهای قابل اعتماد و ترجیحاً ثابت استفاده شود |
maxretry چیست؟
مقدار maxretry مشخص میکند چند رخداد منطبق با فیلتر، در بازه findtime باعث مسدودشدن IP شود. برای نمونه، مقدار 5 یعنی با رسیدن تعداد خطاها به حد تعیینشده، Action مسدودسازی اجرا میشود.
کاهش شدید این عدد همیشه به معنای امنیت بیشتر نیست. ممکن است مدیر سرور هنگام تایپ اشتباه رمز یا استفاده از کلید نامعتبر، IP خود را مسدود کند.
findtime چیست؟
findtime بازهای است که تلاشهای ناموفق در آن شمرده میشوند. اگر خطاهای یک IP از این بازه خارج شوند، در تصمیم فعلی برای مسدودسازی محاسبه نخواهند شد.
Fail2ban از قالبهایی مانند 10m، 1h و 1d برای زمان پشتیبانی میکند. طبق مستندات، مقدار زمان را میتوان بهصورت عدد برحسب ثانیه یا عبارت زماندار وارد کرد. Debian Manpages
bantime چیست؟
bantime مدت مسدودماندن IP را تعیین میکند. انتخاب مقدار مناسب به ماهیت سرور، تعداد مدیران، حساسیت سرویس و الگوی ترافیک بستگی دارد.
مسدودی دائمی برای همه خطاها معمولاً انتخاب مناسبی نیست؛ زیرا یک کاربر واقعی یا IP اشتراکی نیز ممکن است اشتباه کند. مسدودی مرحلهای یا مدتدار در بسیاری از سناریوها انعطاف بیشتری دارد.
امنیت SSH فقط به نصب یک بسته محدود نمیشود. برای مشاهده سرویسهای سرور مجازی و راهکارهای مدیریت و پشتیبانی زیرساخت میتوانید خدمات شرکت تجارت الکترونیک نوژن را بررسی کرده و سرویس متناسب با سطح مدیریت موردنیاز خود را انتخاب کنید.
مطالعه بیشتر: خرید سرور مجازی لینوکس
تنظیم Fail2ban برای پورت سفارشی SSH
اگر پورت SSH را تغییر دادهاید، مقدار port باید با پورت واقعی سرویس هماهنگ باشد. برای مثال، اگر SSH روی پورت فرضی 2255 گوش میدهد، تنظیم Jail به این شکل خواهد بود:
[sshd]
enabled = true
port = 2255
backend = systemd
maxretry = 5
findtime = 10m
bantime = 30m
پس از تغییر فایل، پیکربندی را آزمایش و سرویس را مجدداً بارگذاری کنید:
sudo fail2ban-client -t
sudo systemctl restart fail2ban
تغییر پورت SSH بهتنهایی مانع حمله نمیشود. این اقدام میتواند بخشی از اسکنهای خودکار ساده را کاهش دهد، اما باید در کنار کلید SSH، محدودیت دسترسی، فایروال و Fail2ban استفاده شود.
مطالعه بیشتر: آموزش تغییر پورت SSH در اوبونتو
تفاوت backend نوع systemd و فایل گزارش
Fail2ban برای مشاهده رخدادها از Backend استفاده میکند. در سیستمهای جدید مبتنی بر systemd، تنظیم زیر میتواند گزارشها را از Journal بخواند:
backend = systemd
هنگام استفاده از Backend نوع systemd، تعیین logpath برای همان Jail معتبر نیست؛ اطلاعات از Journal و تنظیمات journalmatch فیلتر دریافت میشوند. مستندات رسمی Fail2ban این تفاوت را برای Backend نوع systemd توضیح میدهد. GitHub
در برخی سرورها، گزارشهای SSH در فایلهایی مانند /var/log/auth.log یا مسیر دیگری ذخیره میشوند. اگر Jail فعال نمیشود، ابتدا روش ثبت گزارش در همان سرور را بررسی کنید و از کپیکردن بدون بررسی یک logpath عمومی خودداری کنید.
مشاهده وضعیت و IPهای مسدودشده
برای بررسی وضعیت کلی Fail2ban دستور زیر را اجرا کنید:
sudo fail2ban-client status
این خروجی باید فهرست Jailهای فعال را نشان دهد. سپس وضعیت Jail مربوط به SSH را ببینید:
sudo fail2ban-client status sshd
در این بخش معمولاً تعداد رخدادهای شناساییشده، تعداد IPهای مسدودشده و فهرست Banها نمایش داده میشود.
برای مشاهده گزارش سرویس از systemd میتوانید از دستور زیر استفاده کنید:
sudo journalctl -u fail2ban --no-pager
برای دنبالکردن رخدادهای جدید بهصورت زنده:
sudo journalctl -u fail2ban -f
این فرمان تا زمان توقف دستی باز میماند و برای عیبیابی مناسب است.
آزمایش ایمن عملکرد Fail2ban
آزمایش را از یک IP دیگر انجام دهید؛ برای مثال، اتصال اینترنت متفاوت یا یک سیستم آزمایشی. نشست مدیریتی فعلی را باز نگه دارید و از وجود دسترسی کنسول اضطراری مطمئن شوید.
از IP آزمایشی چند ورود ناموفق کنترلشده انجام دهید. تعداد خطاها نباید از روی بیاحتیاطی و در همان نشست مدیریتی اصلی ایجاد شود.
پس از رسیدن به حد تعیینشده، روی سرور اجرا کنید:
sudo fail2ban-client status sshd
اگر IP آزمایشی در فهرست مسدودشدهها ظاهر شد، Jail و فیلتر در حال کار هستند. سپس آزادشدن خودکار IP بعد از پایان bantime را نیز بررسی کنید.
آزادسازی IP مسدودشده
برای آزادکردن یک IP مشخص از Jail سرویس SSH از دستور زیر استفاده کنید:
sudo fail2ban-client set sshd unbanip 203.0.113.10
نشانی نمونه را با IP واقعی جایگزین کنید. قبل از Unban مطمئن شوید IP متعلق به مدیر یا کاربر مورد اعتماد است، نه یک منبع حمله فعال.
امکان مسدودکردن دستی یک IP نیز وجود دارد:
sudo fail2ban-client set sshd banip 203.0.113.10
برای مدیریت معمول، بهتر است تشخیص و مسدودسازی را به فیلترهای معتبر واگذار کنید. Ban دستی بدون ثبت علت میتواند در آینده عیبیابی را دشوار کند.
Fail2ban چه کاری انجام نمیدهد؟
Fail2ban لایهای تکمیلی است و نباید آن را یک راهکار کامل امنیت سرور دانست. این ابزار رخدادهای ثبتشده را تحلیل میکند؛ بنابراین اگر گزارشها تولید نشوند، فیلتر نامناسب باشد یا حمله از IPهای متعدد و پراکنده انجام شود، اثربخشی آن محدود خواهد بود.
Fail2ban موارد زیر را جایگزین نمیکند:
- احراز هویت با کلید SSH
- غیرفعالکردن ورود مستقیم Root در صورت امکان
- رمز عبور قوی و منحصربهفرد
- فایروال و محدودکردن پورتهای غیرضروری
- بهروزرسانی سیستمعامل و OpenSSH
- کنترل دسترسی کاربران
- مانیتورینگ گزارشها و هشدارهای امنیتی
- تهیه نسخه پشتیبان از اطلاعات سرور
مطالعه بیشتر: آموزش افزایش امنیت ورود با SSH Key
خطاهای رایج Fail2ban و روش رفع آنها
Jail مربوط به SSH فعال نیست
ابتدا وضعیت کلی را بررسی کنید:
sudo fail2ban-client status
اگر sshd در فهرست وجود ندارد، مقدار enabled، نام بخش [sshd] و صحت فایل .local را بررسی کنید. سپس پیکربندی را آزمایش کنید:
sudo fail2ban-client -t
خطای No file(s) found for glob
این خطا معمولاً نشان میدهد مسیر گزارش تعریفشده با ساختار سرور مطابقت ندارد. اگر سیستم از Journal استفاده میکند، Backend نوع systemd را بررسی کنید و logpath نامرتبط را در همان Jail قرار ندهید.
سرویس اجرا میشود اما IP مسدود نمیشود
ممکن است گزارشهای ورود ناموفق در منبع مورد انتظار ثبت نشوند یا فیلتر با شکل گزارشها تطبیق نداشته باشد. ابتدا با journalctl رخدادهای SSH و Fail2ban را مشاهده کنید.
پورت و نام Jail را نیز بررسی کنید. تغییر پورت SSH بدون بهروزرسانی تنظیمات Jail میتواند باعث پیکربندی ناقص شود.
IP مدیر سرور مسدود شده است
از کنسول VPS یا یک IP دیگر وارد شوید و IP را از Jail آزاد کنید. سپس مقدارهای maxretry و findtime را بازبینی کنید.
اگر IP ثابت و اختصاصی دارید، میتوان آن را با دقت به فهرست استثنا افزود؛ اما این کار برای IPهای پویا، عمومی یا مشترک توصیه نمیشود.
مطالعه بیشتر: امنیت سرور لینوکس بعد از راهاندازی
Fail2ban بعد از تغییرات اجرا نمیشود
فایل تنظیمات ممکن است دارای اشتباه نگارشی یا مقدار نامعتبر باشد. پیش از Restart همیشه این دستور را اجرا کنید:
sudo fail2ban-client -t
سپس جزئیات خطا را در گزارش سرویس مشاهده کنید:
sudo journalctl -u fail2ban -n 100 --no-pager
چکلیست نهایی محافظت از SSH
- سیستمعامل و بستههای امنیتی بهروز هستند.
- دسترسی کنسول اضطراری سرور آزمایش شده است.
- ورود با کلید SSH فعال است.
- دسترسی کاربران غیرضروری حذف شده است.
- فقط پورتهای موردنیاز در فایروال باز هستند.
- Fail2ban از مخزن توزیع نصب شده است.
- تنظیمات سفارشی در فایل
.localقرار دارند. - Jail مربوط به
sshdفعال است. - پورت Jail با پورت واقعی SSH هماهنگ است.
- تنظیمات با
fail2ban-client -tآزمایش شدهاند. - وضعیت Jail با
fail2ban-client status sshdکنترل شده است. - فرایند Ban و Unban با یک IP آزمایشی بررسی شده است.
- گزارشهای Fail2ban بهصورت دورهای بازبینی میشوند.
جمع بندی
در پاسخ به «Fail2ban چیست؟ آموزش نصب و تنظیم Fail2ban برای محافظت از SSH» میتوان گفت Fail2ban گزارشهای ورود ناموفق را تحلیل میکند و IPهایی را که در بازه مشخص از حد مجاز عبور کردهاند، از طریق فایروال مسدود میسازد. تنظیمات اصلی آن شامل maxretry، findtime و bantime است.
برای جلوگیری از قطع دسترسی، تنظیمات را ابتدا آزمایش کنید، یک نشست SSH را باز نگه دارید و دسترسی کنسول اضطراری داشته باشید. همچنین فایل اصلی jail.conf را تغییر ندهید و سفارشیسازیها را در فایلهای .local ذخیره کنید.
Fail2ban زمانی مؤثرتر است که در کنار کلید SSH، تنظیم درست فایروال، بهروزرسانی منظم و مدیریت اصولی کاربران استفاده شود. این ابزار بهتنهایی ضعف رمز عبور یا تنظیمات ناامن SSH را جبران نمیکند.
برای بررسی امنیت SSH، تنظیم فایروال یا انتخاب سرور مجازی متناسب با پروژه میتوانید با شرکت تجارت الکترونیک نوژن تماس بگیرید و درباره خدمات سرور و پشتیبانی فنی مشاوره دریافت کنید.
سؤالات متداول
آیا Fail2ban یک فایروال است؟
خیر. Fail2ban گزارشها را تحلیل میکند و بر اساس نتیجه، از Actionهای فایروال برای مسدودکردن IP استفاده میکند. بنابراین نقش آن با خود فایروال یکسان نیست.
آیا Fail2ban جلوی تمام حملات SSH را میگیرد؟
خیر. این ابزار تعداد تلاشهای مکرر از IPهای قابل شناسایی را محدود میکند، اما جایگزین کلید SSH، رمز قوی، فایروال و بهروزرسانی امنیتی نیست.
بهترین مقدار maxretry و bantime چیست؟
یک مقدار ثابت برای همه سرورها وجود ندارد. تعداد مدیران، نوع IP کاربران، حساسیت سرور و الگوی حملات باید در انتخاب این تنظیمات در نظر گرفته شوند.
چگونه بفهمیم Jail مربوط به SSH فعال است؟
دستور sudo fail2ban-client status را اجرا کنید و وجود sshd را در فهرست Jailها بررسی کنید. سپس با sudo fail2ban-client status sshd جزئیات آن را ببینید.
آیا Fail2ban با پورت سفارشی SSH کار میکند؟
بله. باید مقدار port در Jail را با پورت واقعی SSH هماهنگ کنید و سپس صحت پیکربندی و عملکرد مسدودسازی را آزمایش کنید.
اگر IP خودمان مسدود شد چه کنیم؟
از کنسول اضطراری ارائهدهنده VPS یا یک IP دیگر وارد شوید و با دستور set sshd unbanip، IP موردنظر را آزاد کنید. سپس تنظیمات Jail را بازبینی کنید.
آیا باید فایل jail.conf را ویرایش کنیم؟
خیر. بهتر است تغییرات در jail.local یا فایل اختصاصی .local داخل jail.d ذخیره شوند تا بهروزرسانی بسته تنظیمات سفارشی را بازنویسی نکند.
