Compartir a través de


Proxy inverso: plantilla de regla

de Ruslan Yakushev

Las plantillas de regla se usan para proporcionar una manera sencilla de crear una o varias reglas de reescritura para un escenario determinado. El módulo 2 de reescritura de direcciones URL incluye varias plantillas de regla para algunos escenarios de uso comunes. Además de la interfaz de usuario del módulo de reescritura de URL, ofrece un marco para integrar plantillas de reglas personalizadas. Este tutorial le guiará sobre cómo utilizar la plantilla de regla "proxy inverso" que se incluye con el módulo de reescritura de URLs. Para más información sobre cómo configurar el proxy inverso con el módulo de reescritura de direcciones URL de IIS y el enrutamiento de solicitudes de aplicación de IIS, consulte Proxy inverso con url Rewrite v2 y Enrutamiento de solicitudes de aplicación.

Prerrequisitos

Este tutorial requiere los siguientes requisitos previos:

  • IIS 7 o posterior con ASP.NET servicio de rol habilitado;
  • URL Rewrite Module 2.0 instalado;
  • IIS Application Request Routing instalado.

Crear el sitio web de ejemplo

Por motivos de simplicidad, el escenario de proxy inverso con el que trabajará en este tutorial se implementará en un solo servidor, con el "Sitio web predeterminado" de IIS que actúa como un sitio de proxy inverso y una aplicación de contenido hospedada en sitios web IIS independientes en el mismo servidor.

Para crear el sitio web de contenido de ejemplo:

  1. Cree una carpeta denominada "contentsite" en la carpeta siguiente:

    %SystemDrive%\inetpub\ folder.
    
  2. Cree un sitio web de IIS denominado "contentsite" que apunte a la carpeta correspondiente en %SystemDrive%\inetpub\. Use el puerto 8081 para el sitio.
    Puede usar los siguientes comandos para crear los sitios:

    %windir%\System32\inetsrv\appcmd.exe add site /name:"contentsite" /bindings:http/*:8081: /physicalPath:"%SystemDrive%\inetpub\contentsite
    
  3. Cree un archivo denominado default.aspx en la carpeta siguiente:

    %SystemDrive%\inetpub\contentsite
    
  4. Copie el siguiente código ASP.NET, péguelo en el archivo y guarde el archivo con el nombre default.aspx.

    <%@ Page Language="C#" %>
    <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
    <html xmlns="http://www.w3.org/1999/xhtml">
    <head>
    <meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
    <title>Reverse Proxy Test Application</title>
    </head>
    <body>
        <h1>Reverse Proxy Test Page</h1>
        <p>Requested URL path is <%= Request.ServerVariables["SCRIPT_NAME"] %></p>
        <p><a href="http://<%= Request.ServerVariables["HTTP_HOST"] + Request.ServerVariables["SCRIPT_NAME"] %>">Here</a> is the link to this page.</p>
    </body>
    </html>
    
  5. Para asegurarse de que el sitio funciona correctamente, abra un navegador web y acceda a las siguientes direcciones URL:

    http://localhost:8081/default.aspx
    

Generar reglas entrantes y salientes mediante la plantilla de proxy inverso

La plantilla de regla "Proxy inverso" se puede usar para generar una regla de reescritura entrante que se utiliza para dirigir las solicitudes HTTP a otro servidor. Opcionalmente, la plantilla también puede crear una regla de reescritura de salida que pueda corregir los nombres de host en las direcciones URL de vínculos dentro de las respuestas HTML. En el caso de ejemplo descrito en este tutorial, el nombre de host del servidor proxy es localhost y el nombre de host del servidor de contenido es localhost:8081. La aplicación web del servidor de contenido genera un vínculo en la respuesta HTML que usa un nombre de host interno, por ejemplo, http://localhost:8081/default.aspx. La regla de salida corrige este vínculo para usar el nombre de host del proxy, por ejemplo, http://localhost/default.aspx.

Para crear las reglas mediante la plantilla de regla, siga estos pasos:

  1. En el Administrador de IIS, seleccione el "Sitio web predeterminado" en la vista de árbol en el lado izquierdo.
  2. Abra la vista de características de reescritura de URL.
  3. En la vista de características de reescritura de direcciones URL, seleccione la acción "Agregar reglas..." y luego seleccione la plantilla "Proxy inverso":
    Captura de pantalla del cuadro de diálogo Agregar reglas que muestra las opciones de plantilla de regla. El proxy inverso está resaltado.
  4. En el cuadro de diálogo "Agregar reglas de proxy inverso", escriba lo siguiente:
    Nombre del servidor o dirección IP donde se reenviarán las solicitudes HTTP: localhost:8081
    Active la casilla "Reescribir los nombres de dominio de los vínculos en respuestas HTTP" y escriba:
    From: localhost:8081
    Para: localhost
    Captura de pantalla del cuadro de diálogo Agregar reglas de proxy inverso.
  5. Haga clic en Aceptar. Se crearán las reglas de entrada y salida:
    Captura de pantalla de I I S Manager que muestra la página de reescritura de U R L.

Prueba del proxy inverso

Para probar que las reglas de reescritura generadas por la plantilla de regla funcionan correctamente, abra un explorador web y realice una solicitud a http://localhost/default.aspx. IIS "Sitio web predeterminado" recibirá esta solicitud y la enrutará a http://localhost:8081/default.aspx de acuerdo con la regla de reescritura de entrada. Cuando se devuelve la respuesta HTTP desde el sitio web contentsite , la regla de reescritura de salida modifica la dirección URL del vínculo dentro del CÓDIGO HTML para volver a escribir el nombre de host de localhost:8081 a localhost:

Captura de pantalla de una ventana del explorador que muestra una página de prueba de proxy inverso.

Uso de ARR como proxy inverso para Servlets de Tomcat

Para agregar defensa en profundidad al hospedar servlets de Tomcat detrás de un proxy inverso IIS + ARR, use reglas de reescritura de URL para mitigar los ataques de recorrido de directorios. Estos ataques suelen aprovechar discrepancias en la forma en que Tomcat controla los parámetros de ruta de acceso dentro de los segmentos de dirección URL, por ejemplo, "/..; a=b/", como se describe en Consideraciones de seguridad de Apache Tomcat.

Por qué esto importa

Tomcat interpreta los parámetros de ruta de acceso basados en punto y coma de forma diferente a IIS, lo que puede ocasionar un comportamiento de navegación inesperado. Bloquear o normalizar estos patrones antes de que el módulo de ARR los controle ayuda a evitar la explotación.

Si su objetivo es simplemente bloquear las solicitudes que contienen intentos de recorrido (como "/..;a=b/"), use sintaxis comodín o expresión regular.

Ejemplo de regla de comodín

<rule name="BlockDotDotWildcard" enabled="true" patternSyntax="Wildcard" stopProcessing="true">
    <match url="*/..;*/*" />
    <action type="CustomResponse" statusCode="404" statusReason="Not Found" statusDescription="" />
</rule>

Ejemplo de regla RegEx

<rule name="BlockDotDotRegEx" stopProcessing="true">
    <match url="\/\.\.;.*\/" />
    <action type="CustomResponse" statusCode="404" statusReason="Not Found" statusDescription="" />
</rule>

Notas importantes

  • Pruebe exhaustivamente en el entorno de extremo a extremo. Es posible que necesite reglas adicionales para patrones codificados o con codificación doble (por ejemplo, %252F..%253Bfoo%252F).
  • El orden de las reglas es importante: asegúrese de que las reglas de bloqueo se ejecutan antes de las reglas relacionadas con el proxy de ARR.
  • Equilibrio de rendimiento: RegEx ofrece flexibilidad, pero conlleva una mayor sobrecarga.

Escenario avanzado: renormalización de direcciones URL

Si desea quitar parámetros de ruta de acceso y volver a normalizar la dirección URL para que todas las reglas de reescritura de URL se apliquen a la dirección URL normalizada, necesita realizar un redireccionamiento circular. Por ejemplo: Entrada: /abc/..;boo/xyz/ Redirigido a: /abc/../xyz/ → normalizado a /xyz/ → reevaluado mediante reglas de reescritura.

Regla de ejemplo

<rule name="RenormalizeURL_SSL" stopProcessing="true">
    <match url="^([^;]*)(;[^/]*)(/.*)$" />
    <conditions logicalGrouping="MatchAll" trackAllCaptures="false">
        <add input="{HTTPS}" pattern="ON" />
    </conditions>
    <action type="Redirect" url="https://{HTTP_HOST}/{R:1}{R:3}" redirectType="Found" />
</rule>
<rule name="RenormalizeURL" stopProcessing="true">
    <match url="^([^;]*)(;[^/]*)(/.*)$" />
    <conditions logicalGrouping="MatchAll" trackAllCaptures="false">
        <add input="{HTTPS}" pattern="OFF" />
    </conditions>
    <action type="Redirect" url="http://{HTTP_HOST}/{R:1}{R:3}" redirectType="Found" />
</rule>

Cuando RegEx se vuelve demasiado complejo

Para casos muy complejos, considere la posibilidad de escribir un proveedor de reescritura de direcciones URL personalizados.

Resumen

En este tutorial, aprendiste a utilizar la plantilla de regla "Proxy inverso" para generar reglas de reescritura que configuran un sencillo proxy inverso en IIS. Use esta plantilla de regla como punto de partida para generar las reglas base. Puede ajustar o modificar estas reglas más adelante para abordar los requisitos específicos de enrutamiento y reescritura de la aplicación web.