Tengo un ELB de AWS conectado con varios EC2 que ejecutan el servidor de AWS Flask. No estoy seguro de si AWS ELB pasa la solicitud completa a EC2 o no. Sé que podemos hacer las restricciones a nivel de ELB, pero quiero poner restricciones en un solo punto final y verificar el nombre de host del servidor que invocó el punto final en Flask. ¿Es posible?
Podrías intentar lo siguiente:
import socket from flask import request @app.route("/your_route", methods=["GET"]) def your_route(): hostname, aliaslist, ipaddrlist = socket.gethostbyaddr(request.remote_addr)Tenga en cuenta que confiar en remote_addr no es confiable, sin embargo, como esto no está relacionado con el tema, me referiré a esta respuesta que hace uso de ProxyFix :
Para obtener más información sobre socket.gethostbyaddr() , consulte: socket.gethostbyaddr()
Le sugiero que use el patrón decorador para tales casos, es decir, agregue una nueva opción de configuración IP_LIST con algún tipo de conjunto de direcciones dividido por comas.
IP_LIST = "127.0.0.1,127.0.0.2,..."Después de eso, agregue una nueva función de decorador y decore cualquier punto final con el decorador.
def ip_verified(fn): """ A custom decorator that checks if a client IP is in the list, otherwise block access. """ @wraps(fn) def decorated_view(*args, **kwargs): ip_list_str = current_app.config['IP_LIST'] ip_list = ip_list_str.split(",") if ip_list_str else [] if request.headers.getlist("X-Forwarded-For"): remote_ip = request.headers.getlist("X-Forwarded-For")[0] else: remote_ip = request.remote_addr if remote_ip not in ip_list: return "Not sufficient privileges", 403 return fn(*args, **kwargs) return decorated_view @app.route("/your_route", methods=["GET"]) @ip_verified def your_route(): ...Una opción es usar un Network Load Balancer que conserve la dirección IP del cliente que realiza la solicitud. Incluso puede hacer que el NLB realice la terminación TLS como un ELB. Un NLB no altera los datos en la solicitud de red, con la excepción de la terminación de TLS si elige usarla.