آموزش Fail2ban: راهنمای کامل نصب و پیکربندی برای امن‌سازی سرور



در مدیریت سرور، امنیت یک فرآیند بی‌پایان است. یکی از رایج‌ترین و در عین حال آزاردهنده‌ترین تهدیدها، حملات Brute-force است؛ جایی که ربات‌های خودکار به صورت شبانه‌روزی تلاش می‌کنند با حدس زدن هزاران ترکیب نام کاربری و رمز عبور، به سرویس‌های حیاتی شما مانند SSH، FTP یا پنل مدیریت وب‌سایت نفوذ کنند. Fail2Ban یک ابزار متن-باز و فوق‌العاده کارآمد در حوزه پیشگیری از نفوذ (IPS) است. این ابزار با نظارت بر فایل‌های لاگ (Log) سرور، آی‌پی‌های مشکوک را شناسایی و به طور خودکار مسدود می‌کند. این مقاله یک راهنمای کامل و عمیق برای تسلط بر Fail2Ban است، از نصب اولیه گرفته تا ساخت فیلترها و Jailهای سفارشی برای امن‌سازی سرور مجازی آمریکا یا هر سرور لینوکسی دیگر.

 

مفاهیم اصلی Fail2Ban: Fail2Ban چگونه کار می‌کند؟

برای استفاده حرفه‌ای از Fail2Ban، ابتدا باید با اجزای اصلی آن آشنا شویم:

  • فیلتر (Filter): یک فایل حاوی الگوهای متنی (Regular Expressions یا Regex) است. وظیفه فیلتر این است که به Fail2Ban بگوید دنبال چه نوع خطوطی در فایل‌های لاگ بگردد. برای مثال، یک فیلتر SSH به دنبال خطوطی می‌گردد که حاوی عبارت “Failed password for” باشند. فیلترها در مسیر /etc/fail2ban/filter.d/ قرار دارند.
  • اقدام (Action): دستوری است که پس از شناسایی یک IP متخلف اجرا می‌شود. معروف‌ترین اقدام، مسدود کردن IP با استفاده از فایروال (مانند iptables) است. اقدامات دیگر می‌توانند شامل ارسال ایمیل هشدار به مدیر سرور باشند. فایل‌های Action در مسیر /etc/fail2ban/action.d/ قرار دارند.
  • زندان (Jail): قلب تپنده Fail2Ban است. یک Jail، فیلتر و اقدام را به هم متصل می‌کند. در تنظیمات Jail مشخص می‌کنید که کدام فیلتر باید روی کدام فایل لاگ اعمال شود و در صورت رسیدن به حد نصاب خطا، کدام اقدام اجرا شود.

 

بخش اول: نصب و راه‌اندازی اولیه

نصب Fail2Ban روی اکثر توزیع‌های لینوکس استاندارد است.

 

 نصب در Debian/Ubuntu

sudo apt-get update
sudo apt-get install fail2ban -y

 

 نصب در CentOS/RHEL/Fedora

sudo yum install epel-release -y
sudo yum install fail2ban -y

پس از نصب، سرویس را فعال و اجرا کنید:

sudo systemctl start fail2ban
sudo systemctl enable fail2ban

برای بررسی وضعیت آن، از دستور sudo systemctl status fail2ban استفاده کنید.

 

بخش دوم: پیکربندی اصلی

پیکربندی Fail2Ban از طریق فایل‌های متنی انجام می‌شود. فایل اصلی تنظیمات /etc/fail2ban/jail.conf است. هشدار: هرگز این فایل را مستقیما ویرایش نکنید! این فایل با هر آپدیت نرم‌افزار بازنویسی می‌شود. به جای آن، ما یک فایل محلی به نام jail.local ایجاد می‌کنیم و تمام تنظیمات سفارشی خود را در آن قرار می‌دهیم. تنظیمات شما در jail.local بر تنظیمات پیش‌فرض اولویت خواهد داشت.

برای شروع، یک کپی از فایل اصلی ایجاد کنید:

sudo cp /etc/fail2ban/jail.conf /etc/fail2ban/jail.local

حالا فایل jail.local را با یک ویرایشگر باز کنید:

sudo nano /etc/fail2ban/jail.local

 

 تنظیمات سراسری در بخش [DEFAULT]

این تنظیمات به صورت پیش‌فرض روی تمام Jailها اعمال می‌شوند:

  • ignoreip: مهم‌ترین بخش! لیستی از IPهایی که هرگز نباید مسدود شوند. IP استاتیک خودتان، IP دفتر کار و آدرس localhost را حتماً اینجا وارد کنید. IPها با فاصله یا کاما از هم جدا می‌شوند.
    ignoreip = 127.0.0.1/8 ::1 192.168.1.100 YOUR_STATIC_IP
  • bantime: مدت زمان مسدود بودن یک IP. می‌توانید از پسوندهای m (دقیقه)، h (ساعت) و d (روز) استفاده کنید. مقدار -1 به معنای مسدودیت دائمی است (با احتیاط استفاده شود). مثال: bantime = 24h
  • findtime: بازه زمانی که خطاها در آن شمرده می‌شوند. مثال: findtime = 10m
  • maxretry: تعداد خطاهای مجاز در بازه findtime قبل از مسدود شدن. مثال: maxretry = 3
  • destemail: آدرس ایمیلی که گزارش‌ها به آن ارسال می‌شود.
  • action: اقدام پیش‌فرض. سه نوع اصلی وجود دارد:
    • %(action_)s: فقط IP را مسدود می‌کند (ساده).
    • %(action_mw)s: IP را مسدود کرده و یک ایمیل گزارش (Whois) برای شما ارسال می‌کند.
    • %(action_mwl)s: IP را مسدود کرده، ایمیل گزارش می‌فرستد و خطوط مربوطه از فایل لاگ را نیز در ایمیل ضمیمه می‌کند (بسیار مفید).

    برای شروع، پیشنهاد می‌شود از action = %(action_mwl)s استفاده کنید.

 

بخش سوم: فعال‌سازی Jailهای آماده

Fail2Ban با مجموعه‌ای از Jailهای از پیش تعریف‌شده برای سرویس‌های محبوب ارائه می‌شود. برای فعال کردن هر کدام، کافیست به بخش مربوط به آن در jail.local رفته و خط enabled = true را زیر نام آن اضافه کنید.

 

 مثال 1: امن‌سازی SSH (ضروری)

[sshd]
enabled = true
# اگر پورت SSH را تغییر داده‌اید، اینجا مشخص کنید
# port = 2222
# می‌توانید تنظیمات پیش‌فرض را بازنویسی کنید
# maxretry = 3
# bantime = 48h

 

 مثال 2: امن‌سازی وب‌سرور Nginx

[nginx-http-auth]
enabled = true

[nginx-botsearch]
enabled = true

 

 مثال 3: امن‌سازی سرور ایمیل Postfix

[postfix]
enabled = true

 

بخش چهارم: آموزش ساخت Jail سفارشی (قدرت واقعی Fail2Ban)

شما می‌توانید برای هر اپلیکیشنی که لاگ تولید می‌کند، یک Jail سفارشی بسازید. در ادامه دو مثال بسیار کاربردی را بررسی می‌کنیم.

 مثال کاربردی اول: محافظت از صفحه لاگین وردپرس

در این مثال، یک Jail برای محافظت از صفحه لاگین وردپرس (wp-login.php) در برابر حملات Brute-force می‌سازیم.

 مرحله 1: ایجاد فایل فیلتر (Filter)

یک فایل جدید در مسیر /etc/fail2ban/filter.d/ ایجاد کنید:

sudo nano /etc/fail2ban/filter.d/wordpress-auth.conf

محتوای زیر را در آن قرار دهید:

[Definition]
failregex = ^<HOST> .* "POST /wp-login.php HTTP/.*" 200
ignoreregex =

توضیح failregex: این الگو به دنبال خطوطی در لاگ می‌گردد که از IP مهاجم (<HOST>) یک درخواست POST به /wp-login.php ارسال شده و پاسخ وب‌سرور 200 OK بوده است. پاسخ 200 یعنی صفحه لاگین نمایش داده شده، اما لاگین موفق نبوده است.

 مرحله 2: تعریف Jail در jail.local

Jail را در انتهای فایل /etc/fail2ban/jail.local تعریف می‌کنیم:

[wordpress-auth]
enabled  = true
port     = http,https
filter   = wordpress-auth
logpath  = /var/log/nginx/access.log  # مسیر لاگ دسترسی وب‌سرور شما
maxretry = 5
bantime  = 24h

 

 مثال کاربردی دوم: مسدود کردن اسکنرهای مخرب (Bad Bot Blocker)

این یک Jail بسیار مفید برای هر وب‌سروری است. ربات‌ها دائما در حال اسکن کردن آدرس‌های اینترنتی برای یافتن فایل‌های حساس (مانند .env) یا نرم‌افزارهای آسیب‌پذیر (مانند phpMyAdmin) هستند. این درخواست‌ها معمولاً خطای 404 (پیدا نشد) ایجاد می‌کنند.

 

 مرحله 1: ایجاد فایل فیلتر

یک فیلتر جدید برای شناسایی این درخواست‌های مخرب ایجاد می‌کنیم:

sudo nano /etc/fail2ban/filter.d/apache-badbots.conf

محتوای زیر را در آن کپی کنید. این فیلتر به دنبال درخواست‌های رایج اسکنرها می‌گردد:

[Definition]
failregex = ^<HOST> -.*"(GET|POST|HEAD) .*(/phpmyadmin/|/pma/|/admin/|/wp-admin/|/xmlrpc.php|/\.git/|/\.env|/\.well-known/|/autodiscover/).* HTTP/.*" (404|403|400) .*$
ignoreregex =

توضیح failregex: این الگو به دنبال درخواست‌هایی از نوع GET, POST یا HEAD می‌گردد که شامل مسیرهای حساس هستند و با خطای 404، 403 (Forbidden) یا 400 (Bad Request) مواجه شده‌اند.

 مرحله 2: تست فیلتر (بسیار مهم)

قبل از فعال‌سازی، همیشه فیلتر خود را تست کنید. فایل لاگ وب‌سرور و فیلتر جدید را به دستور زیر بدهید:

sudo fail2ban-regex /var/log/apache2/access.log /etc/fail2ban/filter.d/apache-badbots.conf

خروجی باید تعدادی خط منطبق (Matched) را به شما نشان دهد. اگر نتیجه صفر بود، یا رباتی شما را اسکن نکرده یا الگوی شما با فرمت لاگ شما همخوانی ندارد.

 مرحله 3: تعریف Jail در jail.local

حالا Jail مربوط به این فیلتر را به فایل jail.local اضافه کنید:

[apache-badbots]
enabled  = true
port     = http,https
filter   = apache-badbots
logpath  = /var/log/apache2/access.log  # برای Nginx مسیر /var/log/nginx/access.log است
maxretry = 2
findtime = 1m
bantime  = 1w

توضیح تنظیمات: ما در اینجا بسیار سخت‌گیر هستیم. اگر یک IP در عرض ۱ دقیقه فقط ۲ بار یکی از این آدرس‌های مشکوک را درخواست کند، به مدت یک هفته (1w) مسدود می‌شود. یک کاربر عادی هرگز چنین رفتاری ندارد.

 مرحله 4: اعمال تغییرات

پس از تعریف Jail جدید، تنظیمات Fail2Ban را دوباره بارگذاری کنید:

sudo fail2ban-client reload

 

بخش پنجم: مدیریت و مانیتورینگ با fail2ban-client

برای مدیریت روزمره Fail2Ban از این دستورات استفاده کنید:

  • بررسی وضعیت کلی و لیست Jailهای فعال:
    sudo fail2ban-client status
  • مشاهده وضعیت یک Jail خاص و لیست IPهای مسدود شده:
    sudo fail2ban-client status apache-badbots
  • آزاد کردن یک IP (Unban): اگر به اشتباه یک IP (مثلاً IP خودتان) مسدود شد.
    sudo fail2ban-client set sshd unbanip 1.2.3.4
  • مسدود کردن دستی یک IP (Ban):
    sudo fail2ban-client set sshd banip 1.2.3.4
  • بررسی لاگ خود Fail2Ban برای خطاها:
    sudo tail -f /var/log/fail2ban.log

 

Fail2ban GUI: آیا رابط گرافیکی وجود دارد؟

Fail2Ban به صورت ذاتی یک ابزار خط فرمان است. قدرت و انعطاف‌پذیری آن در همین سادگی نهفته است. اگرچه پروژه‌های غیررسمی برای ایجاد رابط وب برای آن وجود دارد و برخی پنل‌های مدیریت سرور (مانند Plesk) آن را به صورت گرافیکی ارائه می‌دهند، اما برای مدیریت حرفه‌ای و درک کامل عملکرد، یادگیری دستورات خط فرمان ضروری و کارآمدتر است.

 

استفاده صحیح از Fail2Ban دیگر یک انتخاب نیست، بلکه یک ضرورت امنیتی برای هر سرور متصل به اینترنت است. این ابزار به تنهایی می‌تواند جلوی بخش عظیمی از حملات خودکار و کم‌هوش را بگیرد و منابع سرور شما را از هدر رفتن برای پاسخ به این درخواست‌های مخرب، حفظ کند. با دنبال کردن این راهنمای جامع، شما نه تنها می‌توانید سرور خود را امن کنید، بلکه می‌توانید با ساخت فیلترها و Jailهای سفارشی، این سپر دفاعی را برای هر اپلیکیشن دلخواهی، از یک vps ارزان شخصی تا زیرساخت‌های بزرگ، پیاده‌سازی کنید.