WIUNIX ACADEMY
محافظت از Nginx با Fail2ban؛ لاگ معتبر، مسدودسازی محدود و بازیابی
صفحهٔ 6 از 6؛ مراحل قبلی و پیشنیازها را پیش از ادامه مرور کن.
آموزش متناسب با محیط تو
کجا اجرا میکنی؟
سیستمعامل و نسخه را انتخاب کن تا مراحل، دستورها و راهحلها برای همان محیط نمایش داده شوند.
آموزش متناسب با مقادیر تو
تنظیمات این آموزش
مقادیر نمونه را برای محیط خودت تنظیم کن؛ متن و دستورهای مرتبط با هم تغییر میکنند. رمز، کلید خصوصی و توکن وارد نکن. مقادیر فقط در همین زبانه نگهداری میشوند و به سرور یا لینک اشتراکگذاری فرستاده نمیشوند. پیش از اجرا، DNS، گواهیها و سیاست شبکهٔ واقعی را بررسی کن.
آیپی، دامنه یا پورت مثالها با محیط تو فرق دارد؟ دکمهٔ زیر را باز کن، مقادیر را تغییر بده و «اعمال در آموزش» را بزن؛ سپس دستورهای بهروزشده را کپی کن.
تنظیم مقادیر برای محیط من11 مقدار قابلتغییر
عیب را در لایهٔ درست پیدا کنید
نبود رکورد، تطبیقنخوردن الگو، نرسیدن به تصمیم ban و بیاثر بودن مسدودسازی چهار مشکل جدا هستند. لاگ دارای IP اشخاص است؛ محلی بررسی کنید. الگوی موفق بدون ban ممکن است ناشی از ignoreip، تاریخ قدیمی، آستانه یا پیکربندی متفاوت باشد. خطای action موفقیت محسوب نمیشود. برای رفع عیب، ruleset را پاک نکنید، همهٔ پراکسیها را مجاز نکنید و الگو را به تمام پاسخهای 4xx گسترش ندهید.
لاگ جدید نوشته نمیشود
اولویت location، inode فایل و سیاست reopen را ببینید. تست تنظیمات ثابت نمیکند درخواست به این location رسیده است.
sudo nginx -t
sudo stat "/var/log/nginx/academy-auth.log"
sudo tail -n 12 "/var/log/nginx/academy-auth.log"
sudo cat /etc/logrotate.d/nginx
تاریخ یا parser هماهنگ نیست
آزمون الگو را فقط با نمونهٔ مصنوعی تکرار و ساعت را بررسی کنید. تاریخ مدرک واقعی را بازنویسی نکنید.
timedatectl status
sudo fail2ban-regex "/srv/academy-fail2ban-lab/fixture.log" /etc/fail2ban/filter.d/academy-nginx-401.conf --usedns=no --print-all-missed
خطای daemon یا action
لاگ سرویس، action نهایی و قواعد واقعی را ببینید؛ پیکربندی کامل را عمومی نکنید.
sudo journalctl -u fail2ban --since "20 minutes ago" --no-pager
sudo fail2ban-client status academy-nginx
sudo fail2ban-client get academy-nginx actions
sudo nft list ruleset
قدم بعدی
دسترسی را بدون پاککردن کل فایروال برگردانید
از کنسول مستقل یا نشست باز استفاده کنید. ابتدا فقط academy-nginx را متوقف کنید تا action قواعد و مجموعههای خودش را جمع کند. سپس پیش از هر restart، enabled همان بخش را در فایل local به false تغییر دهید؛ بخش SSH آزمایش را بیدلیل عوض نکنید. اگر فقط یک کاربر اشتباه تشخیص داده شده، IP واقعی را از status مشخص و با ساختار unban زیر آزاد کنید. IP رزروشدهٔ نمونه کاربر واقعی نیست. پیش از فعالسازی دوباره، علت یا allowlist را اصلاح کنید؛ دیتابیس ماندگار ممکن است بعد از restart banها را برگرداند و reboot روش بازیابی مطمئن نیست.
ترمینال Bash میزبان آزمایشگاهی اختصاصی
sudo fail2ban-client set academy-nginx unbanip 192.0.2.60
sudo fail2ban-client stop academy-nginx
sudo nano /etc/fail2ban/jail.d/90-academy-nginx.local
sudo fail2ban-client -t
sudo nft list ruleset
فقط همین jail متوقف و در فایل غیرفعال شده؛ قواعد و jailهای دیگر حفظ شدهاند.
قدم بعدی
فقط فایلهای تغییرکرده را برگردانید
اگر تغییر لاگ مشکل ایجاد کرد، خط افزودهٔ access_log را از همان location حذف و لاگ حسابرسی لازم را حفظ کنید. برای بازگرداندن فایل سایت، اول تغییرات همزمان را مقایسه کنید. دستور زیر آرشیو را در پوشهٔ خصوصی بررسی باز میکند و چیزی روی /etc نمینویسد. تعریف قالب جدید را فقط پس از حذف همهٔ ارجاعهای آن بردارید. پیش از reload تست کنید. فیلتر و override این آموزش را هم فقط پس از غیرفعالکردن jail بازنشسته کنید؛ کل /etc قدیمی را برنگردانید و بستهٔ مشترک فایروال را حذف نکنید.
ترمینال Bash میزبان آزمایشگاهی اختصاصی
set -e
sudo install -d -m 0700 "/srv/academy-fail2ban-lab/restore-review"
sudo tar -C "/srv/academy-fail2ban-lab/restore-review" -xpf "/srv/academy-fail2ban-lab/nginx-before.tar"
sudo diff -ru "/srv/academy-fail2ban-lab/restore-review/nginx" /etc/nginx || true
# فقط فایلهای مربوط را در ویرایشگر محافظتشده تطبیق دهید.
sudo nginx -t && sudo systemctl reload nginx
فقط فایلهای مربوط تطبیق داده شدهاند؛ تست موفق است و رفتار قبلی سایت بدون حذف تغییرات نامرتبط برمیگردد.
هدر معتبر، محل اجرای مسدودسازی نیست
اگر بعداً Cloudflare یا پراکسی اضافه میکنید، قبل از تغییر توپولوژی این jail را متوقف کنید. IP کاربر را فقط از شبکههای پراکسی مشخص و مورد اعتماد بازسازی کنید، دسترسی مستقیم نامطمئن به origin را ببندید و در لبه هدر ورودی را حذف یا بازنویسی کنید. هم IP همتای اصلی و هم IP بازیابیشده باید بررسی شوند. اعتماد عمومی به X-Forwarded-For یا انتخاب دلخواه IP از فهرست آن خطرناک است. رفتار last-nontrusted در real_ip_recursive جای احراز اصالت هدر نیست.
برای کاربر پشت CDN، محل مناسب اجرا معمولاً API مجاز لبه، WAF یا تصمیم لایهٔ برنامه با طراحی جداست. توکن API را وارد تنظیمات آموزش، لاگ یا history نکنید. این مقاله action ابری تنظیم نکرده و ban در Cloudflare را آزمایش نمیکند. درستبودن لاگ اتصال مستقیم نیز تنظیم اعتماد پراکسی آینده را تأیید نمیکند.
این کنترل فقط یک لایهٔ دفاع است
خطاهای مثبت کاذب، تعداد ban، خطای action، فضای دیسک و چرخش لاگ را پیگیری کنید. آزمون reboot، reload مدیر فایروال و اثر واقعی روی بسته فقط در شبکهٔ ایزولهٔ مجاز با IP موقت انجام شود؛ شمارندهٔ status این موارد را ثابت نمیکند. گمشدن لاگ، ساعت اشتباه یا تأخیر نوشتن میتواند تشخیص را مختل کند. حملهٔ توزیعشده از IP ban عبور میکند و کاربران پشت NAT ممکن است جمعی آسیب ببینند. MFA، محدودسازی وابسته به حساب، رمز امن، patch و rate limit یا WAF درست همچنان لازماند. Fail2ban جلوی DDoS حجمی بالادست را نمیگیرد. دسترسی و مدت نگهداری لاگ و مدارک آزمایش را محدود کنید.
مرز شواهد این راهنما
مسیرهای سیستمعامل بر پایهٔ مستنداتاند؛ نصب کامل پنج توزیع ادعا نمیشود. الگوی دقیق، نمونههای مثبت و منفی IPv4/IPv6 و daemon جدا با action ثبت متنی بررسی میشوند. این شواهد مربوط به parser و تصمیم محلیاند؛ ban کاربر واقعی، حفاظت اینترنتی، اجرای CDN، boot سرویس، همزیستی همهٔ مدیرهای فایروال یا پوشش حسابها را ثابت نمیکنند. مقادیر سفارشی خواننده آزموده نشدهاند. تصاویر DEMO صحنهٔ آموزشی تولیدشدهاند و عکس کارکنان، تأسیسات یا اسکرینشات آزمون نیستند.
پشتوانهٔ این آموزش
منابع رسمی
وضعیت بررسی هر محیط بالای صفحه مشخص است؛ بررسی مستندات به معنی اجرای عملی همهٔ نسخهها نیست.
ادامهٔ مسیر