إدارة "سلسلة الثقة" لعنوان IP الحقيقي للمستخدم النهائي

الخلفية

يجب أن يكون نظام Discourse على دراية بعنوان IP الحقيقي للمستخدم النهائي.

ومع ذلك، لا يتصل المستخدم النهائي مباشرةً بـ Discourse لأن هناك دائمًا خادم ويب واحد أو أكثر في المراحل السابقة (nginx يعمل داخل حاوية Discourse). لذلك، نحتاج إلى طريقة لنقل هذه المعلومات إلى Discourse بطريقة موثوقة.

تُعدّ رسالة x-forwarded-for هي الحل. في هذا الموضوع، سأصف الآليات المحددة للتعامل مع هذه المعلومات بشكل صحيح وكيفية توقعنا لنشرها.

القوالب

تم تحديث القوالب المختلفة للثقة في الوكلاء الوسيدين (مثل cloudflare.template.yml أو fastly.template.yml) لاستخدام أسماء ملفات متوقعة في المنافذ بدلاً من الاعتماد على استبدال النصوص (وهو أمر هش).

أسماء الملفات

server/real-ip-header.conf

يحتوي هذا الملف على الرأس الذي سيستخدمه nginx الذي يعمل داخل الحاوية كمصدر للحقيقة، على سبيل المثال:

real_ip_header x-forwarded-for;

أو كما هو مُحدد في قالب Cloudflare:

real_ip_header cf-connecting-ip;

server/real-ip-recursive.conf

إذا كان هذا الملف موجودًا، فإنه يتحكم في التكرار أثناء معالجة رأس “عنوان IP الحقيقي”. ستحتاج إلى تمكين هذا الخيار إذا كان هناك أكثر من وكيل وسيدي أمام حاوية Discourse.

real_ip_recursive on;

مثال:

Cloudflare → موازن التحميل → حاوية Discourse (التي تتكون من nginx وDiscourse نفسه)

مع هذا الإعداد، سيتلقى nginx رسالة x-forwarded-for تبدو كالتالي:

x-forwarded-for: real_end_user_ip, cloudflare_ip

عند اتصال من عنوان IP لموازن التحميل.

لمعالجة ذلك، يحدد nginx أولاً ما إذا كان عنوان المصدر للاتصال (عنوان IP لموازن التحميل) موثوقًا به (انظر set_real_ip_from)، وإذا كان كذلك، سيعالج آخر عنوان IP في رأس x-forwarded-for.

بما أن عنوان IP هذا هو cloudflare_ip، يحتاج nginx بعد ذلك إلى تكرار العملية مرة أخرى، للتحقق مما إذا كان cloudflare_ip موثوقًا به، واستخدام عنوان IP التالي وهو real_end_user_ip.

server/set-real-ip-from-ENVIRONMENT.conf

يحتوي هذا الملف على تعليمات تخبر nginx عناوين IP الموثوقة، ويمكننا إنشاء العديد من الملفات والتعليمات حسب الحاجة.

تقوم القوالب في discourse_docker بإنشاء هذه الملفات عند الحاجة (مثل set-real-ip-from-cloudflare.conf)، وإذا كانت لديك احتياجات إضافية، يمكنك إضافة ملفاتك الخاصة.

مثال:

إذا كنت تعمل في AWS ولديك موازن تحميل تطبيق (ALB) أمام حاوية Discourse، يمكنك إضافة ملف إضافي عن طريق إضافة الكود التالي إلى تعريف الحاوية (معدلاً ليناسب بيئتك):

run:
  - file:
      path: /etc/nginx/conf.d/outlets/server/set-real-ip-from-aws.conf
      chmod: 644
      # شبكة VPC الخاصة بـ AWS هي 10.42.0.0/16، وثق بأي اتصالات من شبكات ALB
      contents: |
        set_real_ip_from 10.42.66.0/24;
        set_real_ip_from 10.42.67.0/24;
  - file:
      path: /etc/nginx/conf.d/outlets/server/real-ip-header.conf
      chmod: 644
      contents: |
        real_ip_header x-forwarded-for;
4 إعجابات