Spec-Zone.ru › Express

Express за прокси-серверами

При запуске приложения Express за обратным прокси-сервером некоторые API Express могут возвращать значения, отличные от ожидаемых. Для корректировки этого можно использовать настройку приложения trust proxy, чтобы предоставить информацию, полученную от обратного прокси-сервера, в API Express. Наиболее распространённая проблема заключается в том, что API Express, которые отображают IP-адрес клиента, вместо этого могут показывать внутренний IP-адрес обратного прокси-сервера.

При настройке параметра trust proxy, важно понимать точную настройку обратного прокси-сервера. Поскольку эта настройка будет доверять значениям, предоставленным в запросе, важно, чтобы сочетание настройки в Express соответствовало тому, как работает обратный прокси-сервер.

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

Тип Значение
Булево

Если true, IP-адрес клиента понимается как самый левый элемент в заголовке X-Forwarded-For.

Если false, приложение понимается как непосредственно взаимодействующее с клиентом, и IP-адрес клиента определяется из req.socket.remoteAddress. Это значение по умолчанию.

При установке значения true, важно убедиться, что последний доверенный обратный прокси-сервер удаляет/перезаписывает все последующие HTTP-заголовки: X-Forwarded-For, X-Forwarded-Host, и X-Forwarded-Proto, иначе клиент может предоставить любое значение.

IP-адреса

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

  • loopback - 127.0.0.1/8, ::1/128
  • linklocal - 169.254.0.0/16, fe80::/10
  • uniquelocal - 10.0.0.0/8, 172.16.0.0/12, 192.168.0.0/16, fc00::/7

Вы можете задать IP-адреса любым из следующих способов:

app.set('trust proxy', 'loopback') // specify a single subnet
app.set('trust proxy', 'loopback, 123.123.123.123') // specify a subnet and an address
app.set('trust proxy', 'loopback, linklocal, uniquelocal') // specify multiple subnets as CSV
app.set('trust proxy', ['loopback', 'linklocal', 'uniquelocal']) // specify multiple subnets as an array

При указании IP-адресов или подсетей они исключаются из процесса определения адреса, и как IP-адрес клиента определяется ближайший к серверу приложения недоверенный IP-адрес. Это работает путём проверки, является ли req.socket.remoteAddress доверенным. Если да, то каждый адрес в X-Forwarded-For проверяется справа налево до первого недоверенного адреса.

Число

Используется адрес, который находится не более чем на n переходах от приложения Express. req.socket.remoteAddress — это первый переход, а остальные ищутся в заголовке X-Forwarded-For справа налево. Значение 0 означает, что первый недоверенный адрес будет req.socket.remoteAddress, т. е. обратного прокси-сервера нет.

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

Функция

Пользовательская реализация доверия.

app.set('trust proxy', (ip) => {
  if (ip === '127.0.0.1' || ip === '123.123.123.123') return true // trusted IPs
  else return false
})

Включение trust proxy окажет следующее влияние:

  • Значение req.hostname определяется из значения, заданного в заголовке X-Forwarded-Host, который может быть установлен клиентом или прокси-сервером.

  • X-Forwarded-Proto может быть установлено обратным прокси-сервером, чтобы сообщить приложению, является ли оно https или http, или даже недействительным именем. Это значение отражается в req.protocol.

  • Значения req.ip и req.ips заполняются на основе адреса сокета и заголовка X-Forwarded-For, начиная с первого недоверенного адреса.

Настройка trust proxy реализована с использованием пакета proxy-addr. Более подробную информацию см. в его документации.

© 2017 StrongLoop, IBM, and other expressjs.com contributors.
Licensed under the Creative Commons Attribution-ShareAlike License v3.0.
https://expressjs.com/en/guide/behind-proxies.html

Spec-Zone.ru

Настройки Оффлайн Что нового Помощь О нас
Spec-Zone .ru
спецификации, руководства, описания, API