Cuando era nuevo en AWS, me enfrenté a un desafío interesante mientras trabajaba en una tarea para firmar digitalmente un documento, que requería la IP del cliente como parte de la firma electrónica. Al principio me emocioné cuando la implementación pareció funcionar perfectamente la primera vez. Sin embargo, mi entusiasmo duró poco. Durante las pruebas, noté que se devolvía la misma dirección IP, incluso cuando accedía a la aplicación desde diferentes máquinas. Fue entonces cuando me di cuenta de que la dirección IP que estaba recibiendo no era la IP real del cliente sino la IP del balanceador de carga.
Este descubrimiento me llevó por un camino de investigación y aprendizaje. Tuve que profundizar más para comprender qué estaba sucediendo y cómo recuperar la IP real del cliente. En este blog, compartiré mi experiencia y brindaré una guía completa sobre cómo lograr esto usando AWS Lambda y Python, asegurando que pueda capturar con precisión la dirección IP del cliente cuando use un balanceador de carga de aplicaciones (ALB).
Cuando un cliente realiza una solicitud a su aplicación a través de un ALB, el balanceador de carga actúa como intermediario. En consecuencia, la dirección IP que ve su aplicación es la del ALB, no la del cliente. Para solucionar este problema, ALB incluye la IP del cliente en el encabezado HTTP X-Forwarded-For. Este encabezado puede contener varias direcciones IP en caso de que la solicitud haya pasado por varios servidores proxy.
Esto es lo que debemos manejar:
Extraiga la IP del cliente: recupere y analice el encabezado X-Forwarded-For.
Manejar múltiples IP: asegúrese de obtener la IP de cliente correcta incluso cuando haya varios servidores proxy involucrados.
El encabezado X-Forwarded-For debe usarse con precaución debido a posibles riesgos de seguridad. Las entradas sólo pueden considerarse confiables si se agregan mediante sistemas que estén adecuadamente protegidos dentro de la red. Esto garantiza que las IP del cliente no sean manipuladas y sean confiables.
AWS Lambda es un servicio informático sin servidor que le permite ejecutar código sin aprovisionar ni administrar servidores. Python, con su simplicidad y legibilidad, es una excelente opción para manejar esta tarea dentro de una función Lambda.
Función AWS Lambda: la función principal que procesa las solicitudes entrantes.
Application Load Balancer (ALB): el balanceador de carga que reenvía solicitudes a la función Lambda.
Primero, asegúrese de que su función Lambda esté configurada e integrada con un ALB. Siga la guía oficial de AWS si es necesario: Uso de funciones Lambda como objetivos para Application Load Balancer.
Profundicemos en el código Python de la función Lambda. Esta función extraerá la dirección IP del cliente del encabezado X-Fordered-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}) }
Extraer el encabezado: recupera el encabezado X-Forwarded-For de la solicitud entrante.
Analizar el encabezado: tome la primera IP, que representa la IP original del cliente.
Mecanismo alternativo: utilice la IP de origen del contexto de la solicitud si el encabezado no está presente.
Registro y respuesta: registra y devuelve la IP del cliente para su verificación.
Pedido:
{ "headers": { "x-forwarded-for": "203.0.113.195, 70.41.3.18, 150.172.238.178" }, "requestContext": { "identity": { "sourceIp": "70.41.3.18" } } }
Respuesta:
{ "client_ip": "203.0.113.195" }
Identificar la IP del cliente real en una función AWS Lambda detrás de un ALB requiere un manejo cuidadoso del encabezado X-Forwarded-For. Este enfoque garantiza un registro de IP preciso y mejora la capacidad de la aplicación para personalizar y proteger las interacciones del usuario.
Documentación de AWS ALB:
Python en AWS Lambda:
Encabezados HTTP explicados
Descargo de responsabilidad: Todos los recursos proporcionados provienen en parte de Internet. Si existe alguna infracción de sus derechos de autor u otros derechos e intereses, explique los motivos detallados y proporcione pruebas de los derechos de autor o derechos e intereses y luego envíelos al correo electrónico: [email protected]. Lo manejaremos por usted lo antes posible.
Copyright© 2022 湘ICP备2022001581号-3