{"id":4416,"date":"2020-06-29T10:01:10","date_gmt":"2020-06-29T09:01:10","guid":{"rendered":"http:\/\/bitacora.eniac2000.com\/?p=4416"},"modified":"2020-06-29T10:01:10","modified_gmt":"2020-06-29T09:01:10","slug":"uso-de-la-cabecera-x-forwarded-for-en-un-wordpress-tras-un-proxy","status":"publish","type":"post","link":"https:\/\/bitacora.eniac2000.com\/?p=4416","title":{"rendered":"Uso de la cabecera X-Forwarded-For en un WordPress tras un proxy inverso"},"content":{"rendered":"<p>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\u00e1 centrada en la seguridad. Sin embargo, esta arquitectura tiene una contrapartida: dado que el proxy inverso realiza una conversi\u00f3n SNAT de la direcci\u00f3n IP, el servidor WordPress interpreta que todas las peticiones vienen del proxy -lo que en realidad es rigurosamente cierto-, perdi\u00e9ndose la informaci\u00f3n relativa a la IP real del equipo desde el que el usuario final accede.<\/p>\n<figure id=\"attachment_4418\" aria-describedby=\"caption-attachment-4418\" style=\"width: 400px\" class=\"wp-caption aligncenter\"><a href=\"http:\/\/bitacora.eniac2000.com\/wp-content\/uploads\/2020\/06\/ip-local-wordpress.png\"><img loading=\"lazy\" decoding=\"async\" src=\"http:\/\/bitacora.eniac2000.com\/wp-content\/uploads\/2020\/06\/ip-local-wordpress-400x100.png\" alt=\"Registros de WordPress mostrando la IP del servidor proxy inverso\" title=\"Registros de WordPress mostrando la IP del servidor proxy inverso\" width=\"400\" height=\"100\" class=\"size-medium wp-image-4418\" \/><\/a><figcaption id=\"caption-attachment-4418\" class=\"wp-caption-text\">Registros de WordPress mostrando la IP del servidor proxy inverso<\/figcaption><\/figure>\n<p>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:<\/p>\n<ul>\n<li><strong>Configurar el proxy inverso que act\u00faa de frontal para que incruste la IP del cliente en la cabecera X-Forwarded-For:<\/strong> En el caso de un servidor NGINX se realiza <a href=\"https:\/\/www.networkinghowtos.com\/howto\/set-the-x-forwarded-for-header-on-a-nginx-reverse-proxy-setup\/\" target=\"_blank\">a\u00f1adiendo la siguiente entrada al fichero <em>nginx.conf<\/em><\/a>:<br \/>\n<code>proxy_set_header X-Forwarded-For $remote_addr;<\/code><\/li>\n<li><strong>Verificar que la cabecera se inserta adecuadamente:<\/strong> En este caso, se puede realizar mediante una captura tcpdump en el servidor WordPress. Aqu\u00ed dejo una peque\u00f1a gu\u00eda de c\u00f3mo realizarlo: <a href=\"https:\/\/www.middlewareinventory.com\/blog\/tcpdump-capture-http-get-post-requests-apache-weblogic-websphere\/\" target=\"_blank\">TCPDump Capture HTTP GET\/POST requests \u2013 Apache, Weblogic &#038; Websphere<\/a><\/li>\n<li><strong>Indicar a WordPress que haga uso de la IP contenida en el campo X-Forwarded-For:<\/strong> Por \u00faltimo, 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\u00f3n a WordPress, por la IP contenida en la cebecera X-Forwarded-For. Se realiza incrustando <a href=\"https:\/\/gist.github.com\/ryanjbonnell\/9509696\" target=\"_blank\">este fragmento de c\u00f3digo<\/a>:<br \/>\n<code>\/\/ Use X-Forwarded-For HTTP Header to Get Visitor's Real IP Address<\/p>\n<p>if ( isset( $_SERVER['HTTP_X_FORWARDED_FOR'] ) ) {<br \/>\n\t$http_x_headers = explode( ',', $_SERVER['HTTP_X_FORWARDED_FOR'] );<\/p>\n<p>\t$_SERVER['REMOTE_ADDR'] = $http_x_headers[0];<br \/>\n}<\/code><\/li>\n<\/ul>\n<p><em>Et voil\u00e0!<\/em> 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.<\/p>\n<figure id=\"attachment_4419\" aria-describedby=\"caption-attachment-4419\" style=\"width: 400px\" class=\"wp-caption aligncenter\"><a href=\"http:\/\/bitacora.eniac2000.com\/wp-content\/uploads\/2020\/06\/ip-real-wordpress.png\"><img loading=\"lazy\" decoding=\"async\" src=\"http:\/\/bitacora.eniac2000.com\/wp-content\/uploads\/2020\/06\/ip-real-wordpress-400x35.png\" alt=\"Registro de WordPress mostrando correctamente la IP del usuario final\" title=\"Registro de WordPress mostrando correctamente la IP del usuario final\" width=\"400\" height=\"35\" class=\"size-medium wp-image-4419\" \/><\/a><figcaption id=\"caption-attachment-4419\" class=\"wp-caption-text\">Registro de WordPress mostrando correctamente la IP del usuario final<\/figcaption><\/figure>\n","protected":false},"excerpt":{"rendered":"<p>En fechas recientes he realizado un cambio de arquitectura en<\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"advanced_seo_description":"","jetpack_seo_html_title":"","jetpack_seo_noindex":false,"_jetpack_memberships_contains_paid_content":false,"footnotes":"","jetpack_publicize_message":"","jetpack_publicize_feature_enabled":true,"jetpack_social_post_already_shared":false,"jetpack_social_options":{"image_generator_settings":{"template":"highway","default_image_id":0,"font":"","enabled":false},"version":2}},"categories":[13],"tags":[1169,1311,1794,1797],"series":[],"class_list":["post-4416","post","type-post","status-publish","format-standard","hentry","category-informatica","tag-nginx","tag-proxy-inverso","tag-wordpress","tag-x-forwarded-for"],"jetpack_publicize_connections":[],"jetpack_featured_media_url":"","jetpack_sharing_enabled":true,"_links":{"self":[{"href":"https:\/\/bitacora.eniac2000.com\/index.php?rest_route=\/wp\/v2\/posts\/4416","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/bitacora.eniac2000.com\/index.php?rest_route=\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/bitacora.eniac2000.com\/index.php?rest_route=\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/bitacora.eniac2000.com\/index.php?rest_route=\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/bitacora.eniac2000.com\/index.php?rest_route=%2Fwp%2Fv2%2Fcomments&post=4416"}],"version-history":[{"count":0,"href":"https:\/\/bitacora.eniac2000.com\/index.php?rest_route=\/wp\/v2\/posts\/4416\/revisions"}],"wp:attachment":[{"href":"https:\/\/bitacora.eniac2000.com\/index.php?rest_route=%2Fwp%2Fv2%2Fmedia&parent=4416"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/bitacora.eniac2000.com\/index.php?rest_route=%2Fwp%2Fv2%2Fcategories&post=4416"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/bitacora.eniac2000.com\/index.php?rest_route=%2Fwp%2Fv2%2Ftags&post=4416"},{"taxonomy":"series","embeddable":true,"href":"https:\/\/bitacora.eniac2000.com\/index.php?rest_route=%2Fwp%2Fv2%2Fseries&post=4416"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}