Configurar un proxy reverso o inverso en Apache

Si contamos con un servicio web (o más) en una LAN el cual es accedido desde Internet, podemos configurar un proxy reverso o inverso para ocultar los servidores que contienen realmente las aplicaciones web. En este caso, planteamos configurar un proxy reverso HTTP en Apache.

Para poder avanzar en esta solución hay 2 puntos a tener en cuenta:

Ahora sí vamos con los pasos:

1. Activar el módulo proxy

En la ubicación donde instalamos Apache, abrimo con un editor de textos el archivo: conf\httpd.conf y descomentamos las siguientes líneas:

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

2. Configurar un VirtualHost

Debemos crear un VirtualHost con la configuración básica actuar de proxy reverso:

<VirtualHost *:<PUERTO_EXTERNO> >
  ServerName <DOMINIO_EXTERNO>

  ProxyRequests Off
  ProxyPreserveHost Off
  ProxyPass /<PATH_EXT>/ http://<DOMINIO_INTERNO>:<PUERTO_INTERNO>/<PATH_INT>/
  ProxyPassReverse /<PATH_EXT>/ http://<DOMINIO_INTERNO>:<PUERTO_INTERNO>/<PATH_INT>/
</VirtualHost>

Analizamos cada una de las directivas:

<VirtualHost *:<PUERTO_EXTERNO> >

Define un VirtualHost. En lugar de * se podría indicar una dirección IP para que solamente se acceda al sitio a través de la misma y separado por dos puntos se indica el PUERTO_INTERNO donde se recibe la petición desde Internet

ServerName <DOMINIO_EXTERNO>

Indica el dominio donde se recibe la petición desde Internet

ProxyRequests Off

Evita que Apache funcione como un servidor proxy que realice forwarding (forward proxy server)

ProxyPreserveHost Off

No se utiliza el host que se indica en la petición que ingresa. Podría ser necesario en caso de que el servicio web lo requiera para evaluarlo de alguna manera.

ProxyPass /<PATH_EXT>/ http://<DOMINIO_INTERNO>:<PUERTO_INTERNO>/<PATH_INT>/

Realiza el mapeo del dominio externo a una url interna. El primer parámetro es un path dentro del DOMINIO_EXTERNO y el segundo es la correspondiente URL interna a la cual se convertirá.

Tip: si el primer parámetro termina con /, el segundo también debe hacerlo para evitar posibles errores en las construcciones de urls.

Ejemplo:

ProxyPassReverse /<PATH_EXT>/ http://<DOMINIO_INTERNO>:<PUERTO_INTERNO>/<PATH_INT>/

Ajusta la url de manera similar a ProxyPass pero en las redirecciones HTTP, dentro de las cabeceras: Location, Content-Location y URI. Es necesario para que funcione correctamente el proxy reverso, de lo contrario las redirecciones HTTP podrían saltarlo.

Ejemplo:

<VirtualHost *:80>
  ServerName externo.servicio.com

  ProxyRequests Off
  ProxyPreserveHost Off
  ProxyPass / http://interno.servicio.com:666/
  ProxyPassReverse / http://interno.servicio.com:666/
</VirtualHost>

En este caso podemos ver que Apache actuará como un proxy reverso para que cuando se acceda a http//externo.servicio.com:80/ se redirija la petición a http://interno.servicio.com:666/

3. Reiniciar Apache y probar

Una vez reiniciado el servicio de Apache podemos probar acceder a desde Internet al dominio externo (y al puerto externo), a partir de un navegador por ejemplo. Mediante DNS la petición se dirige hacia nuestro router LAN, el cual a través de la redirección de puertos la envía al equipo con Apache actuando de proxy reverso. Éste hace la conversión al dominio y puertos internos. La petición llega al servicio web interno correspondiente, quien finalmente la responde. Entonces esta respuesta sigue el mismo camino (pero ahora al revés) hasta mostrar la respuesta en el navegador. Las acciones de redirección de puertos y DNS no aplican en este sentido, pero la respuesta pasa por los dispositivos sabiendo a dónde debe dirigirse.

Tagged with: , ,
Publicado en Aplicaciones
One comment on “Configurar un proxy reverso o inverso en Apache
  1. […] estos puntos es la de implementar un proxy reverso con Apache. Recuerden seguir el instructivo para configurar un proxy reverso con Apache, utilizando un dominio externo configurado mediante un DDNS y realizando la redirección de puerto […]

Los comentarios están cerrados.