Fail2ban یک ابزار امنیتی متنباز برای لینوکس است که لاگ سرویسها را میخواند و IPهایی را که چند بار پشت سر هم تلاش ناموفق داشتهاند، بهطور خودکار و برای مدت مشخصی در فایروال مسدود میکند. در این آموزش Fail2ban را روی Ubuntu نصب میکنیم، آن را برای SSH، Nginx و صفحه ورود وردپرس تنظیم میکنیم و با دستورهای مدیریت و رفع اشکال آن آشنا میشویم.
فهرست مطالب
Fail2ban چطور کار میکند؟
Fail2ban از سه جزء اصلی تشکیل شده است:
- Filter: الگوهای Regex که خطوط مربوط به تلاش ناموفق را در لاگ تشخیص میدهند؛ مثلاً «Failed password for root from ۱.۲.۳.۴».
- Action: کاری که هنگام شناسایی مهاجم انجام میشود؛ معمولاً افزودن IP به فایروال (nftables، iptables یا UFW).
- Jail: ترکیب یک فیلتر، یک منبع لاگ و یک اقدام، با تنظیماتی مثل تعداد تلاش مجاز و مدت مسدودی.
سه پارامتر کلیدی هر Jail:
maxretry: تعداد تلاش ناموفق مجاز.findtime: بازه زمانی شمارش تلاشها.bantime: مدت مسدودی.
مثلاً با maxretry = 5 و findtime = 10m، هر IP که در ده دقیقه پنج بار ناموفق باشد، مسدود میشود.
نصب Fail2ban روی Ubuntu
sudo apt update
sudo apt install fail2ban -y
sudo systemctl enable --now fail2ban
sudo systemctl status fail2ban
اگر هنوز SSH را سختسازی نکردهاید، قبل از ادامه راهنمای امنیت SSH را انجام دهید. Fail2ban یک لایه تکمیلی است، نه جایگزین ورود با کلید.
ساختار فایلهای پیکربندی
فایل /etc/fail2ban/jail.conf تنظیمات پیشفرض است و با بهروزرسانی بسته بازنویسی میشود؛ آن را ویرایش نکنید. بهجای کپی کامل آن، فقط تغییرات خود را در یک فایل .local بنویسید. فایلهای .local مقادیر پیشفرض را بازنویسی میکنند:
sudo nano /etc/fail2ban/jail.d/custom.local
تنظیم Jail برای SSH
[DEFAULT]
bantime = 1h
findtime = 10m
maxretry = 5
ignoreip = 127.0.0.1/8 ::1 203.0.113.10
banaction = nftables-multiport
backend = systemd
[sshd]
enabled = true
port = ssh
maxretry = 3
ignoreip: IP ثابت خودتان را اینجا بگذارید تا هرگز به اشتباه مسدود نشوید.banaction: در Ubuntu جدید nftables مناسب است. اگر از UFW استفاده میکنید، میتوانیدufwبگذارید تا مسدودیها در خروجیufw statusهم دیده شوند.backend = systemd: لاگها را مستقیم از journald میخواند. در توزیعهایی که فایل/var/log/auth.logوجود ندارد (مثل Debian ۱۲ بدون rsyslog)، بدون این تنظیم Jail مربوط به SSH اصلاً اجرا نمیشود.- اگر پورت SSH را تغییر دادهاید، عدد پورت را بهجای
sshبنویسید.
بعد از ذخیره، تنظیمات را بررسی و اعمال کنید:
sudo fail2ban-client -t
sudo systemctl restart fail2ban
sudo fail2ban-client status sshd
مسدودسازی طولانیتر برای مهاجمان تکراری
بسیاری از رباتها بعد از پایان مسدودی برمیگردند. Jail ویژهای به نام recidive لاگ خود Fail2ban را میخواند و IPهایی را که در یک روز چند بار مسدود شدهاند، برای مدت طولانی مسدود میکند:
[recidive]
enabled = true
bantime = 1w
findtime = 1d
maxretry = 3
راه دیگر، افزایش تدریجی مدت مسدودی است: با bantime.increment = true در بخش DEFAULT، هر بار که یک IP دوباره مسدود شود، مدت مسدودیاش بیشتر میشود.
محافظت از Nginx و وردپرس
Fail2ban فیلترهای آمادهای برای Nginx دارد. مثلاً برای مسدود کردن رباتهایی که دنبال آدرسهای ناموجود میگردند یا رمز Basic Auth را حدس میزنند:
[nginx-http-auth]
enabled = true
logpath = /var/log/nginx/error.log
backend = auto
[nginx-botsearch]
enabled = true
logpath = /var/log/nginx/access.log
backend = auto
برای صفحه ورود وردپرس میتوانید یک فیلتر ساده بنویسید که درخواستهای POST مکرر به wp-login.php و xmlrpc.php را شناسایی کند. فایل /etc/fail2ban/filter.d/wordpress-login.conf:
[Definition]
failregex = ^<HOST> .* "POST /(wp-login\.php|xmlrpc\.php)
ignoreregex =
و Jail آن:
[wordpress-login]
enabled = true
port = http,https
filter = wordpress-login
logpath = /var/log/nginx/access.log
backend = auto
maxretry = 10
findtime = 5m
این فیلتر همه درخواستهای POST را میشمارد، نه فقط ورودهای ناموفق را؛ برای همین maxretry را بالاتر گذاشتهایم تا کاربران واقعی مسدود نشوند. اگر سایت پشت CDN یا Reverse Proxy است، مطمئن شوید IP واقعی کاربر در لاگ ثبت میشود؛ در غیر این صورت Fail2ban IP خود CDN را مسدود میکند. برای سایتهای وردپرسی، یک افزونه امنیتی هم لایه حفاظتی مناسبی است.
دستورهای مدیریت
| دستور | کاربرد |
|---|---|
sudo fail2ban-client status |
فهرست Jailهای فعال |
sudo fail2ban-client status sshd |
IPهای مسدودشده و آمار یک Jail |
sudo fail2ban-client set sshd unbanip 1.2.3.4 |
رفع مسدودی یک IP |
sudo fail2ban-client set sshd banip 1.2.3.4 |
مسدودسازی دستی |
sudo fail2ban-client banned |
همه IPهای مسدود در همه Jailها |
sudo fail2ban-regex /var/log/nginx/access.log /etc/fail2ban/filter.d/wordpress-login.conf |
آزمایش یک فیلتر روی لاگ واقعی |
رفع اشکال
- Jail اجرا نمیشود: لاگ خود Fail2ban را ببینید:
sudo journalctl -u fail2ban -n 50. خطای رایج، پیدا نشدن فایل لاگ است که باbackend = systemdیا اصلاحlogpathحل میشود. - هیچ IPی مسدود نمیشود: با
fail2ban-regexبررسی کنید که فیلتر واقعاً با خطوط لاگ تطبیق دارد. - خودتان مسدود شدید: از کنسول VNC پنل سرور وارد شوید، IP خود را با
unbanipآزاد کنید و آن را بهignoreipاضافه کنید. - مسدودی در Docker اثر ندارد: ترافیک کانتینرها از زنجیره FORWARD عبور میکند. برای سرویسهای داخل Docker، Action باید روی زنجیره DOCKER-USER اعمال شود.
محدودیتهای Fail2ban
Fail2ban برای حملات Brute Force و اسکنهای خودکار مؤثر است، اما:
- در برابر حملات توزیعشده که از هزاران IP مختلف و با تعداد کم تلاش از هر IP انجام میشوند، کارایی محدودی دارد.
- در برابر حملات DDoS حجیم کاری نمیکند، چون ترافیک قبل از رسیدن به سرور، پهنای باند را پر کرده است. در این مورد مقاله حمله DDoS چیست را بخوانید.
- جایگزین سختسازی سرویسها و بهروزرسانی نرمافزار نیست.
سوالات متداول
آیا با وجود ورود فقط با کلید SSH، هنوز به Fail2ban نیاز دارم؟
از نظر امنیت ورود، خطر Brute Force با کلید عملاً از بین رفته است. اما Fail2ban حجم لاگها و بار اتصالهای بیفایده را کاهش میدهد و برای سرویسهای دیگر مثل وبسرور و ایمیل همچنان مفید است.
آیا Fail2ban برای وردپرس هم کاربرد دارد؟
بله. با فیلتری که درخواستهای مکرر به wp-login.php و xmlrpc.php را شناسایی کند، حملات حدس رمز به وردپرس در سطح فایروال مسدود میشوند و بار پردازشی PHP کاهش مییابد.
bantime مناسب چقدر است؟
برای شروع ۱ ساعت مناسب است، همراه با Jail مربوط به recidive یا افزایش تدریجی مدت برای مهاجمان تکراری. مسدودی دائمی ممکن است کاربران واقعی پشت IPهای مشترک را هم گرفتار کند.
Fail2ban با UFW تداخل دارد؟
خیر. هر دو قوانین را در یک فایروال ثبت میکنند. اگر میخواهید مسدودیها در UFW دیده شوند، banaction = ufw را تنظیم کنید.
امنسازی تخصصی سرورهای لینوکس
برای سختسازی و پایش امنیتی سرور، از خدمات مدیریت و پشتیبانی سرور تراست هاست کمک بگیرید.