Когда я был новичком в AWS, я столкнулся с интересной проблемой во время работы над задачей по цифровой подписи документа, для которой в качестве части электронной подписи требовался IP-адрес клиента. Поначалу я был в восторге, когда реализация с первого раза заработала идеально. Однако мое волнение было недолгим. Во время тестирования я заметил, что возвращался один и тот же IP-адрес, даже когда я обращался к приложению с разных компьютеров. Именно тогда я понял, что IP-адрес, который я получал, был не фактическим IP-адресом клиента, а IP-адресом балансировщика нагрузки.
Это открытие привело меня на путь исследования и обучения. Мне пришлось копнуть глубже, чтобы понять, что происходит и как получить настоящий IP-адрес клиента. В этом блоге я поделюсь своим опытом и предоставлю подробное руководство о том, как добиться этого с помощью AWS Lambda и Python, гарантируя, что вы сможете точно зафиксировать IP-адрес клиента при использовании балансировщика нагрузки приложений (ALB).
Когда клиент отправляет запрос к вашему приложению через ALB, балансировщик нагрузки выступает в роли посредника. Следовательно, IP-адрес, который видит ваше приложение, принадлежит ALB, а не клиенту. Чтобы решить эту проблему, ALB включает IP-адрес клиента в HTTP-заголовок X-Forwarded-For. Этот заголовок может содержать несколько IP-адресов, если запрос прошел через несколько прокси.
Вот что нам нужно обработать:
Извлечение IP-адреса клиента: получение и анализ заголовка X-Forwarded-For.
Обработка нескольких IP-адресов: убедитесь, что мы получаем правильный IP-адрес клиента, даже если задействовано несколько прокси-серверов.
Заголовок X-Forwarded-For следует использовать с осторожностью из-за потенциальных угроз безопасности. Записи можно считать заслуживающими доверия только в том случае, если они добавлены системами, которые должным образом защищены в сети. Это гарантирует, что IP-адреса клиентов не будут подделаны и надежны.
AWS Lambda — это сервис бессерверных вычислений, который позволяет запускать код без выделения серверов и управления ими. Python, благодаря своей простоте и читабельности, является отличным выбором для решения этой задачи с помощью лямбда-функции.
Лямбда-функция AWS: основная функция, обрабатывающая входящие запросы.
Балансировщик нагрузки приложения (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:
Python в AWS Lambda:
Разъяснение HTTP-заголовков
Отказ от ответственности: Все предоставленные ресурсы частично взяты из Интернета. В случае нарушения ваших авторских прав или других прав и интересов, пожалуйста, объясните подробные причины и предоставьте доказательства авторских прав или прав и интересов, а затем отправьте их по электронной почте: [email protected]. Мы сделаем это за вас как можно скорее.
Copyright© 2022 湘ICP备2022001581号-3