caddy-waf: فایروال برنامهی وب برای Caddy
خلاصهٔ کاملتر
caddy-waf یه میانافزار HTTP هست که بهعنوان یه ماژول تکی با شناسهی http.handlers.waf تو Caddy ثبت میشه. کارش اینه که درخواستها و پاسخها رو تو چهار فاز مشخص بازرسی کنه: هدر و بررسیهای پیش از درخواست (فاز ۱)، بدنهی درخواست (فاز ۲)، هدر پاسخ (فاز ۳) و بدنهی پاسخ (فاز ۴). میشه هم از طریق Caddyfile و هم مستقیم با JSON پیکربندیش کرد.
هستهی کار یه موتور قانون رجکسه که روی پکیج regexp خود Go (با الگوریتم RE2) سواره و ضمانت زمان خطی میده، یعنی خبری از بکترکینگ فاجعهبار نیست. هر قانون یه score داره که به مجموع امتیاز اون درخواست اضافه میشه و همینکه این مجموع به anomaly_threshold رسید، درخواست بلاک میشه. هر قانون هم یه mode داره: block درخواست رو قطع میکنه و log فقط ثبتش میکنه و میذاره رد بشه.
علاوه بر قانونها، این WAF چند لایهی مسدودسازی دیگه هم داره. لیست سیاه IP از رنجهای CIDR پشتیبانی میکنه و تو یه prefix trie نگهداری میشه، لیست سیاه DNS تطبیق دقیق میزبان میده، و با دیتابیسهای GeoLite2 مکسمایند میشه بر اساس کشور و ASN بلاک کرد. یه بهروزرسانی دورهای هم لیست گرههای خروجی Tor رو میگیره. محدودیت نرخ بهصورت پنجرهی لغزان و بهازای هر IP کار میکنه و اختیاری میشه با رجکس به مسیر خاص محدودش کرد.
یه پیکربندی حداقلی تو Caddyfile اینشکلیه؛ کافیه بلاک waf رو با مسیر متریک و فایلهای قانون و لیست سیاه بهش بدی:
waf {
metrics_endpoint /waf_metrics
rule_file rules.json
ip_blacklist_file ip_blacklist.txt
dns_blacklist_file dns_blacklist.txt
}یه اندپوینت متریک JSON هم رو همون مسیری که تنظیم کردی سرو میشه.
نویسندهی پروژه چند نکتهی مهندسی رو هم برجسته میکنه. شمارندهی برخورد هر قانون با atomic.Int64 بدون قفل نگهداری میشه، بدنهی درخواست با io.LimitReader و سقف پیشفرض ۱۰ مگابایت خونده میشه و بعد با io.MultiReader بازسازی میشه تا هندلرهای بعدی هنوز کل بدنه رو ببینن. یه مدار شکن هم برای GeoIP هست که با geoip_fail_open تعیین میکنی موقع خطای لوکاپ، درخواست بلاک بشه یا رد بشه. هاتریلود فایلهای قانون و لیست سیاه هم با fsnotify انجام میشه.
برای ساخت، روش پیشنهادی استفاده از xcaddy هست که Caddy رو همراه ماژول waf بیلد میکنه؛ نکته اینه که این ماژول تو رجیستری رسمی پکیجهای Caddy ثبت نشده، پس caddy add-package براش کار نمیکنه و باید خودت بیلدش کنی. پروژه با زبون Go نوشته شده، به Go نسخهی 1.25 و Caddy نسخهی 2.11 به بالا نیاز داره و زیر لایسنس AGPL-3.0 منتشر شده.
نکات کلیدی:
- caddy-waf یه فایروال برنامهی وب متنباز برای سرور Caddy نوشتهشده با Go هست
- بازرسی در چهار فاز روی هدر و بدنهی درخواست و پاسخ، همراه با امتیازدهی ناهنجاری و آستانهی بلاک
- موتور رجکس RE2 با ضمانت زمان خطی، بدون خطر بکترکینگ فاجعهبار
- لیست سیاه IP/DNS، بلاک کشور و ASN با MaxMind، بلاک Tor و محدودیت نرخ بهازای IP
- ماژول تو رجیستری رسمی Caddy نیست، پس باید با xcaddy خودت بیلدش کنی




