====== Apache: configuración de reverse proxy ======
//Por Félix Molinuevo, [[fmsi>|FMSI Sistemas de Informática]]//
===== Introducción =====
Un Apache reverse proxy es utilizado para tener un servidor HTTP como frontend, redirigiendo las peticiones hacia otros (uno o más) que se encuentran detrás de él, no accesibles directamente desde afuera de la intranet.
===== Configuración inicial =====
Se debe activar el módulo mod_rewrite, que provee reescritura de URLs y el módulo proxy_http, que provee el servicio de reverse proxy:
a2enmod proxy_http
a2enmod rewrite
Obviamente, si no están instalados, hay que instalarlo previamente. Lo mismo si se desea un proxy reverso HTTPS, se debe instalar el módulo ssl, y [[https://doc.fmsistemas.com/doku.php?id=servidores:openssl:ssl_cert_dummy_apache2|configurar lo necesario en Apache]].
===== Archivo de configuración de reverse proxy =====
Se debe editar un archivo /etc/apache2/sites-available/proxysrv con el siguiente contenido, activándolo luego:
NameVirtualHost *:80
ServerAdmin webmaster@localhost
ServerName host.dominio
# Rerverse proxy. No usamos ProxyPass porque impide que mod_rewrite
# funcione.
ProxyRequests Off
ProxyPassReverse / http://host.dominio/
ProxyPreserveHost on
# Este es un hack para incluir la REMOTE_ADDR en el header
# X-Forwarded-For. (Resulta que RequestHeader no puede ver la
# variable REMOTE_ADDR.)
RewriteEngine On
# RewriteCond %{REMOTE_ADDR} ^(.*)
# RewriteRule ^. - [env=MY_REMOTE_ADDR:%1]
# RequestHeader set X-Forwarded-For "%{MY_REMOTE_ADDR}e"
# Esta línea es la que hace el reverse proxy.
RewriteRule ^/(.*)$ http://host.dominio/$1 [P]
Order deny,allow
Allow from all
ErrorLog /var/log/apache2/error.log
# Possible values include: debug, info, notice, warn, error, crit,
# alert, emerg.
LogLevel info
CustomLog /var/log/apache2/access.log combined
ServerSignature On
# Para solucionar errores:
# Error reading from remote server
SetEnv force-proxy-request-1.0 1
SetEnv proxy-nokeepalive 1
ServerAdmin webmaster@localhost
ServerName host.dominio
ServerAlias host1.dominio host2.dominio host3.dominio
# Rerverse proxy. No usamos ProxyPass porque impide que mod_rewrite
# funcione.
SSLProxyEngine On
ProxyRequests Off
ProxyPassReverse / https://host.dominio/
ProxyPreserveHost on
# Este es un hack para incluir la REMOTE_ADDR en el header
# X-Forwarded-For. (Resulta que RequestHeader no puede ver la
# variable REMOTE_ADDR.)
RewriteEngine On
# RewriteCond %{REMOTE_ADDR} ^(.*)
# RewriteRule ^. - [env=MY_REMOTE_ADDR:%1]
# RequestHeader set X-Forwarded-For "%{MY_REMOTE_ADDR}e"
# Esta línea es la que hace el reverse proxy.
RewriteRule ^/(.*)$ https://host.dominio/$1 [P]
Order deny,allow
Allow from all
ErrorLog /var/log/apache2/error.log
# Possible values include: debug, info, notice, warn, error, crit,
# alert, emerg.
LogLevel info
CustomLog /var/log/apache2/access.log combined
ServerSignature On
SSLEngine On
# SSL Cipher Suite:
# List the ciphers that the client is permitted to negotiate.
# See the mod_ssl documentation for a complete list.
SSLCipherSuite ALL:!ADH:!EXPORT56:RC4+RSA:+HIGH:+MEDIUM:+LOW:+SSLv2:+EXP:+eNULL
# Server Certificate:
# Point SSLCertificateFile at a PEM encoded certificate. If
# the certificate is encrypted, then you will be prompted for a
# pass phrase. Note that a kill -HUP will prompt again. A test
# certificate can be generated with `make certificate' under
# built time.
#SSLCertificateFile conf/ssl/server.crt
SSLCertificateFile /etc/apache2/ssl/server.pem
SetEnvIf User-Agent ".*MSIE.*" nokeepalive ssl-unclean-shutdown
# Para solucionar errores:
# Error reading from remote server
SetEnv force-proxy-request-1.0 1
SetEnv proxy-nokeepalive 1
===== Configuración de los servidores internos =====
Los servidores internos no necesitan tener configuración alguna especial para que funcionen con el proxy reverso. Sin embargo, los logs mostrarán la IP del proxy, en vez de la IP que realmente se está conectando.
Para solucionar eso, se debe agregar a la configuración de los mismos, por ejemplo en el httpd.conf, una línea como la siguiente:
LogFormat "%V (Intranet host: %h) %{X-Forwarded-For}i %l %u %t \"%r\" %s %b" common
La configuración exacta de esa línea va a depender de las necesidades del administrador, así como de la configuración del servidor. Para más información, se debe leer la [[http://httpd.apache.org/docs/2.0/mod/mod_log_config.html#logformat|documentación sobre la directiva LogFormat en el sitio de Apache]].