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

Вопрос или проблема

У меня есть сервер IIS, на котором размещено несколько сайтов и API. Эти сайты включают экземпляры Confluence и Jira. Эти продукты фактически запускают свои собственные веб-серверы, поэтому модули Application Request Routing и Url Rewrite используются для реверс-проксирования входящих запросов к documents.example.com и jira.example.com на localhost:8080 и localhost:8090 — где запущены экземпляры Confluence и Jira.

Теперь я пытаюсь настроить реверс-прокси для небольшого API сервера простого хранения (s3) (minio), который размещен на localhost:9000, но протокол s3 требует, чтобы заголовок хоста был частью его кодов аутентификации сообщений.

Однако, когда Application Request Routing перенаправляет запрос согласно правилу URL Rewrite, он также переписывает заголовок хоста, чтобы он отражал новый заголовок назначения.

Это можно отключить, установив system.webServer.proxy:preserveHostHeaders, но только в ApplicationHost.config, так как ARR работает на уровне сервера, а не сайта.

Итак, теперь у меня дилемма:

Если я установлю эту настройку, то REST API, которые используют заголовок хоста в своих MAC, сможет работать, но Confluence и Jira, как ожидается, в их поддерживаемой конфигурации реверс-прокси нуждаются в переписанных заголовках хоста.

Для справки, это включает сохранение заголовков хоста

%windir%\system32\inetsrv\appcmd.exe set config -section:system.webServer/proxy -preserveHostHeader:true /commit:apphost

Я борюсь с той же проблемой. У меня есть решение, которое мне не нравится (и я уверен, вам оно тоже не понравится), но оно работает.

Если вы включите preserveHostHeaders, то можете добавить исходящие правила URL Rewrite, чтобы заново сопоставить все случаи, когда вы хотите заменить заголовки хостов.

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

Но, как указано в этом ответе, можно сделать наоборот — активировать preserveHostHeaders, а затем переписать заголовок хоста, но только для проксированных сайтов, которые требуют оставлять свой фактический хост. Но это не делается через исходящее правило.

Это выполняется через переписывание переменной сервера в правиле реверс-прокси, как показано в этом ответе на StackOverflow по другому вопросу на эту тему.

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

<rule name="rewrite-without-preserved-host" stopProcessing="true">
  <match url="^(.*)" />
  <action type="Rewrite" url="http://some.example.com/{R:1}" />
  <serverVariables>
    <set name="HTTP_HOST" value="some.example.com" />
  </serverVariables>
</rule>

(Не забудьте разрешить установку HTTP_HOST в разрешенной переменной сервера в конфигурации URL Rewrite.)

Реверс-прокси, которым нужно сохранять хост, не должны пытаться устанавливать переменную HTTP_HOST и должны оставить это ARR через его настройку preserveHostHeaders, включенную.

<rule name="rewrite-with-preserved-host" stopProcessing="true">
  <match url="^(.*)" />
  <action type="Rewrite" url="http://other.example.com/{R:1}" />
</rule>

Смотрите также этот другой связанный вопрос на StackOverflow и ответы, если необходимо.

Ответ или решение

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

Теоретическая база

IIS (Internet Information Services) служит мощной платформой для хостинга веб-приложений и особенно полезен при использовании в роли обратного прокси-сервера. Microsoft предоставляет дополнительные модули, такие как Application Request Routing (ARR) и URL Rewrite, которые помогают направлять HTTP-запросы на нужные конечные точки.

Основная задача обратного прокси-сервера заключается в перенаправлении входящих запросов от клиента к внутренним серверам, которые фактически обслуживают запрашиваемый контент. При этом, одной из задач является корректное управление заголовками HTTP, включая Host.

Именно сохранение или изменение заголовка Host имеет критическое значение, так как некоторые сервисы требуют присутствия специфичных заголовков для аутентификации и функционирования. В вашем случае, MinIO (позволяющий управлять S3-совместимыми хранилищами) требует, чтобы заголовок оставался неизменным для корректного вычисления кодов аутентификации. В то же время, Jira и Confluence требуют изменения заголовка для корректной работы через прокси-серверы.

Пример решения

Для соблюдения всех требований вам необходимо применить индивидуальный подход для каждой службы:

  1. Конфигурация для MinIO с сохранением заголовка:
    Вы можете задать параметр preserveHostHeader в конфигурации ARR глобально через ApplicationHost.config, что обеспечит сохранение оригинального заголовка Host для MinIO.

    Настройка производится с помощью команды:

    %windir%\system32\inetsrv\appcmd.exe set config -section:system.webServer/proxy -preserveHostHeader:true /commit:apphost
  2. Конфигурация для Jira и Confluence с изменением заголовка:
    Используйте правки на уровне правил реверс-прокси в URL Rewrite для изменения значений Host заголовка. Это можно сделать с помощью настройки серверной переменной, как показано ниже:

    <rule name="rewrite-without-preserved-host" stopProcessing="true">
      <match url="^(.*)" />
      <action type="Rewrite" url="http://jira.example.com/{R:1}" />
      <serverVariables>
         <set name="HTTP_HOST" value="jira.example.com" />
      </serverVariables>
    </rule>

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

Применение и рекомендации

Если ваш проект требует специфического поведения в вопросах изменения или сохранения заголовков, важно следовать следующим процедурам:

  • Тестирование до и после изменения настроек: Необходимо удостовериться, что все приложения функционируют корректно после изменения настроек. Ключевой фактор успеха — эмуляция различных сценариев использования вашего сервера.

  • Логирование и мониторинг: Включите подробное логирование на вашем IIS и настройках обратного прокси. Данное действие поможет вам отслеживать и устранять возможные ошибки в реальном времени.

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

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

Оцените материал
Добавить комментарий

Капча загружается...