рассматриваемая установка выглядит следующим образом:
мое веб-приложение, реализованное с использованием fastapi
и развернутое с использованием gunicorn
и uvicorn
рабочий класс, находится за прокси nginx
на том же хосте с IP-адресом 172.31.x.x
(и за другими удаленными устройствами, такими как концентратор VPN и т. д. c.)
nginx
настроен следующим образом:
location / {
real_ip_header X-Forwarded-For;
real_ip_recursive on;
set_real_ip_from 172.31.x.x/32; # well-known vpn concentrator
proxy_set_header Host $http_host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_redirect off;
proxy_pass http://172.31.x.x:5045;
gunicorn
настроен следующим образом :
OPTIONS="--bind 127.0.0.1:5045 --bind 172.31.x.x:5045 --forwarded-allow-ips=127.0.0.1,172.31.x.x --workers 1 --worker-class uvicorn.workers.Uv
icornWorker --log-config config/logging.conf"
в fastapi
с использованием объекта starlette.requests.Request
(с именем request
), request.client.host
печатает IP-адрес интерфейса сервера, на котором размещено веб-приложение (то есть 172.31.x.x
)
request.headers["x-real-ip"], request.headers["x-forwarded-for"]
оба печатают IP-адрес устройства перед моим прокси-сервером, который является известным брандмауэром в моей компании.
Я хотел бы спросить:
- можно ли распечатать весь HTTP-заголовок
X-Forwarded-For
, чтобы увидеть посреднические службы прокси? - как получить реальный IP-адрес клиента моего конечного пользователя (по сути, переопределяя общеизвестный белый список IP-адресов)?