Мы пытаемся определить, откуда поступают конкретные запросы внутри нашего 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
}
Краткий ответ: нет.
Длинный ответ: ваше 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" />