Обратный прокси-сервер с переопределением URL-адресов версии 2 и маршрутизацией запросов приложений

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

В этом пошаговом руководстве описано, как использовать модуль переопределения URL-адресов и маршрутизацию запросов приложений (ARR) для реализации обратного прокси-сервера для нескольких внутренних приложений.

Необходимые условия

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

  1. IIS 7 или более поздней версии с включенной службой ролей ASP.NET.
  2. Установленный модуль переопределения URL-адресов (версия 2.0 требуется, если вы хотите завершить часть о перезаписи ответов)
  3. Установленная маршрутизация запросов приложений версии 1.0 или версии 2.0

Введение

С помощью модуля перезаписи URL-адресов и маршрутизации запросов приложений можно реализовать сложную и гибкую балансировку нагрузки и конфигурации обратного прокси-сервера. Очень распространенный сценарий обратного прокси-сервера — сделать доступными несколько внутренних веб-приложений через Интернет. Веб-сервер, доступный в Интернете, используется в качестве сервера обратного прокси-сервера, который получает веб-запросы, а затем перенаправит их в несколько приложений интрасети для обработки: На следующем рисунке показана типичная конфигурация для сценария обратного прокси-сервера:

Схема типичной конфигурации для сценария обратного прокси-сервера.

Если у сервера ARR есть доменное имя http://contoso.com, доступ к каждому веб-приложению можно получить с помощью следующих URL-адресов:

  • http://contoso.com/webmail/
  • http://contoso.com/payroll/

Когда запрос поступает на http://contoso.com/webmail/default.aspx, ARR перенаправляет эти запросы на внутренний сервер с помощью URL-адреса http://webmail/default.aspx. Аналогичным образом запросы http://contoso.com/payroll/ пересылаются в http://payroll/default.aspx.

Кроме того, если внутреннее приложение вставляет ссылки в HTML-код ответа, который ссылается на другие места в этих приложениях, эти ссылки следует изменить перед возвратом ответа клиенту. Например, страница с http://webmail/default.aspx может содержать такую ссылку, как эта:

<a href="/default.aspx?id=1">link</a>

Затем сервер ARR должен изменить эту ссылку на следующую:

<a href="/webmail/default.aspx?id=1">link</a>

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

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

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

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

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

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

    %SystemDrive%\inetpub\webmail
    
  4. Скопируйте следующую разметку ASP.NET, вставьте ее в файл и сохраните файл:

    <%@ 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 - WebMail Application</title>
    </head>
    <body>
        <h1>Reverse Proxy Test Page - WebMail Application</h1>
        <p>Requested URL path is <%= Request.ServerVariables["SCRIPT_NAME"] %><p>
        <p><a href="<%= Request.ServerVariables["SCRIPT_NAME"] %>">Here</a> is the link to this page.</p>
    </body>
    </html>
    
  5. Создайте файл с именем default.aspx в следующей папке:

    %SystemDrive%\inetpub\payroll
    
  6. Скопируйте следующую разметку ASP.NET, вставьте ее в файл и сохраните файл:

    <%@ 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 - Payroll Application</title>
    </head>
    <body>
        <h1>Reverse Proxy Test Page - Payroll Application</h1>
        <p>Requested URL path is <%= Request.ServerVariables["SCRIPT_NAME"] %><p>
        <p><a href="<%= Request.ServerVariables["SCRIPT_NAME"] %>">Here</a> is the link to this page.</p>
    </body>
    </html>
    
  7. Чтобы убедиться, что сайты работают правильно, откройте веб-обзор и запросите следующие URL-адреса:

    http://localhost:8081/default.aspx
    
    http://localhost:8082/default.aspx
    

Настройка правил для обратного прокси-сервера

В этом разделе пошагового руководства вы настроите функции обратного прокси-сервера для работы с примерами созданных веб-сайтов.

Включение функций обратного прокси-сервера

Функция обратного прокси-сервера отключена по умолчанию, поэтому ее необходимо начать с включения.

  1. Открытие диспетчера IIS
  2. Выберите узел сервера в представлении дерева слева и щелкните функцию "Маршрутизация запросов приложений":
    Снимок экрана: I S Manager. Показаны различные значки. Выделен значок маршрутизации запросов приложений.
  3. Установите флажок "Включить прокси-сервер". Оставьте значения по умолчанию для всех остальных параметров на этой странице:
    Снимок экрана: страница маршрутизации запросов приложений. Включение прокси-сервера выделено и выбрано.

Создание правила для приложения веб-почты

Вы создадите два правила перезаписи:

  • Правило перезаписи, которое будет проксировать любой запрос к веб-почтовому приложению на http://localhost:8081/, если путь запрошенного URL начинается с "webmail".
  • Правило перезаписи, которое будет направлять любой запрос к приложению расчёта заработной платы по адресу http://localhost:8082/, если запрашиваемый URL-путь начинается с "payroll".

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

  1. Откройте файлweb.config , расположенный в следующем расположении:

    %SystemDrive%\inetpub\wwwroot\
    
  2. В элементе /configuration/system.webServer добавьте следующее и сохраните файл:

    <rewrite>
        <rules>
            <rule name="Reverse Proxy to webmail" stopProcessing="true">
                <match url="^webmail/(.*)" />
                <action type="Rewrite" url="http://localhost:8081/{R:1}" />
            </rule>
            <rule name="Reverse Proxy to payroll" stopProcessing="true">
                <match url="^payroll/(.*)" />
                <action type="Rewrite" url="http://localhost:8082/{R:1}" />
            </rule>
        </rules>
    </rewrite>
    

Для получения дополнительной информации о создании правил переопределения URL-адресов см. раздел "Создание правил перезаписи для модуля перезаписи URL-адресов".

Тестирование функций обратного прокси-сервера

Откройте веб-браузер и отправьте запрос http://localhost/webmail/default.aspx. Вы увидите ответ на странице проверки веб-почты. Кроме того, выполните запрос http://localhost/payroll/default.aspx. Вы должны увидеть ответ на тестовой странице расчёта заработной платы.

Снимок экрана тестовой страницы веб-приложения Web Mail через обратный прокси. В нижней части выделен URL http://localhost/default.aspx.

Обратите внимание, что в обоих случаях ссылка внутри отклика указывает на http://localhost/default.aspx. Если щелкнуть эту ссылку, он приведет к ответу 404 (файл не найден) с сервера. В следующем разделе вы узнаете, как создать исходящее правило для исправления ссылок в создаваемом приложением HTML-ответе.

Настройка правил для перезаписи ответа

Этот раздел документации относится к модулю переопределения URL-адресов версии 2.0 для IIS 7.

Вы определите исходящее правило, которое заменяет все ссылки в ответном HTML-документе следующим образом:

<a href="/default.aspx">...</a>

будет заменено следующим:

<a href="/webmail/default.aspx">...</a>

(если ответ пришел из приложения веб-почты)

и

<a href="/payroll/default.aspx">...</a>

(если ответ пришел из приложения для расчета заработной платы)

Предупреждение

Когда заголовки ответов или содержимое ответа изменяются правилом перезаписи исходящего трафика, необходимо внимательно следить за тем, чтобы текст, вставленный в ответ, не содержал исполняемый код со стороны клиента, что может привести к уязвимостям межсайтового скриптинга. Это особенно важно, если правило перезаписи использует ненадежные данные, такие как заголовки HTTP или строка запроса, для создания строки, которая будет вставлена в ответ HTTP. В таких случаях строка замены должна быть закодирована с помощью функции HtmlEncode , например:

<action type="Rewrite" value="{HtmlEncode:{HTTP_REFERER}}" />

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

  1. Перейти к диспетчеру IIS
  2. Выберите "Веб-сайт по умолчанию"
  3. В представлении компонентов щелкните "Перезапись URL-адресов"
    Снимок экрана Диспетчера IIS. В области
  4. В области действий справа щелкните "Добавить правила...". В диалоговом окне "Добавить правила" выберите пустое правило в категории "Правила исходящего трафика" и нажмите кнопку "ОК".
    Снимок экрана: диалоговое окно

Теперь необходимо определить фактическое правило исходящего трафика. В модуле переопределения URL-адресов 2.0 правило перезаписи исходящего трафика определяется путем указания следующих сведений:

  • Имя правила.
  • Необязательное условие, определяющее, следует ли применять это правило к ответу.
  • Шаблон, используемый для сопоставления строки в ответе.
  • Необязательный набор условий.
  • Действие, выполняемое в случае совпадения шаблона и успешного выполнения всех проверок условий.

Именование правила

В текстовом поле "Имя" введите имя, уникально определяющее правило, например "Добавить префикс приложения".

Определение предусловия

Предварительное условие используется для оценки, следует ли применять проверку исходящих правил при формировании ответа. Например, если применяется правило, которое изменяет HTML-содержимое, то только HTTP-ответы с заголовком типа контента, равным text/html, должны оцениваться в соответствии с этим правилом. Оценка исходящих правил и перезапись содержимого — это активная операция ЦП, которая может негативно повлиять на производительность веб-приложения. Таким образом, используйте предварительные условия, чтобы сузить случаи, когда применяются исходящие правила.

Так как создаваемое правило должно применяться только к html-ответам, вы определите условие, которое проверяет, является ли тип контента заголовка HTTP-ответа эквивалентным "text/html".

Чтобы определить условие, выполните следующее:

  1. В списке предварительных условий выберите "<Создать новое условие...>".

  2. Откроется диалоговое окно редактора предварительных условий, в котором необходимо определить условие. Укажите параметры предварительных условий следующим образом:

    • Имя: IsHTML

    • Использование: "Регулярные выражения"

    • Нажмите кнопку "Добавить", чтобы открыть диалоговое окно "Добавить условие". В этом диалоговом окне укажите следующее:

      • Входные данные условия: "{RESPONSE_CONTENT_TYPE}"

      • Проверьте, соответствует ли входная строка: "Соответствует шаблону"

      • Шаблон: "^text/html"

        Снимок экрана: диалоговое окно

  3. Нажмите кнопку "ОК", чтобы сохранить предварительные условия и вернуться на страницу "Изменить правило".

Определение области поиска соответствий

Правило перезаписи исходящего трафика может работать с содержимым заголовка HTTP или с содержимым тела ответа. Это правило должно заменить ссылки в содержимом ответа, поэтому в раскрывающемся списке "Область сопоставления" выберите "Ответ".

Определение фильтра тегов

Фильтры тегов используются для ограничения сопоставления шаблонов только с определенными HTML-элементами, вместо оценки всего ответа по шаблону правила. Сопоставление шаблонов является очень интенсивной операцией ЦП, и если весь ответ вычисляется по шаблону, он может значительно замедлить время отклика веб-приложения. Фильтры тегов позволяют указать, что сопоставление шаблонов должно применяться только в содержимом определенных HTML-тегов, что значительно сокращает объем данных, которые необходимо оценить по шаблону регулярного выражения.

Чтобы определить фильтр тегов, разверните раскрывающийся список "Сопоставление содержимого внутри: " и установите флажок "A (атрибут href)".

Это задает правило для применения шаблона только к значению атрибута href гиперссылки, как показано в следующем примере:

<a href="this string will be used for pattern matching">Some link</a>

Определение шаблона

В текстовом поле "Шаблон" введите следующую строку:

^/(.*)

Эта строка представляет собой регулярное выражение, указывающее, что шаблон будет соответствовать любой строке пути URL-адреса, начинающейся с символа /.

Обратите внимание на использование скобки в шаблоне. Эти скобки создают группу записи, на которую можно ссылаться в правиле с помощью обратных ссылок.

Определение условия

Необходимо изменить ссылки в HTML-коде ответа только в том случае, если ответ получен из веб-почты или приложения для оплаты труда. Чтобы убедиться, что вы будете использовать условие, которое анализирует путь URL-адреса, запрошенный клиентом. Кроме того, вы определите шаблон условия, который фиксирует папку приложения из запрошенного URL-адреса, чтобы правило могло повторно использовать это при перезаписи ссылок в ответе.

  1. Разверните поле группы условий.
  2. Нажмите кнопку "Добавить...", чтобы открыть диалоговое окно для определения условий.
  3. В поле "Входное условие:" введите эту строку: "{URL}". При этом модуль перезаписи URL-адресов настраивается для использования пути URL-адреса, запрошенного веб-клиентом.
  4. В раскрывающемся списке выберите "Соответствует шаблону".
  5. Введите ^/(webmail|payroll)/.* в текстовое поле "Шаблон". Это регулярное выражение используется для сопоставления путей URL-адресов, начинающихся с любого /webmail или /payroll. Скобки в шаблоне фиксируют часть соответствующей строки URL-адреса, чтобы ее можно было использовать при создании URL-адреса замены.
  6. Нажмите кнопку "ОК", чтобы сохранить условие и вернуться к пользовательскому интерфейсу "Добавить правило".

Определение действия

Выберите тип действия "Перезаписать", указанный в поле "Действие". В текстовом поле "Значение" введите следующую строку:

/{C:1}/{R:1}

Эта строка задает новое значение, в которое должен быть перезаписан адрес ссылки. {C:1} — это обратная ссылка на группу отслеживания шаблонов условий, и она будет заменена строками webmail или payroll. {R:1} — это обратная ссылка на группу отслеживания шаблонов правил, и в этом случае она будет заменена исходным URL-адресом пути, который использовался в гиперссылке.

Оставьте значения по умолчанию для всех остальных параметров. Страница свойств "Изменить правило исходящего трафика" должна выглядеть следующим образом:

Снимок экрана: вкладка свойства

Сохраните правило, нажав кнопку "Применить" в правой части.

Чтобы проверить конфигурацию только что созданных правил, откройте файл web.config, расположенный в %SystemDrive%\inetput\wwwroot\. В этом файле вы увидите <rewrite> раздел, содержащий это определение правила:

<rewrite>
    <rules>
        <rule name="Reverse Proxy to webmail" stopProcessing="true">
            <match url="^webmail/(.*)" />
            <action type="Rewrite" url="http://localhost:8081/{R:1}" />
        </rule>
        <rule name="Reverse Proxy to payroll" stopProcessing="true">
            <match url="^payroll/(.*)" />
            <action type="Rewrite" url="http://localhost:8082/{R:1}" />
        </rule>
    </rules>
    <outboundRules>
        <rule name="Add application prefix" preCondition="IsHTML">
            <match filterByTags="A" pattern="^/(.*)" />
            <conditions>
                <add input="{URL}" pattern="^/(webmail|payroll)/.*" />
            </conditions>
            <action type="Rewrite" value="/{C:1}/{R:1}" />
        </rule>
        <preConditions>
            <preCondition name="IsHTML">
                <add input="{RESPONSE_CONTENT_TYPE}" pattern="^text/html" />
            </preCondition>
        </preConditions>
    </outboundRules>
</rewrite>

Тестирование правила

Чтобы проверить, правильно ли правило переписывает URL-адреса в ответе, откройте веб-браузер и отправьте запрос к http://localhost/webmail/default.aspx или http://localhost/payroll/default.aspx. Вы должны увидеть, что правило перезаписи исходящего трафика изменило ссылку в html-ответе:

Снимок экрана страницы теста обратного прокси веб-приложения для веб-почты. Ссылка внизу — h t t p двоеточие косая черта косая черта localhost косая черта веб-почта косая черта default точка a s p x.

Сводка

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

Обратите внимание, что при использовании обратного прокси-сервера часто требуется перезаписать заголовки ответа HTTP. Сведения об использовании модуля переопределения URL-адресов 2.0 для изменения заголовка HTTP ответа см. в разделе "Изменение заголовков ОТВЕТА HTTP".