José Alejandro Luis Palenzuela

Hacer que Apache muestre la IP real al usar Nginx como Proxy

Publicada el (modificada el: ) en Servidores. Etiquetas: , , , .

Hacer que Apache muestre la IP real al usar Nginx como Proxy

Cuando usamos Nginx como proxy reverso para servir contenido estático y Apache para el contenido dinámico tenemos el problema que no nos reconoce la IP del clientes (usuarios) cuando nos visita nuestro sitio, si intentamos que nos muestre la IP nos motrará la local (127.0.0.1), puede llegar hasta ser un problema de seguridad, ya que no puedes saber la ip del usuario para bloquearla o para que un plugin de WordPress de seguridad haga correctamente su trabajo, por suerte hay una solución. En mi caso me ha pasado este problema, ya que uso servidores con esta configuración, así que comparto con ustedes mi solución.

 

Lo primero que tenemos que hacer es agregar la configuración de proxy a nuestro archivo de configuración de Nginx (Virtualhost)

location ~ \.php$ {
proxy_set_header X-Real-IP  $remote_addr;
proxy_set_header X-Forwarded-For $remote_addr;
proxy_set_header Host $host;
proxy_pass   http://127.0.0.1:8080;
}

Luego habilitamos el mod de apache «remoteip»

a2enmod remoteip

Creamos el archivo de configuración para el mod de apache

nano /etc/apache2/conf-available/remoteip.conf

Y pegas esto dentro de ese archivo, recuerda que si tienes otra IP debes cambiarla.

RemoteIPHeader X-Forwarded-For
RemoteIPTrustedProxy 127.0.0.1

Cuando tengamos pegado lo de arriba guardamos el archivo de configuración con control + X y confirmando guardar pulsando «Y» más enter.

Habilitamos la configuración que acabamos de hacer.

a2enconf remoteip

Y por último reiniciamos Apache y Nginx, aunque no haría falta reiniciar también Nginx, siempre me gusta hacerlo de forma conjunta.

sudo service nginx restart && sudo service apache2 restart

Y con esto seria todo, ya ver la IP en los log de la web tanto, si usas WordPress con los plugins

Bonus

Si usas Cloudflare, también puede suceder algo parecido con el error mostrado arriba, en vez de mostrar la ip local en los log, muestra las ips de Cloudflare, solo hay que añadir las siguientes lineas en el archivo de configuración (virtualhost) de Nginx para que no salgan las IPs de Cloudflare. Vas a la ruta /etc/nginx/sites-available … y añades lo de abajo después de location ~ \.php$ {…

set_real_ip_from 103.21.244.0/22;
set_real_ip_from 103.22.200.0/22;
set_real_ip_from 103.31.4.0/22;
set_real_ip_from 104.16.0.0/12;
set_real_ip_from 108.162.192.0/18;
set_real_ip_from 131.0.72.0/22;
set_real_ip_from 141.101.64.0/18;
set_real_ip_from 162.158.0.0/15;
set_real_ip_from 172.64.0.0/13;
set_real_ip_from 173.245.48.0/20;
set_real_ip_from 188.114.96.0/20;
set_real_ip_from 190.93.240.0/20;
set_real_ip_from 197.234.240.0/22;
set_real_ip_from 198.41.128.0/17;
set_real_ip_from 2400:cb00::/32;
set_real_ip_from 2606:4700::/32;
set_real_ip_from 2803:f800::/32;
set_real_ip_from 2405:b500::/32;
set_real_ip_from 2405:8100::/32;
set_real_ip_from 2c0f:f248::/32;
set_real_ip_from 2a06:98c0::/29;

# use any of the following two
real_ip_header CF-Connecting-IP;
#real_ip_header X-Forwarded-For;