Desde hace tiempo conozco y utilizo “CloudFlare“, para proyectos personales y proyectos de clientes, es un proxy inverso, funciona como CDN (Content Delivery Network), y cuenta con muchas características adicionales, muy recomendable su uso por seguridad y velocidad, CloudFlare creo “mod_cloudflare” un módulo para el servidor Apache, del cual prepare un pequeño paquete (.deb) para GNU/Linux Debian llamado “libapache2-mod-cloudflare“, para ese entonces funciono muy bien, lamentablemente, CloudFlare no mantiene regularmente ese código, mediante un anuncio dio a conocer, que “mod_cloudflare” será abandonado totalmente, es necesario buscar alternativas.
Al instalar “libapache2-mod-cloudflare”, Apache obtiene y puede utilizar la dirección IP “real” del visitante, al recibir una petición a través de los servidores de CloudFlare, además, permite tener acceso solo a través de los servidores de CloudFlare, y no de manera directa al servidor web o Apache, con una sencilla configuración.
<IfModule cloudflare_module>
CloudFlareRemoteIPHeader X-Forwarded-For
CloudFlareRemoteIPTrustedProxy x.x.x.x
DenyAllButCloudFlare
</IfModule>
Necesitamos que el servidor web, en este caso Apache, obtenga la dirección IP “real” del visitante, utilizaremos un módulo llamado “remoteip“, con la configuración siguiente; puedes utilizar tu editor de texto favorito, en mi caso usaré “nano” 😉 .
Creamos el archivo “remoteip.conf“, para configurar el propio módulo.
# nano /etc/apache2/mods-available/remoteip.conf
<IfModule mod_remoteip.c>
RemoteIPHeader X-Forwarded-For
RemoteIPTrustedProxy 173.245.48.0/20
RemoteIPTrustedProxy 103.21.244.0/22
RemoteIPTrustedProxy 103.22.200.0/22
RemoteIPTrustedProxy 103.31.4.0/22
RemoteIPTrustedProxy 141.101.64.0/18
RemoteIPTrustedProxy 108.162.192.0/18
RemoteIPTrustedProxy 190.93.240.0/20
RemoteIPTrustedProxy 188.114.96.0/20
RemoteIPTrustedProxy 197.234.240.0/22
RemoteIPTrustedProxy 198.41.128.0/17
RemoteIPTrustedProxy 162.158.0.0/15
RemoteIPTrustedProxy 104.16.0.0/12
RemoteIPTrustedProxy 172.64.0.0/13
RemoteIPTrustedProxy 131.0.72.0/22
RemoteIPTrustedProxy 2400:cb00::/32
RemoteIPTrustedProxy 2606:4700::/32
RemoteIPTrustedProxy 2803:f800::/32
RemoteIPTrustedProxy 2405:b500::/32
RemoteIPTrustedProxy 2405:8100::/32
RemoteIPTrustedProxy 2a06:98c0::/29
RemoteIPTrustedProxy 2c0f:f248::/32
</IfModule>
RemoteIPHeader, nombre de cabecera, que contiene la dirección IP “real” del visitante, conforme las especificaciones de CloudFlare, se debe leer la cabecera “X-Forwarded-For“.
RemoteIPTrustedProxy, dirección de servidor, el cual enviará cabeceras para nosotros confiables, utilizaremos esta directiva, con la dirección IP de todos los servidores que integran la red de CloudFlare.
CloudFlare mantiene una lista actualizada, con la dirección IP de todos sus servidores, puede consultarse en el siguiente enlace.
https://www.cloudflare.com/ips/
Habilitamos el módulo “remoteip“.
# a2enmod remoteip
Si reiniciamos el servidor Apache en este momento, con la configuración realizada, Apache ya conoce y puede utilizar la dirección IP que le brinda “remoteip”, pero, al momento de almacenar los registros en los archivos “access.log” y “error.log“, aún no se almacena la dirección IP “real” del visitante, necesitamos crear un archivo de configuración adicional.
Creamos el siguiente archivo “remoteip.conf“, en la carpeta para configuraciones de Apache.
# nano /etc/apache2/conf-available/remoteip.conf
LogFormat "%v:%p %a %l %u %t \"%r\" %>s %O \"%{Referer}i\" \"%{User-Agent}i\"" vhost_combined
LogFormat "%a %l %u %t \"%r\" %>s %O \"%{Referer}i\" \"%{User-Agent}i\"" combined
LogFormat "%a %l %u %t \"%r\" %>s %O" common
Estas mismas lineas, se encuentran casi al final del archivo “apache2.conf“, no las modificaremos directamente, por eso creamos este archivo adicional, solo se cambia el parámetro “%h” de las lineas originales por “%a“.
Habilitamos la configuración en Apache.
# a2enconf remoteip
Finalmente, solo falta reiniciar o recargar la configuración de Apache.
# systemctl restart Apache2
Permitir el acceso, solo de servidores de CloudFlare, al servidor web o Apache, se puede realizar con reglas adicionales a nuestro firewall, con lo cual lograremos tener la otra función que realizaba “mod_cloudflare” o en mi caso “libapache2-mod-cloudflare”.
La configuración la realizaré para “shorewall“, es una aplicación para configurar el firewall, de una manera rápida y sencilla, la configuración completa de shorewall, dependerá para cada servidor, solo veremos las reglas necesarias, para hacer el “whitelist“, a la dirección IP de cada servidor de CloudFlare, en este caso se contempla para ipv4 e ipv6.
Shorewall (ipv4), creamos el archivo “blrules“.
# nano /etc/shorewall/blrules
#ACTION SOURCE DEST PROTO DPORT
ACCEPT net:173.245.48.0/20 $FW tcp http
ACCEPT net:103.21.244.0/22 $FW tcp http
ACCEPT net:103.22.200.0/22 $FW tcp http
ACCEPT net:103.31.4.0/22 $FW tcp http
ACCEPT net:141.101.64.0/18 $FW tcp http
ACCEPT net:108.162.192.0/18 $FW tcp http
ACCEPT net:190.93.240.0/20 $FW tcp http
ACCEPT net:188.114.96.0/20 $FW tcp http
ACCEPT net:197.234.240.0/22 $FW tcp http
ACCEPT net:198.41.128.0/17 $FW tcp http
ACCEPT net:162.158.0.0/15 $FW tcp http
ACCEPT net:104.16.0.0/12 $FW tcp http
ACCEPT net:172.64.0.0/13 $FW tcp http
ACCEPT net:131.0.72.0/22 $FW tcp http
REJECT net $FW tcp http
Recargamos la configuración:
# systemctl reload shorewall
Shorewall6 (ipv6), creamos otro archivo “blrules“.
# nano /etc/shorewall6/blrules
#ACTION SOURCE DEST PROTO DPORT
ACCEPT net:2400:cb00::/32 $FW tcp http
ACCEPT net:2606:4700::/32 $FW tcp http
ACCEPT net:2803:f800::/32 $FW tcp http
ACCEPT net:2405:b500::/32 $FW tcp http
ACCEPT net:2405:8100::/32 $FW tcp http
ACCEPT net:2a06:98c0::/29 $FW tcp http
ACCEPT net:2c0f:f248::/32 $FW tcp http
REJECT net $FW tcp http
Recargamos la configuración:
# systemctl reload shorewall6
Ya no necesitaremos “mod_cloudflare” o “libapache2-mod-cloudflare” 😀 .