Después de implementar en Prod Server

Después de implementar en Prod Server

Estaba planeando implementar un proxy inverso usando Apache, pero antes de hacerlo en Prod env intenté implementarlo en el laboratorio de mi casa. Tengo dos máquinas virtuales ejecutándose en 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

en el servidor Backend Apache hice un host virtual, el contenido de ese 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> 

Y en el servidor proxy inverso agregué estas líneas para habilitar el proxy inverso

<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>

Si intento abrir la URLhttp://192.168.56.71se redirigirá ahttps://192.168.56.70lo cual está bien si no tengo un servidor proxy inverso, pero en un escenario de proxy inverso debería serlo.https://192.168.56.71

¿Alguien puede indicarme qué cambios debo realizar en el servidor proxy inverso para que la URL permanezca?https://192.168.56.71si escribo URLhttp://192.168.56.71

Muchas gracias

Después de implementar en Prod Server

error

[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 /

Respuesta1

Debería tener dos hosts virtuales en el servidor proxy inverso. Recomendaría eliminar las directivas globales de proxypass en un proxy inverso y especificarlas para cada host virtual.

El host virtual en el puerto 80 debe redirigir al puerto 443 en el mismo host (areverseproxy.example.com) de la misma manera que lo hizo en el servidor backend. Sin embargo, ya nadie debería ingresar el puerto 80 en el backend, si crea el proxy inverso correctamente, a menos que también se pueda acceder al backend a través de Internet.

El host virtual en el puerto 443 debe tener una configuración de proxy inverso.

En el proxy inverso deberías tener algo como esto:

<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>

Probablemente no tendrá un certificado HTTPS válido en el host backend. Por lo tanto, se necesitan SSLProxyCheck*directivas. Si el backend tiene certificados válidos con nombres, puede eliminar SSLProxyCheck*directivas, pero en ese caso, las directivas ProxyPassy ProxyPassReverseno deben apuntar a un número de IP, como en el ejemplo, sino al nombre de host del certificado.

Es posible que tampoco necesite HTTPS entre el proxy inverso y el backend, si están en la misma red protegida. Si no es así, mantenga el HTTPS entre el proxy inverso y el backend para proteger el tráfico.

Recuerde, los clientes se comunicarán únicamente con el proxy inverso, por lo que es importante que tenga los certificados HTTPS correctos para el proxy inverso, no para el backend.

información relacionada