У меня есть AWS ELB, подключенный к нескольким EC2, на которых запущен сервер AWS Flask. Я не уверен, передает ли AWS ELB полный запрос в EC2 или нет. Я знаю, что мы можем установить ограничения на уровне ELB, но я хочу наложить ограничения только на одну конечную точку и проверить имя хоста сервера, который вызвал конечную точку во Flask. Является ли это возможным?
Проверьте имя хоста сервера, который вызвал API
Ответы (3)
Вы можете попробовать следующее:
import socket
from flask import request
@app.route("/your_route", methods=["GET"])
def your_route():
hostname, aliaslist, ipaddrlist = socket.gethostbyaddr(request.remote_addr)
Обратите внимание, что полагаться на remote_addr ненадежно, однако, поскольку это не связано с темой, я буду ссылаться на этот ответ, в котором используется из ProxyFix:
Для получения дополнительной информации о socket.gethostbyaddr()
посетите: socket.gethostbyaddr () а>
Я предлагаю вам использовать шаблон декоратора для таких случаев, то есть вы добавляете новую опцию конфигурации IP_LIST с каким-то набором адресов, разделенным запятой.
IP_LIST = "127.0.0.1,127.0.0.2,..."
После этого добавьте новую функцию декоратора и украсьте любую конечную точку декоратором.
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():
...
Один из вариантов - использовать Network Load Balancer, который сохраняет IP-адрес клиента, отправляющего запрос. Вы даже можете заставить NLB выполнять завершение TLS точно так же, как ELB. NLB не изменяет данные в сетевом запросе, за исключением завершения TLS, если вы решите это использовать.