После развертывания на Prod Server

После развертывания на Prod Server

Я планировал развернуть обратный прокси-сервер с помощью Apache, но прежде чем сделать это в рабочей среде, я попытался реализовать это в своей домашней лаборатории. У меня запущены две виртуальные машины на Redhat.

192.168.56.70 mainsite.example.com  mainsite
#192.168.56.70  mainsite2.example.com mainsite2
192.168.56.71 areverseproxy.example.com areverseproxy

на сервере Backend Apache я создал виртуальный хост, содержимое этого VHost

<VirtualHost *:80>                                                      
  #  DocumentRoot "/var/www/html/"                                      
  # <Directory "/var/www/html/mainsite">                                
  #  AllowOverride None                                                 
  #  # Allow open access:                                               
  #  Require all granted                                                
  # </Directory>                                                        
                                                                        
    #DirectoryIndex "/var/www/html/mainsite/index.html"                 
    ServerName mainsite.example.com                                     
    ServerAlias mainsite                                                
    Redirect permanent / https://192.168.56.70                          
    ErrorLog "/var/log/httpd/mainsite.example.com-error_log"            
    CustomLog "/var/log/httpd/mainsite.example.com-access_log" common   
</VirtualHost>                                                          
                                                                        
<VirtualHost *:443>                                                     
SSLEngine on                                                            
SSLCertificateFile /etc/pki/tls/certs/ca.crt                            
SSLCertificateKeyFile /etc/pki/tls/private/ca.key                       
    DocumentRoot "/var/www/html/mainsite"                               
    <Directory "/var/www/html/mainsite">                                
    AllowOverride None                                                  
    # Allow open access:                                                
    Require all granted                                                 
    </Directory>                                                        
                                                                        
    #DirectoryIndex "/var/www/html/mainsite/index.html"                 
    ServerName mainsite.example.com                                     
    ServerAlias mainsite                                                
    ErrorLog "/var/log/httpd/mainsite.example.com-error_log"            
    CustomLog "/var/log/httpd/mainsite.example.com-access_log" common   
</VirtualHost> 

А на обратном прокси-сервере я добавил эти строки, чтобы включить обратный прокси

<IfModule mod_proxy.c>
    ProxyRequests Off
    <Proxy *>
        Require all granted
    </Proxy>
    # backend server and forwarded path
    ProxyPreserveHost On
    ProxyPass / http://mainsite.example.com/
    ProxyPassReverse / http://mainsite.example.com/
</IfModule>

Если я попытаюсь открыть URLhttp://192.168.56.71он перенаправит наhttps://192.168.56.70что нормально, если у меня нет обратного прокси-сервера, но в сценарии с обратным прокси он должен бытьhttps://192.168.56.71

Может ли кто-нибудь подсказать, какие изменения мне следует внести на обратном прокси-сервере, чтобы URL остался прежним?https://192.168.56.71если я ввожу URLhttp://192.168.56.71

Большое спасибо

После развертывания на Prod Server

Ошибка

[Mon May 31 09:16:26.650015 2021] [proxy_http:error] [pid 104179] (103)Software caused connection abort: [client 192.168.22.140:40286] AH01102: error reading status line from remote server 172.16.1.140:443
[Mon May 31 09:16:26.650214 2021] [proxy:error] [pid 104179] [client 192.168.22.140:40286] AH00898: Error reading from remote server returned by /

решение1

У вас должно быть два виртуальных хоста на обратном прокси-сервере. Я бы рекомендовал удалить глобальные директивы proxypass на обратном прокси и указать их для каждого виртуального хоста.

Виртуальный хост на порту 80 должен перенаправлять на порт 443 на том же хосте (areverseproxy.example.com) так же, как вы это делали на сервере бэкенда. Однако никто больше не должен входить в порт 80 на бэкенде, если вы правильно настроите обратный прокси, если только бэкенд не будет доступен через интернет.

Виртуальный хост на порту 443 должен иметь конфигурацию обратного прокси-сервера.

На обратном прокси-сервере у вас должно быть что-то вроде этого:

<VirtualHost *:80>                                                      
    ServerName areverseproxy.example.com                                     
    ServerAlias areverseproxy                                                
    Redirect permanent / https://192.168.56.71                          
    ErrorLog "/var/log/httpd/areverseproxy.example.com-error_log"            
    CustomLog "/var/log/httpd/areverseproxy.example.com-access_log" common   
</VirtualHost>

<VirtualHost *:443>
    ServerName areverseproxy.example.com   
    ServerAlias areverseproxy                                                

    ErrorLog "/var/log/httpsd/areverseproxy.example.com-error_log"            
    CustomLog "/var/log/httpsd/areverseproxy.example.com-access_log" common   

    SSLEngine on
    SSLCertificateKeyFile conf/ssl.key/areverseproxy.example.com.key
    SSLCertificateFile conf/ssl.crt/areverseproxy.example.com.crt

    SSLProxyEngine on
    SSLProxyCheckPeerCN off
    SSLProxyCheckPeerExpire off
    SSLProxyCheckPeerName off

    ProxyRequests off
    ProxyPreserveHost on
    ProxyPass / https://192.168.56.70:443/
    ProxyPassReverse / https://192.168.56.70:443/
</VirtualHost>

У вас, вероятно, не будет действительного сертификата HTTPS на внутреннем хосте. Поэтому вам нужны SSLProxyCheck*директивы. Если на внутреннем хосте есть действительные сертификаты с именами, то вы можете удалить SSLProxyCheck*директивы, но в этом случае директивы ProxyPassи ProxyPassReverseдолжны указывать не на номер IP, как в примере, а на имя хоста из сертификата.

Вам также может не понадобиться HTTPS между proxyreverse и backend, если они находятся в одной защищенной сети. Если нет, оставьте HTTPS между обратным proxy и backend для защиты трафика.

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

Связанный контент