
Eu estava planejando implantar o proxy reverso usando Apache, mas antes de fazer isso no ambiente Prod, tentei implementar em meu laboratório doméstico. Tenho dois vms em execução no 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
no servidor Backend Apache eu fiz um host virtual, conteúdo desse 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>
E no servidor proxy reverso adicionei estas linhas para ativar o proxy reverso
<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>
Se eu tentar abrir o URLhttp://192.168.56.71ele irá redirecionar parahttps://192.168.56.70o que é ok se eu não tiver um servidor proxy reverso, mas no cenário de proxy reverso deveria serhttps://192.168.56.71
Alguém pode orientar quais mudanças devo fazer no servidor proxy reverso para que o URL permaneçahttps://192.168.56.71se eu digitar URLhttp://192.168.56.71
Muito obrigado
Depois de implantar no Prod Server
Erro
[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 /
Responder1
Você deve ter dois hosts virtuais no servidor proxy reverso. Eu recomendaria excluir as diretivas proxypass globais em um proxy reverso e especificá-las para cada host virtual.
O host virtual na porta 80 deve redirecionar para a porta 443 no mesmo host (areverseproxy.example.com) da mesma forma que você fez no servidor back-end. No entanto, ninguém deve mais entrar na porta 80 no backend, se você fizer o proxy reverso corretamente, a menos que o backend também seja acessível via internet.
O host virtual na porta 443 deve ter uma configuração de proxy reverso.
No proxy reverso você deve ter algo assim:
<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>
Você provavelmente não terá um certificado HTTPS válido no host backend. Portanto, você precisa de SSLProxyCheck*
diretivas. Se o backend tiver certificados válidos com nomes, você poderá excluir SSLProxyCheck*
as diretivas, mas nesse caso, as diretivas ProxyPass
e ProxyPassReverse
não devem apontar para um número IP, como no exemplo, mas para o nome do host do certificado.
Você também pode não precisar de HTTPS entre o proxyreverse e o backend, se eles estiverem na mesma rede protegida. Caso contrário, mantenha o HTTPS entre o proxy reverso e o back-end para proteger o tráfego.
Lembre-se de que os clientes se comunicarão apenas com o proxy reverso, por isso é importante que você tenha os certificados HTTPS corretos para o proxy reverso, não para o back-end.