Servidor proxy inverso con IIS

17 septiembre 2016
Josep Ma Solanes 19

Desde la retirada de Microsoft ISA/TMG del catálogo de productos, mi preocupación ha sido encontrar una aplicación que me realizara las funciones de proxy inverso y parece ser que ya he encontrado la alternativa.

¿Por qué es útil un proxy inverso?

Un proxy inverso permite compartir en una misma dirección IP y por el mismo puerto TCP diferentes servicios web, separándolos mediante una parte de la dirección URL por la que se hace la petición. Pongo un ejemplo. Si necesito publicar el servicio de correo electrónico Web (correo.jmsolanes.cat), el portal colaborativo (portal.jmsolanes.cat) y quizás una granja de escritorios virtuales (escritorios.jmsolanes.cat); pero sólo dispongo de una única IP pública.

Tengo algunas opciones:

  • Utilizar el cortafuegos para publicar los diferentes servicios con un puerto público diferente y mediante el NAT conectar con servicio interno. Ejemplo:
    • Correo web por el puerto 80 externo hacia el 80 interno del servidor de correo.
    • Portal colaborativo por el puerto 81 externo hacia el 80 interno del servidor del portal.
    • Escritorios virtuales por el puerto 82 externo hacia el 80 interno del servidor de conexiones de escritorios virtuales.

Inconvenientes. Que desde dentro de la red, se utiliza un puerto concreto y estándar al servicio (80). En cambio para las conexiones exteriores se utiliza un puerto diferente en cada servicio y no estándar. Eso quiere decir que el usuario, deberá especificar en cada caso el puerto de servicio para acceder (correo.jmsolanes.cat; portal.jmsolanes.cat:81; escritorios.jmsolanes.cat:82). No es práctico para los usuarios os lo aseguro.

  • Utilizar un servicio de proxy inverso, que detecta el nombre de la petición y permite pasar la petición a otro equipo. Esta función la hacía a la perfección Microsoft ISA/TMG, o también otros dispositivos del tipo appliance (hardware específico), etc…

Me diréis que si ya hay otros dispositivos que lo hacen, ¿por qué complicar la vida? Pues porque no todos los clientes se pueden permitir adquirir y/o mantener un appliance de este tipo para unas pocas conexiones que pueden tener al día y se tiene que dar solución a todos.

¿Qué se hace?

El esquema enseña la estructura lógica de servicios para mejor entendimiento de lo que se hace. Un equipo cliente quiere conectar a un servicio web. Primero se hace una petición de la dirección URL (correo.jmsolanes.cat) al servicio DNS que devuelve la dirección IP del servidor proxy (192.168.0.50). De esta manera, el cliente hace la comunicación al servidor proxy (192.168.0.50).

El servidor proxy lee el encabezamiento de la petición que le llega (correo.jmsolanes.cat), comprueba en su lista de reglas o sitios webs que sirve. Encuentra la regla que coincide con el encabezamiento (correo.jmsolanes.cat) que dice que debe encaminar la petición a la IP 192.168.0.51.

La petición llega al servidor de correo (192.168.0.51) con el encabezamiento original (correo.jmsolanes.cat). Al tener el servidor sólo un único sitio web proporciona los datos solicitados. En el caso del portal y la extranet, el servidor de Extranet (192.168.0.52), vuelve a leer el encabezamiento y devuelve el sitio web indicado a la misma (portal… o extranet…).

proxyinvers-00

 

¿Con qué lo soluciono pues?

Con un servidor Microsoft Windows Server 2008R2/2012, Internet Information Services 7/8, la característica .NET Framework 3.5. y el módulo Application Request Routing (ARR).

¿Cómo lo hacemos?

Instalar el rol de Internet Information Services (IIS)

Partiendo de una instalación estándar de Microsoft Windows Server 2012, añadir el rol de Internet Information Services 8. Para hacerlo, accedemos al Administrador del servidor, opción «Panel» y hacer clic en «Agregar roles y características«. A la pregunta del tipo de instalación, seleccionar «Instalación basada en características o en roles» y hacer clic en «Siguiente«.

proxyinvers-01 proxyinvers-02

En servidor de destino, marcar «Seleccionar un servidor del grupo de servidores» y hacer clic en «Siguiente«. De la lista de roles, marcar Servidor web (IIS), sale una advertencia de la necesidad de disponer las herramientas de administración, hacer clic en «Agregar características»

proxyinvers-03 proxyinvers-04 proxyinvers-14

 

 

En características, marcar la opción «Características de .NET Framework 3.5» ya que es un requisito para el módulo ARR.

En caso de querer instalar esta característica desde los archivos de instalación, sin conexión a Internet, abriendo una consola con privilegios de administrador, escribir la siguiente instrucción (cambiando, si es necesario, la unidad donde se encuentra la carpeta sources):

dism /online /enable-feature /featurename:netfx3 /all /source:d:\sources\sxs

Se configuran las opciones de instalación de IIS, hacer clic en «Siguiente«.

proxyinvers-16

Marcar las siguientes opciones:

  • Servidor Web
    • Características HTTP comunes
      • Contenido estático
      • Documento predeterminado
      • Errores HTTP
      • Examen de directorios
  • Estado y diagnóstico
    • Registro HTTP
  • Rendimiento
    • Compresión de contenido estático
  • Seguridad
    • Filtrado de solicitudes
  • Herramientas de administración
    • Consola de administración de IIS

Una vez marcados todos, hacer clic en «Siguiente«. Se puede repasar la lista de características. Si todo está correcto, hacer clic en «Instalar«. Esperar hasta que se acabe la instalación y ya se puede cerrar el asistente, hacer clic en «Cerrar«.

proxyinvers-17 proxyinvers-18

 

Instalar el módulo Application Request Routing (ARR)

A fecha de hoy hay disponible la versión 3.0. que es la utilizada. Al no ser una aplicación integrada al sistema operativo, hay que descargarla antes. Por lo tanto, desde un navegador acceder a la Web http://www.iis.net/downloads/microsoft/application-request-routing. Seleccionar Install this extension y a continuación Web platform Installer. Descargar el archivo del enlace.

proxyinvers-05 proxyinvers-06

Con permisos de administrador, hacer doble clic en el archivo descargado. Seguir las instrucciones de la propia aplicación, que de hecho lo hace sólo. Acabada la instalación del «Web platform Installer», se pone en marcha la instalación del enrutador de solicitudes de aplicaciones (ARR). Hacer clic en «Instalar«.

proxyinvers-10 proxyinvers-11

Aceptar las condiciones y continuar. Al terminar, es necesario reinicializar el equipo. Hacer clic en Si.

proxyinvers-13 proxyinvers-19  proxyinvers-20

Después de reinicializar, continúa la instalación hasta completar.

proxyinvers-21 proxyinvers-22

 

 

Configuración ARR

Abrir la consola de administración de Internet Information Services IIS. Por ejemplo, desde el administrador del servidor, seleccionar el menú Herramientas Administrador de Internet Information Services (IIS). Puede ser que solicite el uso de la plataforma web de Microsoft para conectar a los componentes de la plataforma web más recientes. Hacer clic en Si.

proxyinvers-23 proxyinvers-24

Ya con la consola abierta, seleccionar el nombre del servidor y desplegar el árbol de opciones. Si todo está correcto, sale una nueva rama llamada «Server Farms«.

proxyinvers-25 proxyinvers-27

Toca crear una granja para cada grupo de servidores web donde se quiere enrutar el tráfico. Siguiendo el ejemplo, se tendría que crear una granja para el correo electrónico, una para el portal y otra para los escritorios. A continuación se describe el proceso, par crear una, el resto, es cosa de las necesidades de cada solución.

Crear una granja

Botón derecho en la rama Server Farms y seleccionar «Create Server Farm«. Introducir el nombre de la granja, dejar marcado Online y hacer clic en «Siguiente«. Introducir la dirección IP del servidor que dispone del servicio que queremos enrutar, por ejemplo, el servidor de correo electrónico OWA. Dejar marcado Online (esta opción sirve para el mantenimiento del servidor en caso que hubiera más de un servidor que mantuviera el servicio). Hacer clic en Add. En «Advanced settings» se puede cambiar el puerto de los protocolos http (80) y https (443) por defecto donde se tiene que hacer la petición. En este caso se deja por defecto, no hay que tocarlo. Hacer clic en Finalizar.

proxyinvers-07 proxyinvers-08 proxyinvers-29

Pregunta si se quieren crear las reglas para las rutas, hacer clic en Si para finalizar.

proxyinvers-30

 

Toca personalizar la configuración de la granja para que funcionen correctamente las peticiones de proxy inverso. Seleccionar la granja, en la parte derecha aparecen los iconos de opciones.

 

proxyinvers-31

 

CACHING. Memory cache duration a 60. Desmarcar Enable disk cache. Desmarcar Enable request consideration. Dejar Query string support a Ignore query string.

proxyinvers-42

 

PROXY. Http version: Pass through. Marcar Keep alive. Time-out a 30. Desmarcar Reverse rewrite host in response headers.

Custom Headers. Preserve client IP in the following headers: X-Forwarded-For. Marcar Include TCP port from client IP. Forward encoded client certificate in the following header: X-ARR-ClientCert. Mark request logs with GUIDs in the following header: X-ARR-LOG-ID.

Buffer Settings. Response buffer: 4096. Response buffer threshold: 256.

proxyinvers-43

 

ROUTING RULES. Marcar Use URL rewrite to inspect incoming requests. Desmarcar Enable SSL offloading. Las extensiones y los patrones configurar según las necesidades. En este caso se dejan en blanco.

proxyinvers-44

 

Crear las reglas de enrutamiento

Las reglas de enrutamiento para el proxy inverso se crean en la raíz del servidor, no en los diferentes sitios web. Desde el administrador de Internet Information Services (IIS) seleccionar el servidor. En la parte derecha, salen las diferentes opciones. En el apartado IIS, hacer clic en la opción «Reescritura de dirección URL«. En la imagen se pueden observar ya unas cuantas reglas creadas.

proxyinvers-01 proxyinvers-50

En el menú de acciones de la derecha, hacer clic en «Agregar reglas…» y en el cuadro que sale, en el apartado «Reglas de entrada«, seleccionar «Regla en blanco» y hacer clic en «Aceptar«.

proxyinvers-51

Se crea una nueva regla de entrada.

proxyinvers-52

Para un enrutamiento sencillo leyendo el encabezamiento para HTTP, la configuración es:

  • Nombre: el que corresponda.

Coincidir dirección URL:

    • Dirección URL solicitada: Coincide con el patrón
    • Usando: Expresiones regulares
    • Patrón: (.*)
    • Marcar Omitir mayúsculas y minúsculas

Condiciones

  • Entrada: {HTTP_HOST}
  • Tipo: Coincide con el patrón
  • Patrón: URL del dominio (Ejemplo: correo.jmsolanes.cat. En caso de tener varias URLs en el mismo servidor, separarlas con el símbolo de encadenamiento |. Para el servidor de extranet sería: portal.jmsolanes.cat|extranet.jmsolanes.cat.
  • Desmarcar Seguir los grupos de capturas a través de condiciones.

Variables de servidor

  • Dejar en blanco.

Acción

  • Tipo de acción: Enrutar a granja de servidores
  • Propiedades de la acción
    • Esquema: http://
    • Granja de servidores: la que corresponda
    • Ruta de acceso: /{R:0}
  • Marcar Detener el procesamiento de las reglas siguientes, para evitar que continue buscando.

proxyinvers-53 proxyinvers-54

Quan todo esté correcto, en la barra lateral derecha, hacer clic en la opción «Aplicar«.

Para aplicar los cambios en el servidor Internet Information Services (IIS), hay que reinicializarlo.

Abrir una consola de sistema con privilegios de administrador y ejecutar la instrucción:

iisreset

proxyinvers-55

 

Si todo está correcto, volviendo al ejemplo del diagrama, cuando se hace una petición URL que apunta a la IP del servidor proxy, este repasa la lista de reglas. Si encuentra la coincidente, enruta la petición al servidor correspondiente, para devolver el resultado esperado (servidor de correo, portal o extranet).

proxyinvers-59 proxyinvers-60 proxyinvers-61

 

¿Te ha gustado el artículo? Lo puedes compartir en las redes sociales. También puedes dejar tu opinión, comentario o sugerencia. ¡Gracias!

Similar Posts by The Author:

 

19 comentaris per a
“Servidor proxy inverso con IIS”

  1. Buenas tardes. Solo una pregunta, el reverse me funciona a la perfeccion pero solo con patrones descritos en el post, sin embargo para direcciones con www. no funciona. Dice que no encuentra el recurso. Que podria estar pasando o que tendria que hacer adicional?

    Saludos

     
    1. Hola Carlos,

      el sistema tiene que ser capaç de resolver el www. Existen estos nombres en la red interna? Piensa que los patrones son con la variable HOST, con lo que no implica nada a nivel de www. El error que estás comentando que no encuentra recurso es muy habitual en NO poder resolver la dirección donde reenvías el paquete. Asegúrate de la resolución de nombres tanto en el servidor proxy como en el destino.

      Saludos,

       
  2. Joder! Así sí. Así sí. Gracias por tu tiempo en esta entrada. Me ha encantado lo conciso que has sido. Las fotos con poca resolución y hay veces que me ha faltado un por qué, pero te repito me ha encando. Saludos!

     
  3. Se puede utilizar para redireccionar trafico que llega a una ip y puerto UDP que solo envia y no busca respuesta? o sea todo el trafico que llego por ejemplo al puerto 8123 UDP sea redirigido a un ip publica con el mismo puerto?

     
    1. Esto que comentas seria más bien un NAT, no un proxy inverso. El caso del proxy inverso es enmascarar las direcciones internas a partir de una pública. El equipo cliente se conecta únicamente al servicio del proxy reverso, no al punto final. Mediante un NAT si tendrías esta funcionalidad de redirigir el tráfico al punto final.

      Como proxy inverso básico tienes el de Windows, si requieres de funcionalidades más avanzadas como la que comentas deberías ir a un Citrix NetScaler o F5, por ejemplo.

       
  4. Hola¡¡¡

    Muy buen post.

    Tengo un iis con dominios funcionando. ¿puedo añadir una granja con una ip propia y que el resto de dominios sigan funcionando como hasta ahora? O¿ tiene que estar el iis en exclusiva con la granja?

    Muchas gracias

     
    1. Entiendo granja del proxy reverso? La respuesta seria sí, ya que el control lo haces por el FQDN, no por la IP.
      Si te refieres a granja balanceada, entonces en todos los IIS, deberías crear las reglas de reescritura.

      Saludos,

       
  5. Buenas, lo primero estupendo post, mi duda es la siguiente, tengo un equipo con varias maquinas virtuales, 1 windows 2012 server y 2 ubuntu, todas las peticiones tienen que pasar por el w2012 y el derivar a un ubuntu u otro, ¿con esto seria posible? antes lo tenia implantado y funcionando en w2003, pero obviamente me he visto forrzado a migrar y actualizar y hacer malabares con ubuntu, gracias de antemano

     
  6. Excelente post!
    Esto también sirve para tener un contingencia de los sitios? Por ejemplo si cae un servidor que por reglas en el proxy reverse el sitio responda desde otro servidor.

     
    1. Comprueba bien las variables que introduces, no tiene porqué duplicar. Comprueba también los códigos de retorno de las aplicaciones a las que redirecciones, a veces, el desarrollo no es como debería ser.

       
  7. Muchas gracias Jose María. Muy bien explicado y muy didáctico. Tengo un duda, si quiero utilizar https, entiendo que instalaré el certificado ssl en el servidor que hace de proxy inverso, pero ¿qué certificado instalo en el el servidor destino?. Si instalo el mismo, dará error porque el nombre no coincide, y si instalo otro con otro nombre (url) entiendo que tambien dará error porque el nombre se traslada en la petición del proxy inverso ¿no?.

     
    1. Debes instalar el certificado que contenga el nombre del servidor interno.

      Cuando haces una petición al proxy inverso, esta llega al mismo y termina el túnel. A la vez, genera un nuevo túnel al equipo destino. Al servidor interno nunca le llega la petición pública que le llega al servidor proxy inverso.

       
  8. buenos dias,
    necesito poner el iis para que haga de proxy https y que todo el trafico a traves del 443 se envie a otro iis y la respuesta tambien pase por el proxy y despues al equipo cliente. Siguiendo tu explicacion no me funciona. me da HTTP Error 502.3 – Bad Gateway. Entre el servidor proxy y el webserver destino (con IIS) hay un firewall. Actualmente solo he abierto el puerto tcp 443 en ese sentido. es necesario abrir el 443 en sentido inverso tambien? por otro lado es necesario abrir el puerto de gestion de iis del webserver destino para que funcione «Server farm»? o unicamente con la apertura del puerto 443 es suficiente.
    muchas gracias por tu tiempo y por tu trabajo.

     
    1. Sergio, revisa el visor de Eventos de aplicación por si hace crash el servicio. He detectado que en instalaciones recientes, dependiendo de las versiones de Framework y sistema operativo, el servicio hace crash.

      Por desgracia, me ha pasado en casos recientes y no he encontrado una solución de 0 para poder levantar. A veces copiando las DLL funciona, a veces reinstalando el Framework, etc… En definitiva, no muy claro de porqué funciona o no. De momento estoy buscando otra alternativa.

       

Deixar un comentari

Recorda que no es contestaran preguntes personals, només d´interés comú que ens enriqueixin a tots.
La teva adreça de correu electrònic no serà publicada. Els camps obligatoris estan indicats.

Este sitio usa Akismet para reducir el spam. Aprende cómo se procesan los datos de tus comentarios.