Как Tomcat 9 Connector может прослушивать обратный прокси 127.0.0.1 для Win. Apache 2.4 с частным именем сервера - PullRequest
0 голосов
/ 24 апреля 2018

Я хочу, чтобы Tomcat 8080 прослушивал только 127.0.0.1 и использовал обратный прокси-сервер для Windows Apache 2.4, который использует частную сеть ServerName

Я не хочу, чтобы порт Tomcat 8080 был доступен вне машины, на которой запущен Tomcat.

Развернутое веб-приложение Tomcat представляет собой веб-приложение Spring MVC со страницей входа в систему безопасности Spring *

Я попробовал простую настройку по этим ссылкам, вопросам и документам apache:

Как установить IP-адрес для кота?

https://cgsrv1.arrc.csiro.au/blog/2009/07/10/tomcat-listen-only-on-localhost/

https://julienprog.wordpress.com/2017/06/21/how-to-bind-apache-server-non-localhost-to-tomcat-server/

https://wiki.jasig.org/display/UPM43/Fronting+Tomcat+with+Apache+HTTP+Server

То, что происходит, похоже - коннектор обратного прокси или tomcat перенаправляет клиента браузер для HTTP localhost / acme - вместо предоставления фронтальному прокси-серверу apache данных из HTTP localhost: 8080 / acme

Клиентский браузер должен получать / отображать данные по URL: https my.server.domain / acme

Я хочу, чтобы поток был:

пользовательский клиент -> https apache -> http tomcat http -> https apache -> пользовательский клиент

apache и tomcat живут на одном компьютере с сервером Windows 7 с jdk8

Я не вижу ничего полезного или ошибок в каких-либо журналах

Я думаю, что tomcat правильно слушает только 127.0.0.1 - но когда происходит обратный прокси-сервер apache, он получает данные от tomcat, а затем по какой-то причине создает браузер клиента (отдельный сетевой компьютер) получить направление на:

HTTP localhost / acme вместо того, чтобы позволить URL-адресу браузера клиента оставаться включенным: https my.server.domain / acme

Обратите внимание, что браузер клиента не пытался перейти на 8080, так что это хорошо

Клиент определенно не размещает свое собственное веб-приложение с URL-адресом HTTP localhost / acme, на который он перенаправляется, поэтому в браузере клиента отображается Ошибка HTTP 404. Запрашиваемый ресурс не найден.

Я не думаю, что виновной будет страница входа в систему безопасности MVC Spring

У моего apache httpd.conf есть эта строка: ServerName my.server.domain: 80

Я думаю, что не могу изменить это значение, потому что мое общее имя SSL-сертификата и SAN основано на этом имени частной сети, поэтому мне нужно, чтобы оно оставалось таким для правильного подключения SSL.

Я использую Rewrite, чтобы требовать SSL ниже, но я не думаю, что это будет проблемой

Я могу заставить прокси / обратный прокси и https работать без полной цели блокирования 8080, выполнив это:

apache httpd.conf:

ProxyPass         /acme  http://my.server.domain:8080/acme
ProxyPassReverse  /acme  http://my.server.domain:8080/acme

tomcat server.xml: (примечание: не прослушивает только 127.0.0.1)

<Connector     
   port="8080" 
   protocol="HTTP/1.1"
   connectionTimeout="20000"
   redirectPort="8443" 
   proxyPort="80" />

<Connector  
    port="8009" 
    protocol="AJP/1.3" 
    redirectPort="8443" />  

Ниже приведены мои конфигурационные файлы, которые вызывают нежелательное перенаправление браузера:


apache httpd.conf

Listen 80

ServerName my.server.domain:80

LoadModule proxy_module modules/mod_proxy.so
LoadModule proxy_http_module modules/mod_proxy_http.so

ProxyPass         /acme  http://localhost:8080/acme
ProxyPassReverse  /acme  http://localhost:8080/acme

LoadModule rewrite_module modules/mod_rewrite.so

Include conf/extra/httpd-vhosts.conf
Include conf/extra/httpd-ssl.conf

apache httpd-vhosts.conf

# I have this so httpS only is supported
<VirtualHost _default_:80>  
  ServerName my.server.domain  
  RewriteEngine On
  RewriteCond %{SERVER_PORT} !443
  RewriteRule ^(/(.*))?$ https://%{HTTP_HOST}/$1 [R=301,L]            
</VirtualHost>

apache httpd-ssl.conf

Я установил свои пути для: сертификата сервера, секретного ключа, промежуточного сертификата CA


tomcat server.xml

<!-- Note: proxyPort="80"  I think is correct right? (from docs) -->

<Connector  
   address="127.0.0.1"
   port="8080" 
   protocol="HTTP/1.1"
   connectionTimeout="20000"
   redirectPort="8443" 
   proxyPort="80" />

<Connector  
    address="127.0.0.1" 
    port="8009" 
    protocol="AJP/1.3" 
    redirectPort="8443" />   

==============================================

Конечно, я могу использовать Windows IP-фильтрацию и для блока 8080, я надеялся, что этот адрес соединителя тоже будет работать

1 Ответ

0 голосов
/ 25 апреля 2018

Я нашел решение:

В моем Tomcat server.xml мне нужно было отредактировать http-коннектор и добавить дополнительный атрибут:

proxyName="my.server.domain"

, чтобы он выглядел как:

<Connector
 port="8080"
 address="127.0.0.1"
 protocol="HTTP/1.1"
 connectionTimeout="20000"
 redirectPort="8443"
 proxyPort="80"
 proxyName="my.server.domain"
 />

Это позволяет размещаемому tomcat весеннему веб-приложению mvc создавать URL-адреса, напоминающие:

http://my.server.domain/acme

вместо:

http://localhost/acme

=========================================

Проблема, которая возникала при пропуске атрибута: proxyName = "my.server.domain" --- была:

Весеннее веб-приложение mvc, размещенное на Tomcat, создавало URL-адреса для обработки запросов - и оно спрашивало Tomcat: «Как называется ваш сервер?» - на что Tomcat отвечал «localhost» (значение Tomcat получало запросы как от прокси-сервера Apache). Так что весна использовала "localhost" когда он создавал URL-адреса, напоминающие: http://localhost/acme

Внешний прокси-сервер Apache получал эти URL-адреса из ответов Tomcat (из весенних ответов mvc webapp) - и прокси-сервер Apahe давал браузер клиента конечного пользователя этот URL, чтобы перейти к: http://localhost/acme Клиент конечного пользователя определенно не имеет этого веб-приложения, размещенного на их локальном компьютере, поэтому браузер выдавал им: HTTP Error 404

=========================================

Это ясно видно из конфигурации прокси-сервера apache:

ProxyPass         /acme  http://localhost:8080/acme
ProxyPassReverse  /acme  http://localhost:8080/acme

Apache отправляет URL-адрес, содержащий «localhost» в запросе - tomcat. В ответе соединителя Tomcat должно быть указано реальное имя proxyName (не localhost) для Apache, которое должно быть возвращено клиентам.

=========================================

Документация по соединителю Tomcat:

* proxyName

Если этот Коннектор используется в конфигурации прокси, настройте этот атрибут, чтобы указать имя сервера, которое будет возвращено для вызовов request.getServerName (). Дополнительные сведения см. В разделе «Поддержка прокси».

Поддержка прокси

Атрибуты proxyName и proxyPort можно использовать, когда Tomcat запускается за прокси-сервером. Эти атрибуты изменяют значения, возвращаемые веб-приложениям, которые вызывают методы request.getServerName () и request.getServerPort (), которые часто используются для создания абсолютных URL-адресов для перенаправлений. Без настройки этих атрибутов возвращаемые значения будут отражать имя сервера и порт, по которому было получено соединение от прокси-сервера, а не имя сервера и порт, на которые клиент направил исходный запрос. *

============================================

Многие блоги в Интернете, в которых упоминается, как сделать так, чтобы соединители tomcat слушали только 127.0.0.1, не объясняют, что proxyName должно быть установлено в дополнение к proxyPort, если у вас есть Веб-приложение, как Spring MVC, который создает URL-адреса - и вы используете прокси-сервер Apache Mod для отправки URL-адресов запроса localhost в Tomcat.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...