sylvain durand

Restore IPs in nginx logs using Cloudflare

Cloudflare allows you to set up a proxy between your website and the outside world, providing a number of benefits: content caching, DDOS protection, analytics…

However, this comes with a drawback when using logs for web analytics or to track actions: visitors’ IPs are replaced by the IPs of Cloudflare’s servers.

Fortunately, Cloudflare always sends the original IP via the CF-Connecting-IP HTTP header, and a nginx mode allows it to be substituted for the Cloudflare IP.

To do this, you need to declare each Cloudflare IP you wish to replace. The updated list is on this page from Cloudflare. To date, this gives :

set_real_ip_from 173.245.48.0/20;
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 141.101.64.0/18;
set_real_ip_from 108.162.192.0/18;
set_real_ip_from 190.93.240.0/20;
set_real_ip_from 188.114.96.0/20;
set_real_ip_from 197.234.240.0/22;
set_real_ip_from 198.41.128.0/17;
set_real_ip_from 162.158.0.0/15;
set_real_ip_from 104.16.0.0/13;
set_real_ip_from 104.24.0.0/14;
set_real_ip_from 172.64.0.0/13;
set_real_ip_from 131.0.72.0/22;
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 2a06:98c0::/29;
set_real_ip_from 2c0f:f248::/32;
real_ip_header CF-Connecting-IP;

All you have to do is restart nginx and you’re done.