Поделиться через


Обратный прокси-сервер — шаблон правила

Руслан Якушев

Шаблоны правил используются для предоставления простого способа создания одного или нескольких правил перезаписи для определенного сценария. Модуль переопределения URL-адресов 2 включает несколько шаблонов правил для некоторых распространенных сценариев использования. Помимо этого, пользовательский интерфейс модуля переопределения URL-адресов предоставляет платформу для интеграции пользовательских шаблонов правил. В этом пошаговом руководстве описано, как использовать шаблон правила обратного прокси-сервера, который входит в модуль перезаписи URL-адресов. Дополнительные сведения о настройке обратного прокси-сервера с помощью модуля переопределения URL-адресов IIS и маршрутизации запросов приложений IIS см. в обратном прокси-сервере с помощью переопределения URL-адресов версии 2 и маршрутизации запросов приложений.

Предпосылки

В этом пошаговом руководстве требуются следующие предварительные требования:

  • IIS 7 или более поздней версии с включенной службой ролей ASP.NET;
  • Установлен модуль переопределения URL-адресов 2.0;
  • Установленная маршрутизация запросов приложений IIS.

Создание примера веб-сайта

Для простоты сценарий с обратным прокси-сервером, с которым вы будете работать в этом пошаговом руководстве, будет реализован на одном сервере. IIS "Веб-сайт 'По Умолчанию'" будет выполнять роль обратного прокси-сайта, в то время как приложение контента будет размещено на отдельных веб-сайтах IIS на том же сервере.

Чтобы создать пример веб-сайта содержимого, выполните следующие действия.

  1. Создайте папку с именем contentsite в следующей папке:

    %SystemDrive%\inetpub\ folder.
    
  2. Создайте веб-сайт IIS с именем "содержимое", указывающий на соответствующую папку в разделе %SystemDrive%\inetpub\. Используйте порт 8081 для сайта.
    Для создания сайтов можно использовать следующие команды:

    %windir%\System32\inetsrv\appcmd.exe add site /name:"contentsite" /bindings:http/*:8081: /physicalPath:"%SystemDrive%\inetpub\contentsite
    
  3. Создайте файл с именем default.aspx в следующей папке:

    %SystemDrive%\inetpub\contentsite
    
  4. Скопируйте следующую ASP.NET разметку, вставьте его в файл и сохраните файл как 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. Чтобы убедиться, что сайт работает правильно, откройте веб-обзор и запросите следующие URL-адреса:

    http://localhost:8081/default.aspx
    

Создание правил для входящего и исходящего трафика с помощью шаблона обратного прокси-сервера

Шаблон правила обратного прокси-сервера можно использовать для создания правила перезаписи входящего трафика, которое используется для прокси-запросов HTTP на другой сервер. При необходимости шаблон также может создать правило перезаписи для исходящего трафика, которое исправляет имена хостов в URL-адресах ссылок в HTML-ответах. В примере, описанном в этом пошаговом руководстве, имя узла прокси-сервера — localhost , а имя узла сервера контента — localhost:8081. Веб-приложение на сервере содержимого создает ссылку в HTML-ответе, использующем внутреннее имя узла, например. http://localhost:8081/default.aspx Правило исходящего трафика исправляет эту ссылку, чтобы использовать имя узла прокси-сервера, например. http://localhost/default.aspx

Чтобы создать правила с помощью шаблона правила, выполните следующие действия.

  1. В диспетчере IIS выберите "Веб-сайт по умолчанию" в представлении дерева слева.
  2. Откройте представление функции перезаписи URL-адресов.
  3. В представлении функций переопределения URL-адресов выберите "Добавить правила...". действие и выберите шаблон обратного прокси-сервера:
    Снимок экрана: диалоговое окно
  4. В диалоговом окне "Добавление правил обратного прокси-сервера" введите следующее:
    Имя сервера или IP-адрес, в котором будут перенаправлены HTTP-запросы: localhost:8081
    Установите флажок "Переписать доменные имена ссылок в ответах HTTP" и введите:
    От: localhost:8081
    To: localhost
    Снимок экрана: диалоговое окно
  5. Нажмите кнопку "ОК". Будут созданы правила для входящих и исходящих соединений.
    Снимок экрана диспетчера IIS, на котором отображается страница URL Rewrite.

Тестирование обратного прокси-сервера

Чтобы проверить, правильно ли работают правила перезаписи, созданные шаблоном правил, откройте веб-браузер и отправьте запрос http://localhost/default.aspx. IIS "Веб-сайт по умолчанию" получит этот запрос и перенаправит его в http://localhost:8081/default.aspx соответствии с правилом входящего переопределения. Когда HTTP-ответ возвращается с сайта contentsite, правило перезаписи исходящих данных перезаписывает URL-адрес ссылки в HTML, чтобы изменить имя узла с localhost:8081 на localhost:

Снимок экрана: окно браузера с страницей тестов обратного прокси-сервера.

Использование обратного прокси-сервера ARR для Tomcat Servlets

Чтобы обеспечить многоуровневую защиту при размещении сервлетов Tomcat за обратным прокси-сервером IIS + ARR, используйте правила перезаписи URL-адресов для смягчения атак методом обхода директорий. Эти атаки часто используют несоответствия в том, как Tomcat обрабатывает параметры пути в сегментах URL-адресов, например "/.; a=b/" как описано в рекомендациях по безопасности Apache Tomcat.

Почему это важно

Tomcat интерпретирует параметры пути, основанные на точке с запятой, отлично от IIS, что может привести к неожиданному поведению при обходе. Блокировка или нормализация таких шаблонов перед обработкой модуля ARR помогает предотвратить эксплуатацию.

Если ваша цель — просто блокировать запросы, содержащие обходные попытки (например, "/.". a=b/"), используйте синтаксис подстановочного знака или регулярного выражения.

Пример правила подстановочного знака

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

Пример правила RegEx

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

Важные примечания

  • Тщательно протестируйте в среде полного цикла. Вам могут потребоваться дополнительные правила для закодированных или двойных шаблонов (например, %252F.%253Bfoo%252F).
  • Порядок выполнения правил имеет значение: убедитесь, что правила блокировки выполняются перед правилами, связанными с прокси-сервером ARR.
  • Компромисс с производительностью: RegEx предлагает гибкость, но вызывает более высокие издержки.

Расширенный сценарий: ренормализация URL-адресов

Если вы хотите удалить параметры пути и нормализовать URL-адрес, чтобы все правила URL-перезаписи применялись к нормализованному URL-адресу, потребуется обратное перенаправление. Например: входные данные: /abc/..;boo/xyz/ Перенаправлено на: /abc/../xyz/ → нормализовано → /xyz/ повторно вычисляется правилами перезаписи.

Пример правила

<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>

Когда RegEx становится слишком сложным

В очень сложных случаях рекомендуется написать кастомизированного провайдера переадресации URL.

Сводка

В этом пошаговом руководстве вы узнали, как использовать шаблон правила обратного прокси-сервера для создания правил перезаписи, реализующих простую конфигурацию обратного прокси-сервера в IIS. Используйте этот шаблон правила в качестве отправной точки для создания базовых правил. Эти правила можно изменить позже, чтобы решить конкретные требования к маршрутизации и перезаписи веб-приложения.