Red de conocimiento informático - Material del sitio web - Cómo configurar correctamente el control remoto en nginx

Cómo configurar correctamente el control remoto en nginx

Al crear un sitio web, las dos informaciones de encabezado remoto_addr y x_forwarded_for se usan a menudo para obtener la IP del cliente. Sin embargo, cuando hay un proxy inverso o CDN, estos dos valores no son lo suficientemente precisos. y es necesario ajustar alguna configuración.

Qué es remote_addr

remote_addr representa la IP del cliente, pero su valor no lo proporciona el cliente, sino que lo especifica el servidor en función de la IP del cliente cuando visita. un sitio web, suponiendo que no haya un proxy en el medio, el servidor web del sitio web (Nginx, Apache, etc.) configurará remote_addr en la IP de su máquina. Si usa un proxy, su navegador primero

. acceda a este proxy y luego reenvíelo al sitio web desde este proxy, de modo que el servidor web establezca remote_addr en la IP de esta máquina proxy.

Qué es x_forwarded_for

Como se mencionó anteriormente, cuando usas un proxy, el servidor web no conoce tu IP real. Para evitar esta situación, el servidor proxy generalmente agrega una A. información del encabezado llamada x_forwarded_for

, agregue la IP del cliente conectado (es decir, la IP de su máquina de acceso a Internet) a esta información del encabezado, para garantizar que el servidor web del sitio web pueda obtener la IP real

Utilice HAProxy como proxy inverso

Por lo general, para soportar un mayor tráfico, los sitios web agregarán muchos servidores web y agregarán un proxy inverso (como HAProxy) delante de estos servidores. Puede distribuir uniformemente la carga a estas máquinas

. Su navegador primero accede a este proxy inverso y luego reenvía su solicitud al servidor web posterior, lo que hace que el servidor web configure remote_addr en esta IP del proxy inverso

para que su programa obtenga la dirección real. IP del cliente, debe agregar la siguiente configuración a HAProxy

opción forwardfor

Funciona como se mencionó anteriormente, agregue una información de encabezado x_forwarded_for, agregue la IP de su máquina de acceso a Internet

Utilice el módulo realip de Nginx

Cuando Nginx está detrás de HAProxy, remote_addr se configurará en la IP de HAProxy. Este valor en realidad no tiene sentido. Puede usar el módulo realip de nginx para que se use. el valor en x_forwarded_for. Para usar este módulo, necesita recompilar Nginx y agregar el parámetro --with-http_realip_module

set_real_ip_from 10.1.10.0/24;

real_ip_header X-Forwarded-For;

La configuración anterior es utilizar la información del encabezado en X-Forwarded-For como remote_addr para todas las solicitudes del segmento de red 10.1.10

Coloque Nginx delante de HAProxy como un proxy HTTPS

Por razones de seguridad, los sitios web suelen utilizar conexiones https para transmitir información confidencial. https utiliza cifrado SSL y HAProxy no puede analizarlo directamente, por lo que debe configurarse delante de HAProxy

Nginx descifra y luego lo reenvía a HAProxy para procesar el equilibrio de carga. De esta forma, quedan dos proxy delante del servidor web para que este obtenga la IP real del cliente, se debe realizar la siguiente configuración.

Primero configúrelo en las reglas de proxy de Nginx

proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;

Esto hará que el proxy https de Nginx agregue la información del encabezado x_forwarded_for, guardando la IP real del cliente.

En segundo lugar, modifique la configuración de HAProxy

opción forwardfor excepto 10.1.10.0/24

Esta configuración es similar a la establecida anteriormente, excepto que hay una intranet adicional El segmento IP significa que si la solicitud recibida por HAProxy se transmite desde la intranet (máquina proxy https), el valor de x_forwarded_for no se establecerá para garantizar que el servidor web posterior reciba la solicitud transmitida desde el proxy https anterior.

¿Por qué HTTP_X_FORWARDED_FOR en PHP es diferente de Nginx?

Cuando su sitio web usa CDN, los usuarios accederán primero a la CDN. Si la CDN no almacena en caché, regresarán al sitio de origen. (es decir, su proxy inverso) para obtener los datos. Cuando la CDN regresa al sitio de origen, primero agregará la información del encabezado

x_forwarded_for para guardar la IP real del usuario. Su proxy inverso también establecerá este valor, pero no lo sobrescribirá. CDN La IP del servidor (es decir, la

remote_addr actual) se agrega al final de x_forwarded_for, de modo que habrá dos valores en x_forwarded_for. Nginx usará el primero de estos valores, que es la IP real del cliente, mientras que PHP usará el segundo, que es la dirección del CDN. Para que PHP también use el primer valor, debe agregar la siguiente configuración fastcgi.

fastcgi_param HTTP_X_FORWARDED_FOR $http_x_forwarded_for;

Pasará el valor utilizado por nginx (es decir, la primera IP) a PHP, de modo que en realidad solo hay un valor en x_forwarded_for que PHP obtiene, y no se utilizará la IP de la segunda CDN.

Ignora x_forwarded_for

De hecho, cuando usas el módulo realip de Nginx, te aseguras de que la IP real configurada en remote_addr sea la IP real del cliente. Echa un vistazo a esta configuración nuevamente. /p>

p>

set_real_ip_from 10.1.10.0/24;

real_ip_header X-Forwarded-For;

Establece x_forwarded_for en remote_addr, y x_forwarded_for en nginx toma uno de Primera IP.

El uso de esta configuración puede garantizar que la IP real del cliente siempre esté configurada en su dirección_remota y que x_forwarded_for se pueda ignorar :)