Переадресация порта xinetd заставляет HttpServletRequest.getRemoteAddr() всегда возвращать 127.0.0.1
Мы пытаемся определить, откуда поступают конкретные запросы из нашего Java-приложения. Мы изменили файлы журнала, чтобы включить IP-адрес, и мы используем httpServletRequest.getRemoteAddr()
чтобы получить этот удаленный адрес.
При использовании xinetd для пересылки внешних запросов через порт 443 на внутренний порт, который прослушивает наш сервер приложений (например, 8999), getRemoteAddr()
всегда возвращает 127.0.0.1. Если мы удалим xinetd из стека, мы получим правильный адрес.
Обратите внимание, что X-Forwarded-For
Заголовок также не заполняется.
Есть ли способ продолжить использовать xinetd для переноса вперед без удаления IP-адреса запрашивающей стороны?
Наша установка:
service https
{
disable = no
flags = REUSE
socket_type = stream
wait = no
user = root
port = 443
protocol = tcp
redirect = localhost 8999
log_on_failure += USERID
}
2 ответа
Краткий ответ: нет.
Длинный ответ, ваше java-приложение видит только сервер xinetd от localhost.
Это не может быть сделано одним только xinetd. Используйте прокси-сервер, чтобы получить все возможности заголовков и т. Д.
Видимо та же проблема: tomcat6 за xinetd - реальный ip клиента
Ваш серверный стек может быть ошибочным или устаревшим. На моем сервере (3.19.0-41-generic 14.04.2-Ubuntu, xinetd 2.3.15 libwrap loadavg) xinetd без проблем пересылает нужный заголовок. Я бы предложил обновить стек серверов. Вы можете получить версию xinetd с
xinetd -version
Также проверьте, правильно ли вы настроили RemoveIpValve на Tomcat. Для конфигурации, подобной вашей, файл conf/server.xml должен содержать что-то вроде
<Engine name="Catalina" defaultHost="localhost">
<Valve className="org.apache.catalina.valves.RemoteIpValve"
remoteIpProxiesHeader="x-forwarded-by"
remoteIpHeader="x-forwarded-for"
internalProxies="127\.0\.0\.1"
protocolHeader="x-forwarded-proto" />