Editar en GitHub

Express detrás de proxies

Cuando ejecutas una aplicación Express detrás de un reverse proxy, algunas de las APIs de Express pueden devolver valores diferentes a los esperados. Para ajustar esto, el ajuste de aplicación trust proxy puede usarse para exponer información proporcionada por el reverse proxy en las APIs de Express. El problema más común es que las APIs de Express que exponen la dirección IP del cliente pueden mostrar en su lugar una dirección IP interna del reverse proxy.

Nota

Al configurar el ajuste trust proxy, es importante entender la configuración exacta del reverse proxy. Ya que este ajuste confiará en los valores proporcionados en la petición, es importante que la combinación del ajuste en Express coincida con cómo opera el reverse proxy.

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

TipoValor
Boolean

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

Si es false, se entiende que la app está directamente frente al cliente y la dirección IP del cliente se deriva de req.socket.remoteAddress. Este es el ajuste por defecto.

Advertencia

Al establecer a true, es importante asegurar que el último reverse proxy de confianza esté eliminando/sobrescribiendo todos los siguientes headers 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, subnet, o un array de direcciones IP y subnets en las que confiar como reverse proxy. La siguiente lista muestra los nombres de subnet preconfigurados:

  • 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

Puedes 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 subnets se excluyen del proceso de determinación de la dirección, y la dirección IP no confiable más cercana al servidor de la aplicación se determina como la dirección IP del cliente. Esto funciona comprobando si req.socket.remoteAddress es de confianza. Si lo es, entonces cada dirección en X-Forwarded-For se comprueba de derecha a izquierda hasta la primera dirección no confiable.

Número

Usa la dirección que está como máximo a n saltos de distancia de la aplicación Express. req.socket.remoteAddress es el primer salto, y el resto se buscan en el header 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 reverse proxy.

Advertencia

Al usar este ajuste, es importante asegurar que no haya múltiples rutas de diferente longitud hacia la aplicación Express tales que el cliente pueda estar a menos del número configurado de saltos de distancia, de lo contrario puede ser posible que el cliente proporcione cualquier valor.

Función

Implementación personalizada de confianza.

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

Habilitar trust proxy tendrá el siguiente impacto:

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

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

  • Los valores de req.ip y req.ips se rellenan basándose en la dirección del socket y el header X-Forwarded-For, empezando por la primera dirección no confiable.

El ajuste trust proxy está implementado usando el paquete proxy-addr. Para más información, consulta su documentación.