Обратный прокси-сервер
В реальных развертываниях часто хочется исключить доступ пользователей к внутренним сетевым ресурсам. Как правило, это решается использованием обратного прокси-сервера (Reverse Proxy), который установлен в демилитаризованной зоне (DMZ), доступен из внешней сети и имеет доступ к внутренней сети. Пользователи имеют доступ только ко внешнему интерфейсу прокси-сервера и не могут напрямую обращаться к ресурсам во внутренней сети, в которой развернут сервер.
Такой подход также позволяет предоставлять доступ пользователям из внешней сети только к избранным ресурсам сервера. Соответственно, администратор сервера, который имеет доступ из внутренней сети, может пользоваться ресурсами сервера, которые недоступны внешним пользователям.
В данном разделе описаны общие принципы поддержки обратного прокси-сервера, зная которые, можно настроить любой готовый прокси-сервер или написать свой. Также приводятся варианты конфигурации прокси на примере популярного прокси-сервера nginx.
Механизм формирования URL в ответах сервера при работе с использованием обратного прокси-сервера
Использование прокси-серверов осложняет задачу формирования URL в ответах сервера (это могут быть URL в представлении ресурсов или URL в заголовках): сервер «1С:Шины» получает запрос от прокси-сервера и не может восстановить исходный URL, используя одни лишь данные из строки запроса и заголовка HOST. Другими словами, сервер не в состоянии сформировать URL к ресурсу таким, каким он видится клиенту.
Для передачи данных, необходимых для восстановления URL, используются заголовки X-Forwarded-*. Они устанавливаются ближайшим к клиенту прокси-сервером и несут всю необходимую для формирования URL информацию:
- хост, к которому обратился клиент;
- порт, к которому обратился клиент, на хосте;
- протокол взаимодействия между клиентом и ближайшим прокси;
- префикс сегмента path, который используется прокси для выделения запросов к целевому серверу (или следующему прокси в цепочке).
Ниже описаны заголовки, которые может использовать прокси-сервер и которые поддерживаются компактным сервером.
X-Forwarded-Proto
Схема, которая использовалась клиентом при отправке запроса на ближайший к нему прокси-сервер.
Если этот заголовок присутствует, то компактный сервер использует значение в качестве схемы во всех генерируемых URL.
Возможные значения: http, https.
X-Forwarded-Host
Хост, к которому обратился клиент (имя или адрес).
Если этот заголово к присутствует, то компактный сервер использует значение в качестве имени хоста во всех генерируемых URL.
X-Forwarded-Port
Номер порта, на который клиент отправил запрос.
Если этот заголовок присутствует, то номер порта запроса меняется на значение заголовка.
Если заголовок X-Forwarded-Port не задан, но задан X-Forwarded-Host, то используется номер порта по умолчанию в зависимости от схемы каталога: 80 (http), 443 (https).
X-Forwarded-Prefix
Префикс пути исходного запроса. Используется для передачи на целевой сервер информации о том, какой префикс пути используется на ближайшем к клиенту прокси для всех URL.
Если этот заголовок присутствует, то он добавляется в начало сегмента path всех URL, которые генерирует сервер. Указанный заголовок прокси-сервер должен устанавливать, если на прокси-сервере используется непустой префикс пути для upstream-сервера.
X-Forwarded-Endpoint
Нестандартный заголовок. Используется для замены пути /applications/<имя приложения>
на более короткий сегмент.
X-Forwarded-For
Список промежуточных IP-адресов. Первым должен идти IP-адрес клиента, отправившего запрос; за ним — адреса всех промежуточных прокси-серверов. В настоящий момент не используется; в будущем может быть использован для логов и аналитики.
Отображение заголовков на URL
Пусть сервер «1С:Шины» доступен по адресу 192.168.0.1 (порт 9090). Клиент взаимодействует с ним через прокси, доступный по адресу 10.0.0.1 (порт 443). Пусть на сервере «1С:Шины» функционирует приложение app1. Прокси взаимодействует с сервером «1С:Шины», не используя защищенное соединение. Тогда некоторый ресурс приложения доступен прокси-серверу по URL:
http://192.168.0.1:9090/applications/app1/api/resource
Клиент не имеет возможности работать непосредственно с адресом 192.168.0.1 — вместо этого он взаимодействует с прокси, доступным по адресу 10.0.0.1, по защищен ному соединению.
Прокси, помимо запросов к серверу «1С:Шины», принимает запросы, адресованные другим серверам — таким образом конфигурация прокси должна обеспечить возможность различать запросы для разных серверов.
Также прокси использует возможность, предоставляемую сервером «1С:Шины», по сокращению URL за счет замещения сегментов applications/app1
. В этих условиях тот же ресурс адресуется клиентом (работающим с прокси) следующим образом (на схеме отображены значения заголовков, которые прокси отправит серверу «1С:Шины» для обеспечения возможности восстановления URL, использованного клиентом):
X-Forwarded-Proto
|
| X-Forwarded-Prefix
| |
/---\ /-\
https://10.0.0.1/cs/app1/api/resource
\------/\ \--/
| \ |
X-Forwarded-Host | X-Forwarded-Endpoint
|
X-Forwarded-Port
Заголовок X-Forwarded-Endpoint, в отличие от остальных заголовков X-Forwarded-*, настраивается в конфигурационных файлах для каждого приложения отдельно.
Примеры трансляции клиентских запросов прокси-серверами
Пусть ближайший к серверу «1С:Шины» обратный прокси принимает запросы по адресу 10.0.0.2, непосредственно сервер «1С:Шины» — по адресу 192.168.0.1, а по адресу 10.0.0.1 функционирует другой обратный прокси, который ближе к клиенту. Клиент отправляет запросы с сокета 10.0.0.10:45675. Входящие запросы поступают по защищенному соединению; транслируются запросы в режиме clear text.
Прием запроса, который прошел через обратный прокси, компактным сервером.
Запрос, отправленный ближайшему к клиенту обратному прокси:
GET /app1/resource/1 HTTP/1.1
Host: 10.0.0.1
Запрос, транслированный следующему обратному прокси в цепочке. Этот прокси настроен на переписывание пути с помощью X-Forwarded-Prefix/Endpoint. Он как ближайший к клиенту устанавливает все X-Forwarded-* заголовки:
GET /applications/app1/resource/1 HTTP/1.1
Host: 10.0.0.2
X-Forwarded-Proto: https
X-Forwarded-Host: 10.0.0.1
X-Forwarded-Port: 443
X-Forwarded-Endpoint: /app1
X-Forwarded-For: 10.0.0.10:45675
Запрос, транслированный серверу «1С:Шины». Этот прокси транслирует путь запроса в неизмененном виде и лишь модифицирует заголовок X-Forwarded-For:
GET /applications/app1/resource/1 HTTP/1.1
Host: 192.168.0.1
X-Forwarded-Proto: https
X-Forwarded-Host: 10.0.0.1
X-Forwarded-Port: 443
X-Forwarded-Endpoint: /app1
X-Forwarded-For: 10.0.0.10:45675,10.0.0.1:443
В результате сервер «1С:Шины» сможет сгенерировать URL, восстановив начальную часть по заголовкам: https://10.0.0.2:443/app1/, и сгенерировать URL других ресурсов, относящихся к приложению.