Express за прокси¶
При запуске Express-приложения за reverse proxy (обратным прокси) некоторые API Express могут возвращать значения, отличающиеся от ожидаемых. Чтобы это учесть, используется настройка приложения trust proxy, которая позволяет API Express использовать информацию, переданную прокси. Самый частый случай — вместо IP клиента отображается внутренний IP reverse proxy.
При настройке trust proxy важно точно понимать конфигурацию reverse proxy. Так как эта опция доверяет данным из запроса, конфигурация в Express должна соответствовать реальной схеме работы прокси.
Параметр trust proxy можно установить в одно из значений, описанных ниже.
Boolean¶
Если true, IP клиента определяется как самое левое значение в заголовке X-Forwarded-For.
Если false, считается, что приложение напрямую подключено к клиенту, и IP клиента берется из req.socket.remoteAddress. Это значение по умолчанию.
При установке true убедитесь, что последний доверенный reverse proxy удаляет/перезаписывает заголовки X-Forwarded-For, X-Forwarded-Host и X-Forwarded-Proto, иначе клиент сможет подставить произвольные значения.
IP addresses¶
Можно указать IP-адрес, подсеть или массив IP/подсетей, которым нужно доверять как reverse proxy. Ниже список преднастроенных имен подсетей:
- 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-адреса можно задать любым из следующих способов:
1 2 3 4 5 6 7 8 9 10 11 | |
Если список задан, указанные IP-адреса или подсети исключаются из определения клиентского адреса, и IP клиента определяется как ближайший к приложению недоверенный адрес. Механизм работает так: проверяется, доверен ли req.socket.remoteAddress. Если да, адреса из X-Forwarded-For проверяются справа налево до первого недоверенного.
Number¶
Используется адрес, находящийся не дальше чем в n хопах от приложения Express. req.socket.remoteAddress считается первым хопом, остальные ищутся в X-Forwarded-For справа налево. Значение 0 означает, что первый недоверенный адрес — это req.socket.remoteAddress, то есть reverse proxy отсутствует.
При таком режиме важно убедиться, что до приложения нет нескольких маршрутов разной длины, где клиент может оказаться ближе, чем заданное число хопов. Иначе клиент сможет подставить произвольные значения.
Function¶
Пользовательская реализация логики доверия.
1 2 3 4 5 6 | |
Включение trust proxy приводит к следующим последствиям:
- Значение
req.hostnameберется изX-Forwarded-Host, который может быть установлен клиентом или прокси. X-Forwarded-Protoможет быть установлен reverse proxy, чтобы сообщить приложению протокол (https,httpили даже некорректное значение). Это отражается вreq.protocol.req.ipиreq.ipsзаполняются на основе адреса сокета и заголовкаX-Forwarded-For, начиная с первого недоверенного адреса.
Настройка trust proxy реализована с помощью пакета proxy-addr. Подробнее — в его документации.