Servidor Apache como Proxy Server & Reverse Proxy

Apache es de los servidores más populares y una de sus principales funciones en la que es utilizado es como servidor proxy, que básicamanete nos permite acceder a recursos de otros servidores a través de el mismo apache, y lo hace enrutando todo el tráfico y canalizandolo al servidor correspondiente.

Y esto es muy útil cuando queremos exponer aplicaciones o recursos web fuera de una red privada  por ejemplo:

  1. El usuario hace una petición a la dirección http://www.myweb.com
  2. La petición llega a un servidor apache que es el único que está expuesto a internet, todos los demás son accesibles únicamente dentro de la intranet.
  3. La aplicación a la que se quiere accesar se encuentra en el servidor http://intranet.local.com, que esta en la red privada.

Al colocar el servidor apache como proxy todas las peticiones van a llegar de manera transaparente a la aplicación que le corresponde.

¿Y como se hace?

Primero tienes que tener activados los siguientes módulos en tu apache:

  • proxy
  • proxy_html
  • headers
  • rewrite
  • ajp

La instalación puede variar por la versión del sistema operativo y la arquitectura del mismo (CentOS, SUSE, Fedora, Ubuntu, etc…), en google puedes ver como se activan🙂

Configuración

Proxy por http

Ahora editas el archivo de configuración de tu apache que generalemente es el “httpd.conf”  ( el nombre del archivo y la ubicación puede variar dependiendo de tu sistema operativo y de la versión, el mio esta en “/etc/apache2/” y estoy probando en un SLES 10).

Dentro del archivo, debes agregar las siguientes líneas:

<IFModule mod_proxy.c>
    <VirtualHost *:80>
        ServerAdmin webmaster@orbitalzero.com
        ServerName myserver.com
        ServerAlias tomcat.server
        ProxyPass / http://192.168.1.67:8080/mywebapp/
        ProxyPassReverse / http://192.168.1.67:8080/mywebapp/

        ProxyRequests Off
        ProxyPreserveHost On

        <proxy>
            Order deny,allow
            Allow from all
        </proxy>

    </VirtualHost>

</IFModule>

Escribí la dirección IP 192.168.1.67 como ejemplo, pero también puedes escribir el nombre del dominio por ejemplo http://intranet.local.com, yo recomiendo escribir la ip siempre y cuando sea estática y el DNS cuando son dinámicas.

Nota: Es muy importante cuidar las diagonles invertidas al final delas direcciones, además es recomendable  que la opción ProxyRequests se active únicamente cuando tu server cuenta con un certificado SSL.

Guardas los cambios y reinicias el servidor.

servive apache2 restart

Al ingresar a la dirección http://localhost/ el proxy va  a redireccionar el tráfico y te mostrará el contenido del sitio del otro server.

Proxy por https

Para que el servidor apache pueda redirecionar el tráfico hacía un sitio https debes cumplir con una simple regla:

“Tu servidor apache debe tener un certificado SSL instalado”

¿Suena fácil verdad?  aquí tengo un árticulo que explica como se hace.

Sin el certificado NO puedes continuar.

Ahora que ya lo tienes instalado vamos a editar el “httpd.conf” y vamos a agregar las siguientes líneas a la configuración:

<IFModule mod_ssl.c>
  <VirtualHost *:443>
    ServerName private.domain.com
    ServerAlias private.domain.com
    ProxyRequests on
    ProxyPreserveHost on

    #
    # https proxy
    #
    ProxyPass /secure/ https://192.168.1.67:8443/myWebApp/
    ProxyPassReverse /secure/  https://192.168.1.67:8443/myWebApp/
    ProxyPassReverseCookiePath /myWebApp /secure

    <proxy>
      Order deny,allow
      Allow from all
    </proxy>

    SSLEngine on
    SSLProxyEngine on
    SSLCertificateFile /etc/apache2/certs/privateserver.crt
    SSLCertificateKeyFile /etc/apache2/certs/privateserver.pem

  </VirtualHost>

</IFModule>

Vamos a describir cada elemento:

ProxyRequests: Lo activas para que redireccione el tráfico de forma segura con el certificado.

ProxyPreserveHost: indica que el cuerpo del request se va a mantener hasta llegar al servidor que está atrás del proxy, por ejemplo:

Si esta activo (on):

Si esta inactivo (off)

ProxyPass, ProxyPassReverse: Activan el enrutamiento del tráfico en ambos sentidos tanto del cliente hacía el server y viceversa.

ProxyPassRevereseCookiePath: Si la aplicación detrás del proxy maneja cookies es necesario para que sobreescriba el contenido de las mismas.

SSLEngine: Activa el motor para que apache utilice el protocolo SSL

SSLPRoxyEngine: Activa el motor SSL para que apache lo utilice con la función del proxy.

Entonces al ingresar a la dirección https://localhost/secure/ va a redireccionar el tráfico al sitio por https.

Adicionalmente si configuras el puerto 80 en lugar del 443 puesdes ver el contenido seguro del otro sitio (https) a través de http, es decir si tu solicitas la página  http://localhost/secure/ te va a mostrar el contenido seguro del otro sitio que por atras del proxy esta configurado por https.

Aquí dejo el ejemplo del archivo de configuración completo.

Proxy por ajp

Los servidores Java pueden utilizar el protcolo ajp, para el ejemplo usamos Tomcat que lo tiene habilitado por defecto por el puerto 8009, si tienes otro server puedes ver en google la forma de activarlo.

La ventaja de utilizar este protocolo es el rendimiento, ya que crea un canal de comunicación eficiente y exclusivo entre el apache y el server Java.

Para utilizarlo debes tener el instalado en el apache el módulo mod_ajp , casí todos los servidores apache lo tienen ya precargado.

Ahora editas el “http.conf” y agregas la siguiente configuración:

<IFModule mod_proxy.c>
    <VirtualHost *:80>

        ServerAdmin webmaster@orbitalzero.com
        ServerName myserver.com
        ServerAlias tomcat.server

        ProxyPass / ajp://192.168.1.67:8009/mywebapp/
        ProxyPassReverse / ajp://192.168.1.67:8009/mywebapp/

        ProxyRequests Off
        ProxyPreserveHost On

        <proxy>
            Order deny,allow
            Allow from all
        </proxy>

    </VirtualHost>

</IFModule>

Al ingresar a la página http://locahost/ to el tráfico será redireccionado a través del proxy y mostrará el contenido del sitio del otro server.

Saludos!

Referencias:

Un comentario en “Servidor Apache como Proxy Server & Reverse Proxy

Responder

Introduce tus datos o haz clic en un icono para iniciar sesión:

Logo de WordPress.com

Estás comentando usando tu cuenta de WordPress.com. Cerrar sesión / Cambiar )

Imagen de Twitter

Estás comentando usando tu cuenta de Twitter. Cerrar sesión / Cambiar )

Foto de Facebook

Estás comentando usando tu cuenta de Facebook. Cerrar sesión / Cambiar )

Google+ photo

Estás comentando usando tu cuenta de Google+. Cerrar sesión / Cambiar )

Conectando a %s