تمنحك استضافة Coolify ذاتياً على VPS تحكماً كاملاً وقيوداً أقل مقارنةً بـ Vercel أو Netlify، لكن هذا التحكم يأتي معه قدر من المسؤولية. من أكبر المخاطر ترك الخادم مكشوفاً لهجمات القوة الغاشمة وفحص المنافذ والروبوتات التي تكرر طلبات مثل /wp-login.php أو لوحات الإدارة.
في هذا الدليل أشرح كيف أمّنت خادم Coolify باستخدام Fail2Ban، مع بقاء Traefik مسؤولاً عن حركة reverse proxy.
لماذا Fail2Ban؟
يراقب Fail2Ban السجلات بحثاً عن أنماط مريبة، مثل أخطاء 404 ومحاولات SSH الفاشلة، ثم يحظر عناوين IP المخالفة بإضافة قواعد إلى iptables أو nftables.
تثبيت Fail2Ban على Coolify وUbuntu
تثبيت Fail2Ban
sudo apt update
sudo apt install fail2ban -y
تأكد من عمل الخدمة على خادم Coolify:
sudo systemctl status fail2ban
يجب أن تظهر الحالة: Active: active (running).
إعداد Fail2Ban
أنشئ ملف إعداد محلياً لتجاوز القيم الافتراضية:
sudo cp /etc/fail2ban/jail.conf /etc/fail2ban/jail.local
sudo nano /etc/fail2ban/jail.local
اضبط القيم التالية في قسم [DEFAULT]:
bantime = 1d
findtime = 10m
maxretry = 5
تحدد هذه القيم مدة حظر العنوان، والفترة التي تُحتسب خلالها المحاولات الفاشلة، وعدد المحاولات المسموح بها.
حماية SSH من هجمات القوة الغاشمة
تأكد داخل jail.local من تفعيل قسم [sshd]:
[sshd]
enabled = true
port = ssh
logpath = %(sshd_log)s
backend = %(sshd_backend)s
يساعد هذا الإعداد على حماية SSH من محاولات تسجيل الدخول المتكررة.
إعادة تشغيل Fail2Ban
طبّق التغييرات:
sudo systemctl restart fail2ban
تحقق من تفعيل sshd jail:
sudo fail2ban-client status
يفترض أن تظهر نتيجة مشابهة:
Status
|- Number of jail: 1
`- Jail list: sshd
ولعرض عناوين IP المحظورة ومسار السجل وMax retry وfind time:
sudo fail2ban-client status sshd
أصبح الخادم الآن محمياً من هجمات SSH بالقوة الغاشمة، وبدأ Fail2Ban مراقبة محاولات الدخول مباشرةً. لكن حماية طبقة الويب تحتاج أيضاً إلى تمكين سجل وصول HTTP في Traefik حتى يستطيع Fail2Ban مراقبة الحركة المريبة واتخاذ إجراء ضدها.
حماية مواقع Coolify عبر سجلات Traefik
أضف الخيارات التالية إلى إعداد Traefik لتفعيل سجلات الوصول:
- '--accesslog=true'
- '--accesslog.filepath=/traefik/access.log'
- '--accesslog.format=json'
ثم أعد تشغيل Traefik.

يسجل Traefik الطلبات بصيغة JSON منظمة في /data/coolify/proxy/access.log، ويظهر المسار داخل الحاوية باسم /traefik/access.log.
تحقق من السجل:
tail -f /data/coolify/proxy/access.log
إنشاء مرشح Fail2Ban لسجلات Traefik
أنشئ الملف /etc/fail2ban/filter.d/traefik-http.conf:
[Definition]
failregex = .*"ClientHost":"<HOST>".*"OriginStatus":(404|403|401|429|502|503|504)
ignoreregex =
إنشاء إعداد jail لـTraefik
أنشئ أو عدّل /etc/fail2ban/jail.d/traefik-http.conf:
[traefik-http]
enabled = true
backend = auto
filter = traefik-http
logpath = /data/coolify/proxy/access.log
maxretry = 5
findtime = 60
bantime = 3600
banaction = nftables
أعد تشغيل Fail2Ban وتحقق من الحالة:
sudo systemctl restart fail2ban
sudo fail2ban-client status traefik-http
لعرض سجل Fail2Ban:
sudo cat /var/log/fail2ban.log
يستخدم Fail2Ban بعد ذلك إجراء nftables الافتراضي، الذي:
- ينشئ set داخل
inet f2b-table. - يضيف القواعد إلى
inet filter INPUT. - يسقط حركة عناوين IP الموجودة في المجموعة.
اعرض قواعد الحظر:
sudo nft list ruleset | grep reject
أو اعرض مجموعات nftables الفعلية:
sudo nft list set inet f2b-table addr-set-traefik-http
sudo nft list set inet f2b-table addr6-set-traefik-http
بهذا أصبح Coolify يحظر عناوين IP المرتبطة بتهديدات HTTP وHTTPS مباشرةً باستخدام Fail2Ban وnftables. ولتوسيع الحماية أكثر، يمكن تمرير العناوين التي يحظرها SSH إلى طبقة Traefik أيضاً.
تمرير حظر SSH إلى Traefik middleware
يجيد Fail2Ban حظر هجمات القوة الغاشمة على خدمات مثل SSH. لكن ماذا لو أردت منع العناوين نفسها من الوصول إلى مواقعك عبر Traefik؟ هذا ممكن، وهو ما طبقته في إعداد Coolify.
استخدام Fail2Ban Traefik plugin
استخدمت إضافة Traefik github.com/tomMoulard/fail2ban، التي تتيح حظر العناوين من داخل Traefik باستخدام middleware. تتوفر معلومات الإضافة هنا:
https://plugins.traefik.io/plugins/628c9ebcffc0cd18356a979f/fail2-ban
أضف السطرين التاليين إلى أوامر Docker Compose الخاصة بـTraefik والتي يديرها Coolify:
- '--experimental.plugins.fail2ban.modulename=github.com/tomMoulard/fail2ban'
- '--experimental.plugins.fail2ban.version=v0.8.3'
ثم فعّل middleware على مسارَي HTTP وHTTPS:
labels:
- traefik.http.routers.traefik.middlewares=fail2ban@file
- traefik.https.routers.traefik.middlewares=fail2ban@file
بهذا تُحظر أيضاً محاولات الوصول إلى /admin أو /wp-login.php عبر HTTPS.

بعد تفعيل الإضافة، أنشئ middleware يقرأ العناوين الممنوعة من ملف باسم fail2ban.yml:
http:
middlewares:
fail2ban:
plugin:
fail2ban:
logPath: /traefik/access.log
maxretry: 5
findtime: 60
bantime: 600
statuscodes:
- 401
- 403
- 404
- 429
- 500
- 502
- 503
- 504
denylist:
files:
- "/traefik/denylist.txt"

مزامنة عناوين Fail2Ban المحظورة مع Traefik
أنشئ cronjob أو script صغيراً لتصدير العناوين المحظورة حالياً من sshd jail:
fail2ban-client status sshd | grep 'Banned IP list' | cut -d ':' -f2 | tr ',' '\n' > /data/coolify/proxy/denylist.txt
تقرأ إضافة Traefik العناوين الجديدة من الملف وتطبقها مباشرةً. يصبح Fail2Ban بذلك المصدر الموحد للحظر، بينما تُطبق الحماية على SSH وTraefik معاً.
هل تستخدم Cloudflare أو Cloudflare Tunnel؟
إذا كنت تستخدم Cloudflare أو Cloudflared Tunnels، يجب أن يثق Traefik في forwarded headers مثل X-Forwarded-For حتى يسجل عنوان العميل الحقيقي خلف الـ proxy أو tunnel. وإلا فقد يحظر Fail2Ban العنوان 127.0.0.1 أو النفق نفسه بدلاً من المهاجم.
أضف الخيارات التالية إلى إعداد Traefik:
- '--entrypoints.http.forwardedHeaders.trustedIPs=10.0.0.0/8'
- '--entrypoints.https.forwardedHeaders.trustedIPs=10.0.0.0/8'
- '--entrypoints.http.forwardedHeaders.insecure=true'
- '--entrypoints.https.forwardedHeaders.insecure=true'
تتيح هذه الخيارات لـTraefik قراءة عنوان العميل الحقيقي عندما تأتي الحركة من reverse proxy.
إذا لم تستخدم Cloudflare أوأي proxy أمام الخادم، يمكنك حذف هذه الخيارات لتعزيز الأمان.
تحديث نوفمبر 2025: عُدّل مثال
failregexليتطابق مع أرقام الحالة مثل"OriginStatus":404بدلاً من النصوص المحاطة بعلامات اقتباس، ما يحسن دقة المطابقة.
الخلاصة: Fail2Ban أم CrowdSec؟
يستطيع Fail2Ban حماية SSH وHTTP في إعداد Coolify وTraefik، لكنه يحتاج إلى scripting إضافي لحماية حركة Docker كاملة. يعمل، لكنه لم يُصمم أساساً لمنصات حديثة مثل Coolify.
أما CrowdSec فيوفر:
- Traefik bouncer مخصصاً من دون scripts مخصصة.
- تمرير قرارات الحظر بين الخدمات مباشرةً.
- عملاً خلف Cloudflare وCloudflared tunnels.
- شبكة عالمية لمعلومات التهديدات.
Fail2Ban محلي وتقليدي ويعتمد على عناوين IP، ويحتاج إلى عمل إضافي مع Cloudflare. أما CrowdSec فتعاوني وأقرب إلى بنية الخدمات الحديثة.
إذا أردت حماية أبسط لمواقع Traefik، راجع حماية مواقع Coolify باستخدام CrowdSec وTraefik. ولحماية الخادم والمواقع معاً، استخدم دليل CrowdSec وnftables وTraefik.
إذا أفادك هذا الدليل، يمكنك دعمي بفنجان قهوة. كل مساهمة تساعدني على مواصلة كتابة هذه الشروحات — وتُبقي ذهني يقظاً 😅
