صحنهٔ آموزشی ساختگی آکادمی ویونیکس با اپراتور، لپ‌تاپ و نمودار نمایشی Nginx و CrowdSec.

WIUNIX ACADEMY

آموزش CrowdSec و Nginx؛ لاگ معتبر، LAPI خصوصی و مسدودسازی قابل‌بازگشت

آزمایشگاه مستقل CrowdSec و bouncer مبتنی بر Lua بسازید؛ پاسخ مسدودسازی، رفع مسدودی، انقضا، هدر جعلی و رفتار قطع API را بررسی کنید.

متوسط55 دقیقه مطالعهبه‌روزرسانی
محیطت را انتخاب کن

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

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

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

Ubuntu26.10بررسی‌شده با مستندات رسمی ·

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

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

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

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

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

از اینجا شروع کن

در پایان چه چیزی خواهی داشت؟

زنجیرهٔ تصمیم محلی تا پاسخ HTTP را بررسی کنید.

01Nginx127.0.0.1:18080 → access log
02Engine → LAPI/srv/academy-crowdsec · 127.0.0.1:18081
03Lua bounceracademy_nginx · ban/allow 127.0.0.2
سیستم‌عامل‌ها و نسخه‌های پوشش‌داده‌شده

مسیر سیستم‌عامل‌ها مستند است؛ آزمون ایزوله جای پذیرش تولید را نمی‌گیرد.

قبل از شروع

  • ماشین تازهٔ amd64، دسترسی sudo و ماژول Lua سازگار.
  • کنسول بازیابی مستقل؛ بدون ترافیک تولید.

تشخیص و مسدودسازی را جداگانه بسنجید

در این آزمایشگاه، موتور CrowdSec لاگ Nginx را می‌خواند، تصمیم‌ها در Local API نگهداری می‌شوند و bouncer مبتنی بر Lua درخواست را بررسی می‌کند. همه‌چیز در مسیر اختصاصی /srv/academy-crowdsec و روی loopback اجرا می‌شود تا پیش از انتقال به محیط عملیاتی، مرز هر جزء مشخص باشد.

این آموزش برای ادمین لینوکس است و پس از آماده‌سازی حدود۵۵دقیقه زمان می‌برد. خوانده‌شدن لاگ، تشخیص سناریو و پاسخ مسدودسازی سه نتیجهٔ متفاوت‌اند. هر سه را باید بررسی کرد؛ صرف نصب موتور به معنی حفاظت Nginx نیست. احراز هویت، محدودسازی درخواست و وصله‌های امنیتی همچنان لازم‌اند.

مقدار عمومی را تغییر دهید، اعمال کنید و بعد کپی بگیرید

فرم تنظیمات را باز کنید، نمونه‌های عمومی را تغییر دهید و «اعمال» را بزنید؛ سپس از کادر دستور کپی بگیرید. تا پیش از اعمال یا هنگام نامعتبر بودن مقدار، کپی غیرفعال است. کلید API، گذرواژه، کلید خصوصی و لاگ شخصی جایی در این فرم ندارند. کلید bouncer مستقیماً در فایل خصوصی ساخته می‌شود.

مقدارها و پیشرفت سفارشی در sessionStorage همین تب، زبان، مقاله و سیستم‌عامل می‌مانند؛ پیشرفت حالت پیش‌فرض در localStorage است. بازنشانی، نمونه‌های بررسی‌شده را برمی‌گرداند. شخصی‌سازی متن آزمون اجرا نمی‌کند. 127.0.0.2 باید روی loopback و بیرون از محدودهٔ مدیریت 127.0.0.1/32 باشد؛ بررسی اولیه این رابطه را کنترل می‌کند.

ماشین خالی amd64 و بستهٔ Lua سازگار

یک ماشین مجازی تازه با sudo و معماری x86_64 آماده کنید. فایل انتشار این راهنما باینری Linux amd64 دارد. مسیر پیش‌فرض Ubuntu26.10 است؛ نسخه‌های LTS و Debian هم مسیر مستند دارند. Nginx توزیع و ماژول Lua باید از مخزن سازگار باشند؛ ترکیب باینری nginx.org با ماژول توزیع می‌تواند به خطای ABI برسد. OpenResty، Lua داخلی دارد اما مسیر و بسته‌بندی متفاوت آن در این دستورالعمل پوشش داده نمی‌شود.

فضای دیسک، کاندید بسته‌ها و آزادبودن پورت‌ها را بررسی کنید. نصب بسته ممکن است Nginx پیش‌فرض ماشین آزمایشی را روشن کند؛ نمونهٔ ما فقط تنظیمات اختصاصی و پورت loopback 18080 را می‌خواند. LAPI روی پورت محلی 18081 است. این آزمایشگاه فایروال، سرویس عمومی، ثبت Console یا CAPI، کپچا و AppSec را فعال نمی‌کند.

01

قدم بعدی

وابستگی‌های Nginx و Lua را نصب کنید

این دستور فقط برای ماشین خالی آزمایش است. پیش از تأیید نصب، نسخهٔ کاندید و وابستگی ماژول Lua را ببینید؛ نبود بستهٔ سازگار را با مخلوط‌کردن مخازن جبران نکنید. وجود بسته به‌تنهایی تعهد پشتیبانی CrowdSec نیست.

bash

ترمینال ماشین آزمایشگاهی مستقل

set -eu
. /etc/os-release
test "$ID" = 'ubuntu'
test "$VERSION_CODENAME" = 'stonking'
sudo apt-get update
apt-cache policy nginx libnginx-mod-http-lua lua-cjson luarocks
sudo apt-get install --no-install-recommends nginx libnginx-mod-http-lua lua5.1 lua-cjson luarocks python3 python3-yaml curl ca-certificates nano
nginx -v
dpkg-query -W nginx libnginx-mod-http-lua lua-cjson luarocks python3
از کجا بدانم درست انجام شد؟

بسته‌های Nginx، ماژول Lua، Python/YAML و LuaRocks نصب و نسخه‌های واقعی چاپ می‌شوند.

02

قدم بعدی

معماری، پورت و جدایی IP آزمون را بررسی کنید

آدرس 127.0.0.2 باید در127/8 و متعلق به همین ماشین باشد. 127.0.0.1/32 را برای مدیریت مورداعتماد بگذارید؛ تمام بازدیدکننده‌ها را در آن قرار ندهید.

bash

ترمینال ماشین آزمایشگاهی مستقل

set -eu
test "$(uname -m)" = x86_64
sudo python3 - <<'PY'
import socket,ipaddress
assert ipaddress.ip_address('127.0.0.2') in ipaddress.ip_network('127.0.0.0/8'), 'Test source must be loopback'
assert ipaddress.ip_address('127.0.0.2') not in ipaddress.ip_network('127.0.0.1/32'), 'Test source is allowlisted'
for port in (18080,18081,18082):
    with socket.socket() as s: s.bind(('127.0.0.1',port))
print('amd64, separate free ports and test source: OK')
PY
از کجا بدانم درست انجام شد؟

پیام OK چاپ می‌شود؛ تداخل پورت یا قرارگرفتن IP آزمون در فهرست مجاز اجرای مرحله را متوقف می‌کند.

03

قدم بعدی

مسیر اختصاصی را بدون بازنویسی رزرو کنید

والد مسیر باید از قبل وجود داشته باشد و فقط root روی آن اختیار نوشتن داشته باشد. مسیر موجود، پیوند نمادین و والد قابل‌نوشتن برای دیگران رد می‌شود. برای آزمایش تازه یک ریشهٔ جدید انتخاب کنید.

bash

ترمینال ماشین آزمایشگاهی مستقل

sudo python3 - <<'PY'
import os,stat,grp
from pathlib import Path
r=Path('/srv/academy-crowdsec')
assert r.is_absolute() and str(r) not in ('/','/srv','/opt','/etc','/tmp')
for p in reversed(r.parents):
    m=p.lstat()
    assert stat.S_ISDIR(m.st_mode) and m.st_uid==0 and not m.st_mode & 0o022, 'Unsafe parent'
r.mkdir(mode=0o750)
os.chown(r,0,grp.getgrnam('www-data').gr_gid)
for name in ('downloads','config','data','hub','logs','run','www','notifications','plugins'):
    p=r/name;p.mkdir(mode=0o700 if name in ('config','data') else 0o755)
(r/'www'/'index.html').write_text('academy-ok\n',encoding='utf-8')
for name in ('engine.yaml','acquis.yaml','profiles.yaml','simulation.yaml','nginx.conf'):
    fd=os.open(r/'config'/name,os.O_WRONLY|os.O_CREAT|os.O_EXCL|os.O_NOFOLLOW,0o600);os.close(fd)
print('Exclusive lab root and empty editor files created')
PY
از کجا بدانم درست انجام شد؟

مسیر جدید و فایل‌های خالی آماده‌اند؛ اجرای دوباره با خطا متوقف می‌شود.

همهٔ آموزش‌های آکادمی ↗