Traducir esta página

Expresar detrás de proxies

Cuando se ejecuta una aplicación Express detrás de un proxy inverso, algunas de las APIs Express pueden devolver valores diferentes de los esperados. Para ajustarse a esto, la configuración de la aplicación trust proxy puede utilizarse para exponer la información proporcionada por el proxy inverso en las APIs Express. El problema más común son las APIs expresas que exponen la dirección IP del cliente pueden mostrar una dirección IP interna del proxy inverso.

Note

Al configurar la configuración del proxy de confianza, es importante entender la configuración exacta del proxy inverso . Dado que esta configuración confiará en los valores proporcionados en la solicitud, es importante que la combinación de la configuración en Express coincida con cómo funciona el proxy inverso.

El ajuste de la aplicación proxy de confianza puede establecerse en uno de los valores listados en la siguiente tabla.

EscribaValor
Boolean

Si es true, la dirección IP del cliente se entiende como la entrada más a la izquierda en la cabecera X-Forwarded-For.

Si es false, la aplicación se entiende como directamente frente al cliente y la dirección IP del cliente se deriva de req.socket.remoteAddress. Esta es la configuración por defecto.

Cuando se establece en true, es importante asegurarse de que el último proxy inverso en el que se confía es eliminar/sobrescribir todas las siguientes cabeceras HTTP: X-Forwarded-For, X-Forwarded-Host, y X-Forwarded-Proto, de lo contrario puede ser posible que el cliente proporcione cualquier valor.

direcciones IP

Una dirección IP, subred, o un array de direcciones IP y subredes en las que confiar como un proxy inverso. La siguiente lista muestra los nombres de subred preconfigurados:

  • bucle atrás - 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

Puede establecer direcciones IP de cualquiera de las siguientes maneras:

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

Cuando se especifica, las direcciones IP o las subredes están excluidas del proceso de determinación de direcciones, y la dirección IP no confiable más cercana al servidor de aplicaciones se determina como la dirección IP del cliente. Esto funciona comprobando si req.socket.remoteAddress es de confianza. Si es así, entonces cada dirección en X-Forwarded-For se marca de derecha a izquierda hasta la primera dirección no confiable.

Número

Utilice la dirección que es como máximo el número de saltos n de la aplicación Express. req.socket.remoteAddress es la primera salida, y el resto son buscados en la cabecera X-Forwarded-For de derecha a izquierda. Un valor de 0 significa que la primera dirección no confiable sería req.socket.remoteAddress, es decir, no hay proxy inverso.

Al usar esta configuración, es importante asegurarse de que no hay múltiplos, rutas de longitud diferente a la aplicación Express tal que el cliente puede ser menor que el número de saltos configurados de lo contrario es posible que el cliente proporcione cualquier valor.

Función

Implementación de confianza personalizada.

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

Habilitar proxy de confianza tendrá el siguiente impacto:

  • El valor de req.hostname se deriva del valor establecido en la cabecera X-Forwarded-Host, que puede ser definido por el cliente o por el proxy.

  • X-Forwarded-Proto puede ser establecido por el proxy inverso para decirle a la aplicación si es https o http o incluso un nombre inválido. Este valor se refleja en req.protocol.

  • Los valores req.ip y req.ips son poblados según la dirección del socket y la cabecera X-Forwarded-For, comenzando en la primera dirección no confiable.

La configuración trust proxy se implementa usando el paquete proxy-addr. Para obtener más información, consulte su documentación.