Сохранять клиентский IP-адрес через обратный прокси-сервер Apache

Мы хотим сохранить исходный IP-адрес клиента при передаче запроса от Apache на наш application.

В настоящее время у нас есть такая настройка:

CLIENT --123.2.3.4--> APACHE --127.0.0.1--> API

Но мы хотим, чтобы она была:

CLIENT --123.2.3.4--> APACHE --123.2.3.4--> API

Я знаю, что мы могли бы искать исходный удаленный адрес в заголовке Forwarded-For ; но идея состоит в том, что это не должно быть проблемой для нашего приложения API, API не нужно знать, может ли он находиться за прокси-сервером, а скорее искать IP-адрес и находить его каждый времени.

Мы пробовали с mod_proxy и mod_remoteip , но безуспешно.

-2
задан 28 April 2017 в 03:26
1 ответ

Я бы использовал mod_remoteip, если вы можете, но учтите, что вам придется изменить лог-формат, чтобы использовать %a, а не %h, чтобы увидеть адрес в ваших журналах.

Также, ответ скорее зависит от того, как ваше приложение, которое является reverse-proxied, связано с Apache.

По сути, что-то должно сообщить об этом вашему приложению. Если вы используете mod_php, mod_fcgi, mod_wsgi, mod_proxy_ajp, то это уже сделано за вас.

Если, с другой стороны, вы просто используете mod_proxy_http, то вам нужно убедиться, что необходимые данные передаются через заголовок (например, X-Forwarded-For), а также, что вы используете ProxyPreserveHost. Точно так же вам нужно отправить, использовался ли http или https на внешнем интерфейсе, и даже какой порт был использован. Все это очень важно для корректной работы таких вещей, как создание гиперссылок и куки. Иначе вы должны явно указать приложению, какие настройки у него есть во внешнем интерфейсе (что, возможно, проще).

Apache Tomcat (как и многие контейнеры промежуточного программного обеспечения J2EE) позволяет вам задавать такие детали окружения в коннекторе.

Для рабочих нагрузок Tomcat я бы вообще рекомендовал AJP, потому что это намного проще; но если WebSockets входит в микс, который не поддерживается AJP, то вы должны вернуться к HTTP, и таким образом настроить вещи в бэкэнде. Для этого не требуется настраивать приложение (в смысле J2EE) только содержащее среду выполнения.

Что-то, где-то, и кто-то должен поддерживать эту сложность. И производители приложений должны действительно убедиться, что это может сработать. Если что, чистая поддержка таких сред более важна по мере того, как рабочие нагрузки перемещаются в контейнерные среды.

1
ответ дан 5 December 2019 в 21:23

Теги

Похожие вопросы