← شروع آموزش

WIUNIX ACADEMY

محافظت از Nginx با Fail2ban؛ لاگ معتبر، مسدودسازی محدود و بازیابی

صفحهٔ 3 از 6؛ مراحل قبلی و پیش‌نیازها را پیش از ادامه مرور کن.

آموزش متناسب با محیط تو

کجا اجرا می‌کنی؟

سیستم‌عامل و نسخه را انتخاب کن تا مراحل، دستورها و راه‌حل‌ها برای همان محیط نمایش داده شوند.

Debian 12 LTSبررسی‌شده با مستندات رسمی ·

آموزش متناسب با مقادیر تو

تنظیمات این آموزش

مقادیر نمونه را برای محیط خودت تنظیم کن؛ متن و دستورهای مرتبط با هم تغییر می‌کنند. رمز، کلید خصوصی و توکن وارد نکن. مقادیر فقط در همین زبانه نگهداری می‌شوند و به سرور یا لینک اشتراک‌گذاری فرستاده نمی‌شوند. پیش از اجرا، DNS، گواهی‌ها و سیاست شبکهٔ واقعی را بررسی کن.

آی‌پی، دامنه یا پورت مثال‌ها با محیط تو فرق دارد؟ دکمهٔ زیر را باز کن، مقادیر را تغییر بده و «اعمال در آموزش» را بزن؛ سپس دستورهای به‌روز‌شده را کپی کن.

تنظیم مقادیر برای محیط من11 مقدار قابل‌تغییر
08

قدم بعدی

یک درخواست مجاز را پیش از هر مسدودسازی ببینید

از یک کلاینت آزمایشگاهی مجاز، URL موجود بخش محافظت‌شده را یک‌بار بدون رمز و با اعتبارسنجی عادی گواهی باز کنید. حملهٔ آزمایشی یا حساب شخص دیگری لازم نیست. Fail2ban هنوز masked است. در لاگ باید زمان ISO، نشانهٔ f2b، IP واقعی اتصال و 401 ببینید؛ درخواست احرازشده وضعیت عادی موفقیت را می‌نویسد. برای موفق جلوه‌دادن آزمون، گواهی TLS را دور نزنید یا دامنه را با IP خام عوض نکنید.

Bash

ترمینال Bash میزبان آزمایشگاهی اختصاصی

sudo tail -n 8 "/var/log/nginx/academy-auth.log"
از کجا بدانم درست انجام شد؟

IP ثبت‌شده متعلق به همان کلاینت مستقیم است و از هدر یا پراکسی نیامده است.

فیلتر اختصاصی را بسازید

فیلتر بسته با نام nginx-http-auth برای پیام‌های error log طراحی شده و parser این access log سفارشی نیست. نام اختصاصی به کار ببرید و فایل پیش‌فرض بسته را دست‌کاری نکنید. قالب لاگ و فیلتر باید همیشه با هم نگه‌داری شوند.

Bash

ترمینال Bash میزبان آزمایشگاهی اختصاصی

sudo test ! -e /etc/fail2ban/filter.d/academy-nginx-401.conf && sudo nano /etc/fail2ban/filter.d/academy-nginx-401.conf
09

قدم بعدی

IP و وضعیت را با الگوی مقید بخوانید

علامت درصد در فایل تنظیمات Fail2ban باید دوبار نوشته شود؛ خود لاگ درصد تکراری ندارد. پس از جداشدن تاریخ، الگو نشانهٔ f2b، آدرس IPv4 یا IPv6 و فقط 401 را می‌پذیرد. usedns=no در jail جلوی lookup نام را می‌گیرد. ابتدا و انتهای خط مقید شده‌اند تا متن اضافه و پاسخ غیر401 پذیرفته نشود. تطبیق موفق الگو، اثبات مسدودسازی در شبکه یا مصونیت از گم‌شدن لاگ نیست.

INI · /etc/fail2ban/filter.d/academy-nginx-401.conf

محتوای فایل؛ ویرایش روی میزبان آزمایشگاهی اختصاصی

[Definition]
datepattern = ^%%Y-%%m-%%dT%%H:%%M:%%S%%z
failregex = ^\s*f2b <HOST> 401\s*$
ignoreregex =
از کجا بدانم درست انجام شد؟

فیلتر جدید با تاریخ مشخص ساخته شده و هیچ هدر یا URL کاربر را برای استخراج IP نمی‌خواند.

10

قدم بعدی

نمونه‌های مثبت، منفی و IPv6 را بسنجید

این خط‌ها دادهٔ مصنوعی با IP رزروشدهٔ مستندات‌اند و ترافیک واقعی نیستند. باید پنج تطبیق، سه عدم تطبیق و هشت تاریخ شناسایی‌شده ببینید. خط دارای IP اضافه باید رد شود. تاریخ ثابت برای آزمون parser مناسب است؛ آزمون پنجرهٔ زمانی زنده نیست. این داده‌ها را به لاگ واقعی Nginx اضافه نکنید.

Bash

ترمینال Bash میزبان آزمایشگاهی اختصاصی

set -e
sudo tee "/srv/academy-fail2ban-lab/fixture.log" >/dev/null <<'LOG'
2026-10-20T12:00:00+00:00 f2b 192.0.2.60 401
2026-10-20T12:00:01+00:00 f2b 192.0.2.60 401
2026-10-20T12:00:02+00:00 f2b 192.0.2.60 401
2026-10-20T12:00:03+00:00 f2b 2001:db8::60 401
2026-10-20T12:00:04+00:00 f2b 2001:db8::60 401
2026-10-20T12:00:05+00:00 f2b 192.0.2.61 200
2026-10-20T12:00:06+00:00 f2b 192.0.2.61 403
2026-10-20T12:00:07+00:00 f2b 192.0.2.61 401 injected 192.0.2.60
LOG
sudo fail2ban-regex "/srv/academy-fail2ban-lab/fixture.log" /etc/fail2ban/filter.d/academy-nginx-401.conf --usedns=no --print-all-matched --print-all-missed
خروجی نمونه
Lines: 8 lines, 0 ignored, 5 matched, 3 missed
Date template hits: 8
از کجا بدانم درست انجام شد؟

۵ خط تطبیق، ۳ خط رد و ۸ تاریخ شناسایی می‌شود؛ آدرس‌ها از فیلد درست خوانده شده‌اند.

backend فایل را با journald مخلوط نکنید

این jail فایل اختصاصی و بدون buffer را با polling می‌خواند؛ برای آن python-systemd یا pyinotify لازم نیست. چرخش معمول rename/reopen پشتیبانی می‌شود، ولی روی میزبان خود باید تداوم خواندن را بررسی کنید. backend=systemd ورودی journal را با journalmatch می‌خواند و logpath ندارد. اجرای Nginx زیر systemd باعث نمی‌شود access log خودکار وارد journal شود. برای مسیر journal، مجوز، نگه‌داری، rate limit و قالب واقعی MESSAGE را جدا بررسی کنید؛ backend را برای پنهان‌کردن فایل خالی عوض نکنید.

محیط مستقلی بدون action فایروال بسازید

daemon آزمایشی فقط فایل تنظیمات، socket، PID و لاگ جدید در پوشهٔ آزمایش دارد؛ jail یا credential دیگری کپی نمی‌شود. action تنها IP اعتبارسنجی‌شده را در فایل متنی ثبت می‌کند؛ nft، iptables، UFW، درخواست شبکه یا کنترل سرویس اجرا نمی‌شود. تغییر نام یک action واقعی به «test» چنین جداسازی‌ای ایجاد نمی‌کند.

Bash

ترمینال Bash میزبان آزمایشگاهی اختصاصی

set -e
sudo install -d -m 0700 "/srv/academy-fail2ban-lab/conf/filter.d" "/srv/academy-fail2ban-lab/conf/action.d"
sudo cp /etc/fail2ban/filter.d/academy-nginx-401.conf "/srv/academy-fail2ban-lab/conf/filter.d/"
sudo touch "/srv/academy-fail2ban-lab/events.log"
sudo nano "/srv/academy-fail2ban-lab/conf/fail2ban.conf"
همهٔ آموزش‌های آکادمی ↗