martes, 4 de abril de 2017

Configurar Reverse Proxy en Apache Linux

Versión apache2 en Linux Debian

   Para empezar explicare como funciona un servidor proxy, según Wikipedia, y en sencillas palabras; Un proxy, en una red informática, es un programa o dispositivo que realiza una acción en representación de otro, esto es, si una hipotética máquina A solicita un recurso a una C, lo hará mediante una petición a B; C entonces no sabrá que la petición procedió originalmente de A.



      
 Instalación y Configuración

 Lo primero que debemos hacer es instalar Apache2

      #apt-get install apache2

Para verificar que el servicio se haya instalado bastara con ver la dirección http://localhost
Si nos arroja la siguiente ventana es que el servicio está arriba:



       La instalación del Apache2 nos deja una estructura de carpetas y archivos en /etc/apache2 en la cual podemos ver que las carpetas existen en pares:

                     conf-available                  conf-enabled
·                    mods-available                mods-enabled
·                    sites-available                  sites-enabled

Adicional a esto se encuentra el archivo de configuración apache2.conf entre otros.

     Como podrán deducir, en una carpeta se encuentra lo “disponible” para usar y en la otra se encuentra  lo "habilitado".

El apache cuenta con 2 comandos básicos para habilitar y deshabilitar los módulos y sitios.
 - a2ensite y a2enmod para habilitar sitios y módulos respectivamente.
 - a2dissite y a2dismod para inhabilitar sitios y módulos respectivamente.

Nota: Los modulos pueden ser instalados de manera adicional en caso de no contener alguno que necesitemos.


     Dentro de la carpeta sites-available nos trae dos sitios 000-default.conf y default-ssl.conf, uno para el puerto 80 y otro para el puerto 443 (http y https respectivamente),  de estos sitios podemos crear una copia para editarlos y ahí construir nuestro servicio proxy. (nos posicionamos en la carpeta /etc/apache2/sites-available

  #cp 000-default.conf /etc/apache2/sites-available/servicios.conf
  #cp default-ssl.conf /etc/apache2/sites-available/servicios-ssl.conf

Ahora se tiene que habilitar los módulos que utilizaremos:
  #a2enmod proxy
  #a2enmod proxy_http
  #a2enmod proxy_ajp
  #a2enmod rewrite
  #a2enmod deflate
  #a2enmod headers
  #a2enmod proxy_balancer
  #a2enmod proxy_connect
  #a2enmod proxy_html

     Muy a menudo se desea configurar un servidor Apache como front-end para ocultar los servidores que contienen realmente las aplicaciones web. De este modo, sólo el Apache está en la DMZ, mientras que el servidor de back-end queda dentro de la red interna:

esquema_dmz

     Este esquema se puede utilizar sin importar el protocolo o puerto que utilice el servidor de back-end. Para poder implementar el proxy es necesario que el servidor apache tenga habilitados una serie de módulos, que dependen del protocolo a través del cual se desea atacar el servidor de back-end. En este ejemplo voy a suponer que el servidor de back-end está escuchando por el puerto 80.

Para el ejemplo utilizaremos los siguientes parámetros:
Servidor proxy: proxy.solovidabien.com
Servidor destino: destino.solovidabien:8080/consulta


<VirtualHost *:80>
                ErrorLog "/var/log/apache2/frontend-error.log"
                CustomLog "/var/log/apache2/frontend-access.log" common
                ServerName proxy.solovidabien.com                                  
                ServerAdmin administrador@solovidabien.com             
                ProxyRequests Off                                                                      
                ProxyPreserveHost On
                DocumentRoot /var/www/html

                ProxyPass /consulta http://destino.solovidabien:8080/consulta/
                ProxyPassReverse /consulta/ http://destino.solovidabien:8080/consulta/

                SetOutputFilter     proxy-html
                RequestHeader       unset Accept-Encoding
</VirtualHost>

Nota: Todo el archivo puede o no quedar igual, puesto que hay archivos que traen texto y otras opciones, pero lo importante es que cuente con los parametros antes escritos.

La directiva "ServerName" hace referencia a la URL a la que se dirige la petición. Deberá configurarse una entrada en el DNS que apunte al servidor.

La directiva ServerAdmin hace referencia al correo electrónico de contacto del administrador del servicio.

La directiva DocumentRoot /var/www/html hace referencia a la dirección de nuestro html local si contaramos con uno, de no llevar este parámetro no podríamos alojar una pagina web de manera local en el servidor.

La directiva ProxyRequests Off evita que el front-end sea utilizado como proxy, es decir, que usuarios puedan saltar al front-end y de ahí a cualquier otra dirección. Es muy importante dejarlo deshabilitado para evitar problemas de seguridad o incluso legales.

La directiva ProxyPreserveHost On permite que el salto del servidor de front-end al de back-end sea transparente para el usuario. Si no estuviera habilitada, el usuario se dirigiría a http://proxy.solovidabien.com pero inmediatamente vería como la dirección cambia a http://destino.solovidabien.com. Además, como en este supuesto el servidor de back-end no es visible desde Internet el usuario vería un error.

Por último, las directivas ProxyPass y ProxyPassReverse gestionan el salto y la vuelta del servidor de front-end al de back-end.

Una vez configurado nuestro vhost con el nombre servicios.conf solo nos queda habilitarlo  y reiniciar el servicio con los siguientes comandos:

  #a2ensite servicios.conf
  #service apache2 reload

Con esto ya tendremos habilitado nuestro servidor proxy, para el puerto 80.


Como habilitar el puerto 443 (https) 

1 comentario:

  1. Hola. excelente post! como puedo usar esta funcionalidad para habilitar el header Authorization y evitar el bloqueo por CORS ?

    ResponderEliminar