Когда трафик сайта направляется через сеть Cloudflare, то в логи попадает не реальный адрес пользователя, а адреса серверов Cloudflare. Фактически Cloudflare выполняет роль обратного прокси сервера.
Это связано с механизмом работы: Все запросы принимают сервера Cloudflare, если есть кешированные данные, то они их возвращают. При необходимости осуществляется блокировка запросов или роутинг.
Реальный адрес посетителя содержится в заголовке: CF-Connecting-IP передающийся с каждым запросом.
Актуальный список серверов Cloudflare
Актуальный список серверов можно взять по адресу: https://www.cloudflare.com/ips/
Так же можно использовать для автоматизации:
Только IPv4: https://www.cloudflare.com/ips-v4
Только IPv6: https://www.cloudflare.com/ips-v6
Настройка Apache
Для восстановления реальных адресов посетителей ранее использовался модуль Apache - mod_cloudflare, но его поддержка прекращена.
Есть стандартный модуль Apache который позволить решит эту задачу: mod_remoteip
Проверить наличие:
1 2 | #httpd -M|grep remoteip_module remoteip_module (shared) |
модуль подключен, все хорошо.
Создаем файл /etc/httpd/conf.d/remoteip.conf
1 | sudo nano /etc/httpd/conf.d/remoteip.conf |
Со следующим содержимым:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 | RemoteIPHeader CF-Connecting-IP 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 |
после чего перезапускаем Apache
1 | service httpd restart |
Журналы доступа и ошибок Apache (необязательно)
Возможно, вам не потребуется выполнять этот шаг, но если вы обнаружите, что в журналах доступа и ошибок отображается IP прокси Cloudflare, а не IP удаленного пользователя, вам потребуется дополнительная настройка.
Зайдите на страницу вашего сайта, чтобы создать запись в журнале доступа, затем просмотрите журнал доступа, чтобы увидеть, показывает ли он ваш IP или IP прокси Cloudfare:
1 | sudo tail /var/log/apache2/access.log -n 200 |
Если он не показывает ваш IP, продолжите ниже. Чтобы реальный IP клиента (CF-Connecting-IP) появился в access.log и error.log, мы должны внести небольшое изменение в apache2.conf.
Отредактируйте файл apache2.conf:
1 | sudo nano /etc/apache2/apache2.conf |
в CentOS файл httpd.conf
1 | nano /etc/httpd/conf/httpd.conf |
Нажмите CTRL + W и найдите пункт LogFormat.
Формат журнала по умолчанию должен выглядеть примерно так, как показано ниже:
1 2 3 4 5 | LogFormat "%v:%p %h %l %u %t \"%r\" %>s %O \"%{Referer}i\" \"%{User-Agent}i\"" vhost_combined LogFormat "%h %l %u %t \"%r\" %>s %O \"%{Referer}i\" \"%{User-Agent}i\"" combined LogFormat "%h %l %u %t \"%r\" %>s %O" common LogFormat "%{Referer}i -> %U" referer LogFormat "%{User-agent}i" agent |
Переменная %h - это удаленный IP. Нам просто нужно изменить ее на %a, который является IP-адресом клиента, определенным модулем mod_remoteip.
1 2 3 4 5 | 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 LogFormat "%{Referer}i -> %U" referer LogFormat "%{User-agent}i" agent |
Сохранить и выйти (нажмите CTRL + X, нажмите Y и затем нажмите ENTER).
Перезапустите Apache.
Теперь сервер работает прозрачно, если пользователи напрямую заходят на сервер или через Cloudflare мы всегда будем видеть реальный IP адрес посетителя.
Настройка Nginx
Для Nginx необходимо использовать модуль ngx_http_realip_module
В секцию server добавить следующий конфиг
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 | 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/12; 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 2c0f:f248::/32; set_real_ip_from 2a06:98c0::/29; real_ip_header CF-Connecting-IP; real_ip_recursive on; |
и перезапускаем NGINX
1 | service nginx restart |