اگر یک سرور Ubuntu با IP عمومی دارید، احتمال زیادی وجود دارد که مدت کوتاهی بعد از آنلاین شدن سرور، رباتها شروع به امتحان کردن نامهای کاربری و رمزهای عبور مختلف روی SSH کنند.
حتی اگر رمز عبور قدرتمندی انتخاب کرده باشید، دیدن صدها یا هزاران تلاش ناموفق ورود در لاگهای سرور چیز عجیبی نیست.
یکی از ابزارهایی که میتواند این حجم از تلاشهای مخرب را کنترل کند Fail2Ban است.
Fail2Ban لاگ سرویسهایی مانند SSH را بررسی میکند و زمانی که یک IP در مدت مشخصی بیش از حد مجاز خطای ورود ایجاد کند، آن IP را برای مدتی مسدود میکند.
در این آموزش، Fail2Ban را روی Ubuntu نصب میکنیم، محافظت از SSH را فعال میکنیم و در نهایت نحوه مشاهده، مسدودکردن و آزادکردن IPها را یاد میگیریم.
نکته مهم: Fail2Ban یک لایه امنیتی تکمیلی است. استفاده از SSH Key، فایروال، بهروزرسانی سیستم و غیرفعالکردن روشهای ورود غیرضروری همچنان اهمیت زیادی دارد.
Fail2Ban چیست؟
Fail2Ban یک ابزار امنیتی متنباز است که لاگ سرویسهای مختلف سرور را بررسی میکند.
فرض کنید یک IP طی چند دقیقه بارها تلاش کند با رمز عبور اشتباه وارد SSH شود. Fail2Ban میتواند این رفتار را تشخیص دهد و با کمک فایروال، IP موردنظر را برای مدت مشخصی مسدود کند.
در یک سناریوی ساده میتوانیم تنظیم کنیم که:
هر IP حداکثر ۵ بار اجازه خطای ورود داشته باشد.
این ۵ تلاش در بازه ۱۰ دقیقه بررسی شوند.
در صورت عبور از حد مجاز، IP برای یک ساعت مسدود شود.
این کار حملات خودکار Brute Force را متوقف نمیکند، اما میتواند سرعت و تعداد تلاشهای یک مهاجم یا ربات را بهشدت کاهش دهد.
قبل از نصب Fail2Ban چه چیزهایی نیاز داریم؟
برای انجام این آموزش بهتر است موارد زیر را داشته باشید:
یک سرور یا VPS با Ubuntu
دسترسی
rootیا کاربری دارایsudoدسترسی فعال به SSH
ترجیحاً یک Session دوم SSH هنگام تغییر تنظیمات امنیتی
اگر سرور را بهتازگی تهیه کردهاید، پیشنهاد میکنیم ابتدا چکلیست راهاندازی و امنیت VPS را نیز مطالعه کنید.
همچنین اگر هنوز فایروال سرور را تنظیم نکردهاید، مقاله آموزش فایروال UFW در اوبونتو میتواند مکمل این آموزش باشد.
مرحله اول: بهروزرسانی لیست پکیجها
ابتدا از طریق SSH وارد سرور شوید و فهرست پکیجهای Ubuntu را بهروزرسانی کنید:
sudo apt update
در صورت نیاز میتوانید پکیجهای نصبشده را نیز ارتقا دهید:
sudo apt upgrade -y
ارتقای کامل سیستم برای نصب Fail2Ban اجباری نیست، اما بهروز نگه داشتن سیستم یکی از پایههای امنیت سرور محسوب میشود.
مرحله دوم: نصب Fail2Ban در Ubuntu
پکیج Fail2Ban در مخازن Ubuntu موجود است و میتوانیم آن را مستقیماً با APT نصب کنیم:
sudo apt install fail2ban -y
پس از پایان نصب، نسخه نصبشده را بررسی کنید:
fail2ban-client --version
سپس وضعیت سرویس را ببینید:
sudo systemctl status fail2ban
اگر سرویس در حال اجرا باشد، عبارتی مشابه زیر مشاهده میکنید:
Active: active (running)
اگر Fail2Ban اجرا نشده بود، آن را فعال و اجرا کنید:
sudo systemctl enable --now fail2ban
دستور enable باعث میشود Fail2Ban پس از Restart شدن سرور نیز بهصورت خودکار اجرا شود.
مرحله سوم: فایلهای تنظیمات Fail2Ban را بشناسیم
فایلهای اصلی Fail2Ban در مسیر زیر قرار دارند:
/etc/fail2ban/
یکی از فایلهای مهم این مسیر:
/etc/fail2ban/jail.conf
است.
اما بهتر است تنظیمات اختصاصی خودمان را مستقیماً داخل jail.conf تغییر ندهیم؛ زیرا ممکن است در بهروزرسانیهای آینده پکیج تغییر کند.
برای تنظیمات شخصی میتوانیم از:
/etc/fail2ban/jail.local
یا فایلهای .local داخل مسیر:
/etc/fail2ban/jail.d/
استفاده کنیم.
در این آموزش برای مرتب ماندن تنظیمات، یک فایل اختصاصی برای SSH ایجاد میکنیم.
مرحله چهارم: فعال کردن Fail2Ban برای SSH
فایل زیر را بسازید:
sudo nano /etc/fail2ban/jail.d/sshd.local
سپس تنظیمات زیر را داخل آن قرار دهید:
[sshd]
enabled = true
port = ssh
maxretry = 5
findtime = 10m
bantime = 1h
فایل را ذخیره کرده و از ویرایشگر خارج شوید.
اگر از Nano استفاده میکنید:
Ctrl + O
Enter
Ctrl + X
حالا ببینیم هر گزینه چه کاری انجام میدهد.
enabled
enabled = true
این گزینه Jail مربوط به SSH را فعال میکند.
port
port = ssh
مقدار ssh معمولاً به پورت استاندارد SSH یعنی 22 اشاره میکند.
اگر SSH را روی پورت دیگری اجرا میکنید، باید همان پورت را وارد کنید.
برای مثال:
port = 2222
اگر شماره پورت اشتباه باشد، تنظیمات Fail2Ban مطابق انتظار شما عمل نخواهد کرد.
maxretry
maxretry = 5
تعداد خطاهای مجاز قبل از Ban شدن IP را مشخص میکند.
در این مثال اگر یک IP در بازه تعیینشده ۵ بار خطای قابل شناسایی ایجاد کند، Fail2Ban میتواند آن را مسدود کند.
findtime
findtime = 10m
بازه زمانی بررسی خطاها را تعیین میکند.
اینجا Fail2Ban خطاهای ثبتشده در ۱۰ دقیقه را بررسی میکند.
bantime
bantime = 1h
مدت مسدود ماندن IP را مشخص میکند.
در تنظیم فعلی IP متخلف برای یک ساعت Ban خواهد شد.
میتوان برای مثال از مقادیر دیگری نیز استفاده کرد:
bantime = 30m
یا:
bantime = 24h
انتخاب زمان مناسب به نوع سرور و میزان حملات بستگی دارد.
مرحله پنجم: بررسی تنظیمات قبل از Restart
قبل از اعمال تنظیمات، بهتر است صحت Configuration را بررسی کنیم:
sudo fail2ban-client -t
اگر تنظیمات صحیح باشند، نباید خطای جدی دریافت کنید.
سپس Fail2Ban را Restart کنید:
sudo systemctl restart fail2ban
و وضعیت سرویس را دوباره بررسی کنید:
sudo systemctl status fail2ban --no-pager
مرحله ششم: بررسی فعال بودن Jail مربوط به SSH
برای مشاهده Jailهای فعال دستور زیر را اجرا کنید:
sudo fail2ban-client status
خروجی میتواند چیزی شبیه این باشد:
Status
|- Number of jail: 1
`- Jail list: sshd
وجود sshd در قسمت Jail list یعنی محافظت Fail2Ban برای SSH فعال شده است.
برای مشاهده جزئیات Jail مربوط به SSH اجرا کنید:
sudo fail2ban-client status sshd
خروجی شامل اطلاعاتی مانند تعداد خطاهای فعلی، تعداد کل خطاها، تعداد IPهای Ban شده و لیست IPهای مسدودشده خواهد بود.
نمونه:
Status for the jail: sshd
|- Filter
| |- Currently failed: 2
| `- Total failed: 18
`- Actions
|- Currently banned: 1
|- Total banned: 3
`- Banned IP list: 203.0.113.10
اعداد روی سرور شما طبیعتاً متفاوت خواهند بود.
مشاهده IPهای Ban شده توسط Fail2Ban
سادهترین روش:
sudo fail2ban-client status sshd
است.
در نسخههایی که فرمان مربوطه پشتیبانی میشود، میتوانید لیست IPهای Ban شده را نیز با دستور زیر مشاهده کنید:
sudo fail2ban-client get sshd banned
همچنین لاگ Fail2Ban برای بررسی اتفاقات بسیار مفید است:
sudo tail -f /var/log/fail2ban.log
برای خروج از حالت مشاهده زنده لاگ:
Ctrl + C
چگونه یک IP را از Ban خارج کنیم؟
فرض کنید IP زیر به اشتباه Ban شده است:
203.0.113.10
برای آزاد کردن آن اجرا کنید:
sudo fail2ban-client set sshd unbanip 203.0.113.10
سپس دوباره وضعیت Jail را بررسی کنید:
sudo fail2ban-client status sshd
اگر دستور موفق باشد، IP نباید در لیست Banها باقی مانده باشد.
اضافه کردن IP مطمئن به Whitelist
اگر یک IP مدیریتی ثابت دارید که همیشه از آن برای اتصال به سرور استفاده میکنید، میتوانید آن را در لیست IPهای قابل اعتماد قرار دهید.
فایل تنظیمات را باز کنید:
sudo nano /etc/fail2ban/jail.d/sshd.local
و برای مثال بنویسید:
[sshd]
enabled = true
port = ssh
maxretry = 5
findtime = 10m
bantime = 1h
ignoreip = 127.0.0.1/8 ::1 198.51.100.20
در این مثال:
198.51.100.20
صرفاً یک IP نمونه است و باید با IP واقعی و ثابت خودتان جایگزین شود.
بعد از تغییر تنظیمات:
sudo fail2ban-client -t
sudo systemctl restart fail2ban
هشدار: اگر اینترنت شما IP متغیر دارد، IP فعلی را بدون درنظرگرفتن این موضوع Whitelist نکنید. همچنین از Whitelist کردن رنجهای بسیار بزرگ و غیرضروری خودداری کنید.
افزایش زمان Ban برای مهاجمان تکراری
در سرورهایی که دائماً هدف اسکن و Brute Force هستند، میتوان از Ban طولانیتر استفاده کرد.
برای مثال:
[sshd]
enabled = true
port = ssh
maxretry = 5
findtime = 10m
bantime = 12h
در این حالت IP متخلف ۱۲ ساعت مسدود میشود.
تنظیم بسیار سختگیرانه همیشه بهتر نیست. اگر maxretry را بیش از حد پایین یا bantime را بدون بررسی بسیار طولانی انتخاب کنید، احتمال مسدود شدن کاربران واقعی نیز بیشتر میشود.
برای یک VPS عمومی، مقادیر زیر نقطه شروع متعادلی هستند:
maxretry = 5
findtime = 10m
bantime = 1h
بعداً میتوانید بر اساس لاگهای واقعی سرور آنها را تغییر دهید.
اگر SSH روی پورت 22 نیست چه کنیم؟
اگر پورت SSH مثلاً روی 2222 تنظیم شده است، Jail نیز باید از همان پورت استفاده کند:
[sshd]
enabled = true
port = 2222
maxretry = 5
findtime = 10m
bantime = 1h
سپس:
sudo fail2ban-client -t
sudo systemctl restart fail2ban
فراموش نکنید اگر UFW فعال است، پورت جدید SSH نیز باید در فایروال مجاز شده باشد.
برای مثال:
sudo ufw allow 2222/tcp
قبل از بستن دسترسی پورت قبلی، حتماً در یک Terminal جداگانه اتصال SSH روی پورت جدید را آزمایش کنید.
چگونه عملکرد Fail2Ban را آزمایش کنیم؟
برای تست Fail2Ban بهتر است از یک دستگاه یا IP دیگر استفاده کنید.
چند بار با اطلاعات ورود اشتباه به SSH متصل شوید و سپس روی سرور اجرا کنید:
sudo fail2ban-client status sshd
اگر تعداد خطاها از maxretry عبور کند، IP آزمایشی باید در لیست Ban قرار بگیرد.
مهم: این آزمایش را از تنها مسیر دسترسی خودتان به سرور انجام ندهید. اگر IP خودتان Ban شود و روش دیگری برای ورود نداشته باشید، تا زمان پایان Ban یا دسترسی از مسیر جایگزین نمیتوانید وارد SSH شوید.
مشاهده لاگهای Fail2Ban
برای بررسی عملکرد Fail2Ban میتوانید از دستور زیر استفاده کنید:
sudo tail -n 100 /var/log/fail2ban.log
برای مشاهده زنده:
sudo tail -f /var/log/fail2ban.log
همچنین لاگ سرویس از طریق systemd قابل مشاهده است:
sudo journalctl -u fail2ban --no-pager
یا برای مشاهده آخرین پیامها:
sudo journalctl -u fail2ban -n 100 --no-pager
این دستورات هنگام عیبیابی Fail2Ban بسیار کاربردی هستند.
خطای Failed to start Fail2Ban را چگونه رفع کنیم؟
اگر بعد از تغییر Configuration سرویس اجرا نشد، ابتدا تنظیمات را بررسی کنید:
sudo fail2ban-client -t
سپس وضعیت سرویس را ببینید:
sudo systemctl status fail2ban --no-pager
و لاگهای مربوط به آن را بررسی کنید:
sudo journalctl -u fail2ban -n 100 --no-pager
یکی از دلایل رایج، اشتباه تایپی در فایل .local است.
میتوانید فایل تنظیمات SSH را دوباره بررسی کنید:
sudo nano /etc/fail2ban/jail.d/sshd.local
نمونه ساده و صحیح:
[sshd]
enabled = true
port = ssh
maxretry = 5
findtime = 10m
bantime = 1h
سپس:
sudo fail2ban-client -t
sudo systemctl restart fail2ban
آیا Fail2Ban بهتنهایی برای امنیت SSH کافی است؟
خیر.
Fail2Ban بیشتر برای محدود کردن تلاشهای مکرر و خودکار ورود کاربرد دارد و نباید آن را جایگزین سایر اقدامات امنیتی بدانیم.
برای افزایش امنیت SSH بهتر است چند لایه امنیتی در کنار یکدیگر داشته باشید:
سیستمعامل و پکیجها را بهروز نگه دارید.
از SSH Key بهجای رمز عبور، در صورت امکان، استفاده کنید.
ورود مستقیم کاربر
rootرا در صورت عدم نیاز محدود کنید.فایروال UFW یا راهکار مناسب دیگری را تنظیم کنید.
سرویسها و پورتهای غیرضروری را ببندید.
Fail2Ban را برای سرویسهای حساس فعال کنید.
لاگهای امنیتی سرور را بهصورت دورهای بررسی کنید.
از اطلاعات مهم سرور Backup داشته باشید.
امنیت مناسب سرور معمولاً نتیجه یک تنظیم خاص نیست؛ بلکه حاصل چند لایه محافظتی است.
تفاوت Fail2Ban و UFW چیست؟
Fail2Ban و UFW وظایف متفاوتی دارند و میتوانند در کنار یکدیگر استفاده شوند.
UFW مشخص میکند چه پورتها و ارتباطاتی در حالت کلی اجازه ورود یا خروج داشته باشند.
برای مثال میتوانید فقط SSH، HTTP و HTTPS را باز نگه دارید.
اما Fail2Ban رفتار کاربران و IPها را بر اساس لاگ سرویسها بررسی میکند و میتواند IPهایی را که رفتار مشکوک یا تعداد زیادی خطای احراز هویت دارند، موقتاً مسدود کند.
به زبان ساده:
UFW = تعیین قوانین کلی دسترسی شبکه
Fail2Ban = واکنش به رفتار مشکوک ثبتشده در لاگها
به همین دلیل استفاده ترکیبی از آنها در بسیاری از سرورها منطقی است.
برای تنظیم UFW میتوانید راهنمای کامل فایروال UFW در Ubuntu را مطالعه کنید.
دستورات مهم Fail2Ban در یک نگاه
بررسی وضعیت سرویس:
sudo systemctl status fail2ban
Restart سرویس:
sudo systemctl restart fail2ban
بررسی Configuration:
sudo fail2ban-client -t
مشاهده Jailهای فعال:
sudo fail2ban-client status
وضعیت SSH:
sudo fail2ban-client status sshd
مشاهده IPهای Ban شده:
sudo fail2ban-client get sshd banned
آزاد کردن یک IP:
sudo fail2ban-client set sshd unbanip IP_ADDRESS
مشاهده لاگ:
sudo tail -f /var/log/fail2ban.log
سوالات متداول
آیا Fail2Ban جلوی تمام حملات SSH را میگیرد؟
خیر. Fail2Ban تعداد تلاشهای مکرر از یک IP را محدود میکند، اما یک راهکار کامل امنیتی نیست. استفاده از SSH Key، تنظیم فایروال، بهروزرسانی سیستم و سیاستهای مناسب دسترسی همچنان ضروری است.
آیا Fail2Ban با UFW قابل استفاده است؟
بله. این دو ابزار نقشهای متفاوتی دارند و میتوانند همزمان روی سرور استفاده شوند. UFW قوانین عمومی فایروال را مدیریت میکند و Fail2Ban بر اساس رفتار ثبتشده در لاگها IPهای مشکوک را مسدود میکند.
بهترین مقدار bantime برای Fail2Ban چقدر است؟
یک مقدار ثابت برای همه سرورها وجود ندارد. 1h میتواند نقطه شروع مناسبی باشد و سپس با توجه به میزان حملات و شرایط سرور تغییر داده شود.
چگونه بفهمیم Fail2Ban واقعاً کار میکند؟
ابتدا دستور:
sudo fail2ban-client status
را اجرا کنید و مطمئن شوید Jail مربوط به sshd فعال است.
سپس:
sudo fail2ban-client status sshd
را اجرا کنید تا تعداد تلاشهای ناموفق و IPهای Ban شده را ببینید.
جمعبندی
سروری که SSH آن مستقیماً از اینترنت قابل دسترسی است، ممکن است بهطور مداوم هدف اسکن و تلاشهای ورود خودکار قرار بگیرد.
Fail2Ban با بررسی لاگهای احراز هویت میتواند IPهایی را که بیش از حد مجاز خطای ورود ایجاد میکنند شناسایی کرده و برای مدت مشخصی مسدود کند.
برای یک تنظیم اولیه مناسب میتوانید از Configuration زیر شروع کنید:
[sshd]
enabled = true
port = ssh
maxretry = 5
findtime = 10m
bantime = 1h
بعد از ذخیره تنظیمات نیز همیشه آن را بررسی و سرویس را Restart کنید:
sudo fail2ban-client -t
sudo systemctl restart fail2ban
sudo fail2ban-client status sshd
در نهایت فراموش نکنید که Fail2Ban فقط یک لایه از امنیت سرور است. ترکیب SSH Key، فایروال، بهروزرسانی منظم، تنظیم صحیح SSH و Fail2Ban محافظت بسیار بهتری نسبت به تکیه بر یک ابزار ایجاد میکند.



