نظرًا لأن هذه تم تكوينها في Discourse، أنا متأكد من أن عناوين IP يتم حظرها بواسطة Discourse، وليس NGINX، لذلك ستظهر في سجلات NGINX. إنها Discourse التي تحظرها، وليس nginx. إذا كنت ترغب في حظرها حتى لا تظهر في سجلات NGINX، يمكنك حظرها باستخدام جدار الحماية الخاص بك.
شكرًا جاي، أنت على حق بشأن كيف سيظل يظهر في سجلات Nginx إذا تم حظره على مستوى التطبيق. ومع ذلك، فإن الحظر على مستوى التطبيق لا يفعل ما أتوقعه أيضًا. حاولت الاتصال عبر VPN ثم أضفت عنوان IP الخاص بي إلى قائمة “عناوين IP التي تم فحصها”، لكنه سمح لي بالتنقل في المنتدى. أعتقد أنه يجب تسميته “عناوين IP التي تم فحصها” وليس “عناوين IP المحظورة” لأنه ربما يمنع عناوين IP هذه فقط من تسجيل حساب؟
أحتاج إلى أن يقوم تطبيق Discourse برفض الوصول إلى الصفحات المطلوبة للطلبات الواردة من تلك العناوين، وخاصةً ألا يقوم بعرض تلك الصفحات، حيث أن كل هذه الطلبات تستهلك وحدة المعالجة المركزية.
هل ترى ديسكورس أنك قادم من أحد عناوين IP المحظورة إذا ذهبت للنظر في سجل المستخدم من /admin/users؟ (إذا كنت خلف وكيل مثل cloudflare، فقد ترى ديسكورس عنوان IP الخاص بالوكيل الخاص بك وليس عنوان IP الخاص بالمستخدم.)
نعم، عندما أتصل بشبكة الـ VPN ثم أنظر إلى آخر عنوان IP لحساب المستخدم الخاص بي في Discourse، يظهر عنوان IP الذي منحته لي شبكة الـ VPN. ومع ذلك، عندما أفتح نافذة متصفح متخفي وأحاول تسجيل حساب جديد، فإنها لا تسمح بذلك:
لا يُسمح بالتسجيلات الجديدة من عنوان IP الخاص بك.
لذلك، يبدو أن “عناوين IP التي تم فحصها” مخصصة للتسجيل فقط، وليس لمنع الوصول إلى موقع الويب تمامًا.
إذن، ما هي أسهل طريقة لرفض الطلبات من عنوان IP أو نطاق من عناوين IP؟ لقد وجدت هذا، ولكنه يبدو عكس ما أحتاجه. (قائمة بيضاء بدلاً من قائمة سوداء) والعبث بإعداد Nginx داخل الحاوية يبدو وكأنه حل غير احترافي تمامًا:
أعتقد أن القيام بذلك باستخدام UFW أو IPTABLES. هذا يزيل ويوقفها قبل أن يتدخل Discourse. أنا دائمًا ما أكون غامضًا وخائفًا من العبث بجدران الحماية خوفًا من أن أحبس نفسي، ولكن إذا استهدفت المنفذ 443 فقط فلن تكون في أي خطر.
هذا بالضبط ما أخشاه أيضًا. لكنني قمت بتمكينه على المضيف ومع ذلك فإنه لا يزال لا يحظر نطاق IP الإشكالي. يبدو أنه يحتاج إلى مجموعة معقدة من القواعد لجعله يطبق قواعد الرفض على حاويات Docker.
أوه. نعم. هذا صحيح تمامًا. انتهى بي الأمر بحظر الوصول من خوادم الويب المستندة إلى Docker الخاصة بي إلى قاعدة بيانات PostgreSQL المستندة إلى Docker (من المحتمل ألا تكون إحدى مشاكلك).
/var/discourse/launcher enter app
apt install nano
nano /etc/nginx/conf.d/discourse.conf
وفي كتلة server { أضف:
## 2025-10-27
deny 12.34.0.0/16;
ثم احفظ ونفذ:
nginx -t
service nginx reload
لا أفهم تمامًا سبب استمرار رؤيتي لطلبات من 12.34.x.x في سجل access.log الخاص بـ Nginx، ولكنه يبدو أنه يعمل لأن استخدام وحدة المعالجة المركزية عاد إلى طبيعته. عملية معقدة بشكل لا يصدق في رأيي، ولكنها جيدة بما فيه الكفاية في الوقت الحالي لإعادة الموقع إلى العمل.
أعتقد أن كلاهما اسم مستعار قديم تم ربطه الآن بأوامر systemd، لذا فإن systemctl restart nginx سيكون الأكثر ملاءمة. تعديل: يبدو أن systemctl لا يعمل داخل Docker. إليك بعض الشروحات حول الاختلافات:
يبدو أنها تستهدف بشكل أساسي الروابط الدائمة الآن (تم ترحيلها من منصة منتديات قديمة). هل هناك نوع من الثغرة الأمنية مع الروابط الدائمة تسمح لها بتجاوز قاعدة deny؟ لم أتحقق من production.log بعد.
بشكل عام، أود أن أقول إن الافتقار إلى واجهة مستخدم رسومية لفحص سجلات الوصول وعدم وجود قائمة حظر IP على مستوى التطبيق هو قيد كبير جدًا لـ Discourse. إنه يحدث بشكل غير متكرر، ولكن عندما تتعرض لهجوم من هذه الروبوتات/المتسللين/الزواحف، فأنت تريد فقط تحديد المصدر على الفور وتخفيفه، دون العبث بمجموعة من ملفات التكوين والأوامر الغامضة، خاصة ليس على مستويات عميقة داخل حاوية Docker مع كل التجريد الغريب الذي يحدث هناك. المنصة القديمة للمنتديات التي قمت بالترحيل منها أظهرت قائمة بسيطة بالمستخدمين أو عناوين IP التي لديها أكبر عدد من الطلبات خلال نافذة زمنية قابلة للتعديل، وكان من الممكن حتى تصفيتها حسب المستخدمين و/أو عناوين IP التي شغلت أكبر قدر من وقت وحدة المعالجة المركزية. بهذه الطريقة، يمكنني تحديد العنوان أو النطاق المخالف بسرعة، ثم كانت هناك واجهة للنقر والإضافة لإضافته إلى قائمة الحظر، وكان سيتم إرجاع 404 للطلبات من عناوين IP هذه.
مرحباً، أود أن أقول إن هذه المشكلة ليست قابلة للحل في الوقت الحالي بالطرق “العادية”. الواجهة الإدارية لـ “عناوين IP المفحوصة” لا تفعل ما يتوقعه معظم المستخدمين، والطريقة التي تعمل بالفعل تتضمن العبث داخل حاوية Docker الخاصة بـ Discourse، لذا فهي أقرب إلى حل مؤقت قذر بدلاً من حل، على الأقل في رأيي. سيكون من الرائع لو حصل هذا على المزيد من الاهتمام: