msgbartop
«Veni, vermini, vomui», ¿llegué, me puse bolinga, vomité?
msgbarbottom

29 jun 20 Uso de la cabecera X-Forwarded-For en un WordPress tras un proxy inverso

En fechas recientes he realizado un cambio de arquitectura en mi sitio web: he pasado de un servidor con WordPress colgado directamente en Internet a utilizar un frontal NGNIX como proxy inverso a la hora de acceder al sitio web. Hay diversas razones para ello, pero la principal está centrada en la seguridad. Sin embargo, esta arquitectura tiene una contrapartida: dado que el proxy inverso realiza una conversión SNAT de la dirección IP, el servidor WordPress interpreta que todas las peticiones vienen del proxy -lo que en realidad es rigurosamente cierto-, perdiéndose la información relativa a la IP real del equipo desde el que el usuario final accede.

Registros de WordPress mostrando la IP del servidor proxy inverso

Registros de WordPress mostrando la IP del servidor proxy inverso

Por suerte, este comportamiento se puede manipular. La idea general es incrustar la IP del cliente final en un campo cabecera (X-Forwarded-For), y luego modificar el comportamiento de WordPress para que haga uso de la IP contenida en esta cabecera como la IP del usuario. La receta para ello es la siguiente:

  • Configurar el proxy inverso que actúa de frontal para que incruste la IP del cliente en la cabecera X-Forwarded-For: En el caso de un servidor NGINX se realiza añadiendo la siguiente entrada al fichero nginx.conf:
    proxy_set_header X-Forwarded-For $remote_addr;
  • Verificar que la cabecera se inserta adecuadamente: En este caso, se puede realizar mediante una captura tcpdump en el servidor WordPress. Aquí dejo una pequeña guía de cómo realizarlo: TCPDump Capture HTTP GET/POST requests – Apache, Weblogic & Websphere
  • Indicar a WordPress que haga uso de la IP contenida en el campo X-Forwarded-For: Por último, hay que modificar el fichero wp-config.php del servidor WordPress, para reemplazar el valor del campo REMOTE_ADDR, que normalmente es la IP que realiza la petición a WordPress, por la IP contenida en la cebecera X-Forwarded-For. Se realiza incrustando este fragmento de código:
    // Use X-Forwarded-For HTTP Header to Get Visitor's Real IP Address

    if ( isset( $_SERVER['HTTP_X_FORWARDED_FOR'] ) ) {
    $http_x_headers = explode( ',', $_SERVER['HTTP_X_FORWARDED_FOR'] );

    $_SERVER['REMOTE_ADDR'] = $http_x_headers[0];
    }

Et voilà! A partir de este momento, nuestro WordPress pasa a mostrar de nuevo correctamente las IPs con la que se accede por parte de los usuarios del sitio a nuestro contenido.

Registro de WordPress mostrando correctamente la IP del usuario final

Registro de WordPress mostrando correctamente la IP del usuario final

VN:F [1.9.20_1166]
Rating: 10.0/10 (1 vote cast)

Etiquetas: , , ,