segunda-feira, 14 de maio de 2018

Repassar IP de Acesso do Proxy Reverso para o Servidor Web - Nginx + Apache

Introdução:

Quando um cliente solicita acesso a determinado site, ele na realidade acessa o Proxy reverso, que redireciona a conexão para o Servidor Web, porém o IP da requisição que consta nos logs do Servidor Web é o do Proxy Reverso.

Em algumas situações esse cenário não é adequado, como por exemplo, quando queremos liberar acesso à determinado endereço apenas para alguns IPs, ou em casos de auditoria. Para resolver a situação precisamos realizar as configurações no Nginx e no Apache.

Configurações no Nginx

Vou me ater apenas as opções que importam para o cenário proposto:
     location / {
     proxy_pass  http://<IP_Servidor_Web>;
     .
     .
     .
     proxy_set_header        Host            $host;
     proxy_set_header        X-Real-IP       $remote_addr;
     proxy_set_header        X-Forwarded-For $proxy_add_x_forwarded_for;

     }

 

Configurações no Apache

Para que o Apache entenda esses parâmetros ele precisa do módulo mod_remoteip.so, no caso do CentOS isso já é nativo:
# yum provides /etc/httpd/modules/mod_remoteip.so
Plugins carregados: fastestmirror
Loading mirror speeds from cached hostfile
 * base: ftp.unicamp.br
 * epel: mirror.globo.com
 * extras: ftp.unicamp.br
 * remi: remi.xpg.com.br
 * remi-safe: remi.xpg.com.br
 * updates: ftp.unicamp.br
httpd-2.4.6-67.el7.centos.6.x86_64 : Apache HTTP Server
Repo        : @updates
Resultado a partir de:
Nome de arquivo    : /etc/httpd/modules/mod_remoteip.so


O módulo já vai estar configurado para ser carregado automaticamente:
# grep remote * /etc/httpd/conf.modules.d/
00-base.conf:LoadModule remoteip_module modules/mod_remoteip.so


Mas precisamos realizar uma pequena alteração, acrescentando duas linhas:
# vi /etc/httpd/conf.modules.d/00-base.conf
LoadModule remoteip_module modules/mod_remoteip.so
RemoteIPHeader X-Forwarded-For
RemoteIPInternalProxy <IP_Proxy/Máscara>


Precisamos também alterar o padrão de logs do Apache (%a):
# vi /etc/httpd/conf/httpd.conf
#LogFormat "%h %l %u %t \"%r\" %>s %b \"%{Referer}i\" \"%{User-Agent}i\"" combined
LogFormat "%v %a %l %u %t \"%r\" %>s %b \"%{Referer}i\" \"%{User-Agent}i\"" combined


E reiniciar o Apache:
# systemctl restart httpd

Segue abaixo um exemplo do log gerado:
<Site_Solicitado> <IP_Origem> - - [14/May/2018:07:54:17 -0300] "GET ..." "Mozilla/5.0 (Windows NT 6.1; Win64; x64; rv:60.0) Gecko/20100101 Firefox/60.0"
 
É isso, espero que seja útil.

Referências:

Alpha Computer and Web Services
Server Fault - Apache mod_remoteip and access logs