عندما كنت جديدًا في AWS، واجهت تحديًا مثيرًا للاهتمام أثناء العمل على مهمة للتوقيع رقميًا على مستند، الأمر الذي يتطلب عنوان IP الخاص بالعميل كجزء من التوقيع الإلكتروني. في البداية، شعرت بسعادة غامرة عندما بدا أن التنفيذ يعمل بشكل مثالي في المرة الأولى. ومع ذلك، فإن حماستي كانت قصيرة الأجل. أثناء الاختبار، لاحظت أنه تم إرجاع نفس عنوان IP، حتى عندما قمت بالوصول إلى التطبيق من أجهزة مختلفة. عندها أدركت أن عنوان IP الذي كنت أتلقاه لم يكن عنوان IP الفعلي للعميل بل عنوان IP لموازن التحميل.
قادني هذا الاكتشاف إلى طريق التحقيق والتعلم. اضطررت إلى البحث بشكل أعمق لفهم ما كان يحدث وكيفية استرداد عنوان IP الحقيقي للعميل. في هذه المدونة، سأشارك تجربتي وأقدم دليلاً شاملاً حول كيفية تحقيق ذلك باستخدام AWS Lambda وPython، مما يضمن إمكانية التقاط عنوان IP الخاص بالعميل بدقة عند استخدام Application Load Balancer (ALB).
عندما يقوم العميل بتقديم طلب إلى التطبيق الخاص بك من خلال ALB، يعمل موازن التحميل كوسيط. وبالتالي، فإن عنوان IP الذي يراه تطبيقك هو عنوان ALB، وليس عنوان العميل. لمعالجة هذه المشكلة، يقوم ALB بتضمين عنوان IP الخاص بالعميل في رأس X-Forwarded-For HTTP. يمكن أن يحتوي هذا الرأس على عناوين IP متعددة في حالة مرور الطلب عبر وكلاء متعددين.
إليك ما نحتاج إلى التعامل معه:
استخراج عنوان IP للعميل: استرداد رأس X-Forwarded-For وتحليله.
التعامل مع عناوين IP المتعددة : تأكد من حصولنا على عنوان IP الصحيح للعميل حتى في حالة مشاركة عدة وكلاء.
يجب استخدام رأس X-Forwarded-For بحذر بسبب المخاطر الأمنية المحتملة. لا يمكن اعتبار الإدخالات جديرة بالثقة إلا إذا تمت إضافتها بواسطة أنظمة مؤمنة بشكل صحيح داخل الشبكة. وهذا يضمن عدم التلاعب بعناوين IP الخاصة بالعميل وموثوقيتها.
AWS Lambda هي خدمة حوسبة بدون خادم تتيح لك تشغيل التعليمات البرمجية دون توفير الخوادم أو إدارتها. تُعد لغة Python، ببساطتها وسهولة قراءتها، خيارًا ممتازًا للتعامل مع هذه المهمة ضمن وظيفة Lambda.
وظيفة AWS Lambda: الوظيفة الأساسية التي تعالج الطلبات الواردة.
موازن تحميل التطبيق (ALB) : موازن التحميل الذي يعيد توجيه الطلبات إلى وظيفة Lambda.
أولاً، تأكد من إعداد وظيفة Lambda وتكاملها مع ALB. اتبع دليل AWS الرسمي إذا لزم الأمر: استخدام وظائف Lambda كأهداف لـ Application Load Balancer.
فلنتعمق في كود Python لوظيفة Lambda. ستقوم هذه الوظيفة باستخراج عنوان IP الخاص بالعميل من رأس X-Forwarded-For.
import json def lambda_handler(event, context): # Extract the 'X-Forwarded-For' header x_forwarded_for = event['headers'].get('x-forwarded-for') if x_forwarded_for: # The first IP in the list is the client's IP client_ip = x_forwarded_for.split(',')[0] else: # Fallback if header is not present client_ip = event['requestContext']['identity']['sourceIp'] # Log the client IP print(f"Client IP: {client_ip}") # Respond with the client IP return { 'statusCode': 200, 'body': json.dumps({'client_ip': client_ip}) }
استخراج الرأس: استرداد رأس X-Forwarded-For من الطلب الوارد.
تحليل الرأس: خذ عنوان IP الأول، الذي يمثل عنوان IP الأصلي للعميل.
آلية الرجوع: استخدم عنوان IP المصدر من سياق الطلب إذا لم يكن الرأس موجودًا.
التسجيل والاستجابة: تسجيل وإعادة عنوان IP الخاص بالعميل للتحقق منه.
طلب:
{ "headers": { "x-forwarded-for": "203.0.113.195, 70.41.3.18, 150.172.238.178" }, "requestContext": { "identity": { "sourceIp": "70.41.3.18" } } }
إجابة:
{ "client_ip": "203.0.113.195" }
يتطلب تحديد عنوان IP الفعلي للعميل في وظيفة AWS Lambda خلف ALB معالجة دقيقة لرأس X-Forwarded-For. يضمن هذا الأسلوب تسجيل IP دقيقًا ويعزز قدرة التطبيق على تخصيص وتأمين تفاعلات المستخدم.
وثائق AWS ALB:
بايثون في AWS Lambda:
شرح رؤوس HTTP
تنصل: جميع الموارد المقدمة هي جزئيًا من الإنترنت. إذا كان هناك أي انتهاك لحقوق الطبع والنشر الخاصة بك أو الحقوق والمصالح الأخرى، فيرجى توضيح الأسباب التفصيلية وتقديم دليل على حقوق الطبع والنشر أو الحقوق والمصالح ثم إرسالها إلى البريد الإلكتروني: [email protected]. سوف نتعامل مع الأمر لك في أقرب وقت ممكن.
Copyright© 2022 湘ICP备2022001581号-3