انتقل إلى المحتوى
العودة إلى المقالات

~/writing / من واقع التجربة

  • Coolify
  • Fail2Ban
  • SSH
  • Traefik
  • أمن الخوادم

حماية خادم Coolify باستخدام Fail2Ban وتأمين SSH ومواقع Traefik

Mustafa Ramx pixel avatarبقلم Mustafa Ramx15 يونيو 20255 دقائق للقراءةآخر تحديث 9 نوفمبر 2025
صورة المقال حماية خادم Coolify باستخدام Fail2Ban وتأمين SSH ومواقع Traefik
محتويات المقال5 أقسام
  1. لماذا Fail2Ban؟
  2. تثبيت Fail2Ban على Coolify وUbuntu
  3. حماية مواقع Coolify عبر سجلات Traefik
  4. تمرير حظر SSH إلى Traefik middleware
  5. الخلاصة: Fail2Ban أم CrowdSec؟

تمنحك استضافة 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 داخل إعداد Docker Compose الذي يديره Coolify

يسجل 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.

إعداد Traefik الذي يديره Coolify مع خيارات إضافة Fail2Ban

بعد تفعيل الإضافة، أنشئ 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"

إعداد middleware لإضافة Fail2Ban داخل ملف fail2ban.yml

مزامنة عناوين 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.

إذا أفادك هذا الدليل، يمكنك دعمي بفنجان قهوة. كل مساهمة تساعدني على مواصلة كتابة هذه الشروحات — وتُبقي ذهني يقظاً 😅

// شارك المقال

شارك على XLinkedIn