
مشروع مخصص لمكافحة هجمات حجب الخدمة من الطبقة 7 (Layer 7 DDoS) باستخدام إثبات العمل (proof of work)، مع جدار حماية للتطبيقات (WAF) ووحدة تحكم إضافية. مكتمل بمجموعة كاملة من الميزات ومعبأ في حاويات (containerized) للنشر السريع وخفيف الوزن.
PoW Shield يوفر حماية من هجمات رفض الخدمة الموزعة (DDoS) على طبقة التطبيق (OSI) من خلال العمل كبروكسي يستخدم إثبات العمل بين الخدمة الخلفية والمستخدم النهائي. يهدف هذا المشروع إلى تقديم بديل لطرق مكافحة DDoS العامة مثل ReCaptcha من Google التي كانت دائمًا مصدر إزعاج. الوصول إلى خدمة ويب محمية بواسطة PoW Shield أصبح أسهل من أي وقت مضى، فقط اذهب إلى الرابط، وسيقوم متصفحك بالتحقق تلقائيًا نيابة عنك.
يهدف PoW Shield إلى تقديم الخدمات التالية مجمعة في تطبيق ويب واحد / صورة Docker:
(جديد) مقال على LinkedIn
مدعوم عبر وحدة تحكم PoW Phalanx:
تنفيذ بديل بلغة Go PoW-Shield-Go (قيد التطوير) لأغراض اختبار الإجهاد والإصدار الإنتاجي المحسن في المستقبل.
ببساطة، يعمل PoW Shield كبروكسي أمام تطبيق/خدمة الويب الفعلية. يقوم بإجراء التحقق عبر إثبات العمل ويسمح فقط بمرور الزيارات الموثقة إلى الخادم الفعلي. البروكسي سهل التثبيت وقادر على حماية التطبيقات منخفضة الأمان باستخدام WAF.
هذا ما يحدث خلف الكواليس عندما يتصفح المستخدم خدمة ويب محمية بواسطة PoW Shield:
يمكنك تكوين PoW Shield عبر الطرق التالية.
| المتغير | النوع | الافتراضي | الوصف |
|---|---|---|---|
| PORT | عام | 3000 | المنفذ الذي يستمع إليه PoW Shield |
| SESSION_KEY | عام | المفتاح السري لتوقيع الكوكيز، استخدم مفتاحًا فريدًا لأسباب أمنية، وإلا يمكن لأي شخص تزوير الكوكيز الموقعة الخاصة بك | |
| BACKEND_URL | عام | موقع توجيه الزيارات الموثقة إليه، يتم قبول كل من IP والروابط (يقبل protocol://url(:port) أو protocol://ip(:port)) | |
| DATABASE_HOST | Redis | 127.0.0.1 | مضيف خدمة redis |
| DATABASE_PORT | Redis | 6379 | منفذ خدمة redis |
| DATABASE_PASSWORD | Redis | null | كلمة مرور خدمة redis |
| POW | إثبات العمل | on | تشغيل/إيقاف وظيفة إثبات العمل (إذا لم يتم إيقافها مؤقتًا، فلماذا استخدام هذا المشروع على الإطلاق؟) |
| NONCE_VALIDITY | إثبات العمل | 60000 | يحدد الحد الأقصى بالثواني التي يجب فيها إرسال nonce إلى الخادم بعد التوليد (يستخدم لفرض تغيير الصعوبة وتصفية nonces القديمة) |
| DIFFICULTY | إثبات العمل | 13 | صعوبة المشكلة، عدد البتات الصفرية الرائدة في التجزئة المنتجة (0:سهل جدًا ~ 256:مستحيل، 13 (افتراضي) يستغرق حوالي 5 ثوانٍ لحسابه في المتصفح) |
| RATE_LIMIT | تحديد المعدل | on | تشغيل/إيقاف وظيفة تحديد المعدل |
| RATE_LIMIT_SAMPLE_MINUTES | تحديد المعدل | 60 | يحدد عدد الدقائق حتى إعادة تعيين الإحصائيات للجلسة/IP |
| RATE_LIMIT_SESSION_THRESHOLD | تحديد المعدل | 100 | عدد الطلبات التي يمكن أن ترسلها جلسة واحدة حتى تؤدي إلى إلغاء الرمز |
| RATE_LIMIT_BAN_IP | تحديد المعدل | on | تشغيل/إيقاف وظيفة حظر IP |
| RATE_LIMIT_IP_THRESHOLD | تحديد المعدل | 500 | عدد الطلبات التي يمكن أن ترسلها جلسة واحدة حتى تؤدي إلى حظر IP |
| RATE_LIMIT_BAN_MINUTES | تحديد المعدل | 15 | عدد الدقائق التي يستمر فيها حظر IP |
| WAF | WAF | on | تشغيل/إيقاف وظيفة WAF |
| WAF_URL_EXCLUDE_RULES | WAF | استبعاد القواعد عند فحص رابط الطلب، استخدم ',' لفصل أرقام القواعد، استخدم '-' لتحديد نطاق (مثال: 1,2-4,5,7-10) | |
| WAF_HEADER_EXCLUDE_RULES | WAF |
# استنساخ المستودع
git clone https://github.com/RuiSiang/PoW-Shield.git
# تثبيت التبعيات
npm install
# تكوين الإعدادات
cp -n .env.example .env
# تعديل ملف .env
nano .env
# تجميع الكود
npm run build
#############################################
# التشغيل مع قاعدة البيانات (redis)، موصى به وأسرع #
# قم بتثبيت redis أولاً #
# sudo apt-get install redis-server #
#############################################
npm start
#############################################
#############################################
# التشغيل بدون قاعدة بيانات (mock redis) #
#############################################
npm run start:standalone # لينكس
npm run start:standalone-win # ويندوز
#############################################
# اختبار الوظائف (اختياري)
npm test
####################################################
# تشغيل Docker مع قاعدة البيانات (redis)، موصى به وأسرع #
####################################################
docker run -p 3000:3000 -e BACKEND_URL="http://example.com" -d ruisiang/pow-shield
####################################################
####################################################
# تشغيل Docker بدون قاعدة بيانات (mock redis) #
####################################################
docker run -p 3000:3000 -e BACKEND_URL="http://example.com" -e NODE_ENV="standalone" -d ruisiang/pow-shield
####################################################
####################################################
# Docker Compose #
####################################################
# نسخ ملف docker-compose.example.yaml
cp -n docker-compose.example.yaml docker-compose.yaml
# تعديل ملف docker-compose.yaml
nano docker-compose.yaml
# بدء الحاوية
docker-compose -f docker-compose.yaml up
####################################################
ملاحظة: هذا يعمل فقط على الإصدار غير المحتوي (non-containerized) من PoW Shield، وقد يعاني نظامك من عدم الاستقرار أثناء تشغيل الاختبار.
# بدء اختبار الإجهاد
npm run stress
# إذا قمت بتغيير متغير PORT في ملف .env، يجب أيضًا تغيير المتغير target في سكريبت اختبار الإجهاد
nano scripts/stress.sh
الاختبارات التالية أجريت على خيط واحد من معالج i7-10870H CPU مع فترة 60 ثانية لكل معامل متزامن.
| الاتصالات المتزامنة | متوسط زمن الوصول | معدل الخطأ | الطلبات/الثانية |
|---|---|---|---|
| 64 | 15.3ms | 0.0000 | 4188 |
| 128 | 30.2ms | 0.0000 | 4229 |
| 256 | 60.4ms | 0.0000 | 4235 |
| 512 | 122.6ms | 0.0142 | 4166 |
| 1024 | 261.7ms | 0.1766 | 3894 |
| 2048 | 1966.5ms | 0.4979 | 1027 |
| 4096 | 4685ms | 0.7179 | 838 |
| الاتصالات المتزامنة | متوسط زمن الوصول | معدل الخطأ | الطلبات/الثانية |
|---|---|---|---|
| 64 | 15.6ms | N/A | 4094 |
| 128 | 31.5ms | N/A | 4058 |
| 256 | 61.5ms | N/A | 4159 |
| 512 | 129.5ms | N/A | 3945 |
| 1024 | 264.4ms | N/A | 3858 |
| 2048 | 592.1ms | N/A | 3407 |
| 4096 | 1212.6ms | N/A | 3322 |
من العينة أعلاه، نرى أن تقدير الحمل الأقصى المناسب لـ PoW Shield هو حوالي 512 اتصالًا متزامنًا. تتدهور معدلات الخطأ وأوقات الاستجابة بعد ذلك فوق الحد المقبول. لذلك في بيئة موازنة الأحمال على الجهاز (مثيل واحد من PoW Shield على كل من أنواته الثمانية)، يجب أن يكون قادرًا على التعامل مع حد أقصى يبلغ حوالي 4096 اتصالًا متزامنًا (عملاء) بمعدل طلبات إجمالي يبلغ 32 ألف طلب/الثانية.
MIT
| 14,33,80,96,100 |
| استبعاد القواعد عند فحص ترويسة الطلب، استخدم ',' لفصل أرقام القواعد، استخدم '-' لتحديد نطاق (مثال: 1,2-4,5,7-10) |
| WAF_BODY_EXCLUDE_RULES | WAF | استبعاد القواعد عند فحص جسم الطلب، استخدم ',' لفصل أرقام القواعد، استخدم '-' لتحديد نطاق (مثال: 1,2-4,5,7-10) |
| SSL | SSL | off | تشغيل/إيقاف وظيفة SSL |
| SSL_CERT_PATH | SSL | tests/ssl/mock-cert.pem | المسار إلى شهادة SSL |
| SSL_KEY_PATH | SSL | tests/ssl/mock-key.pem | المسار إلى مفتاح SSL |
| SOCKET | مقبس | off | تشغيل/إيقاف وظيفة المقبس |
| SOCKET_URL | مقبس | موقع وحدة تحكم PoW Phalanx، يتم قبول كل من IP والروابط (يقبل protocol://url:port أو protocol://ip:port) |
| SOCKET_TOKEN | مقبس | رمز الاشتراك لوحدة تحكم PoW Phalanx |