Настройка CF-Connecting-IP заголовка Cloudflare

Так как при включении Cloudflare proxy, запросы к веб серверу будут приходить от серверов Cloudflare, а не напрямую от пользователей, по этому нужно настроить заголовок CF-Connecting-IP в котором передается реальный IP адрес пользователя, после настройки он будет отображаться как и раньше в логах и запросах.

Если apache2, то активируем модуль remoteip:

a2enmod remoteip
systemctl restart apache2

Откроем нужный файл конфигурации:

nano /etc/apache2/conf-enabled/remoteip.conf
or
nano /etc/apache2/sites-available/ixnfo.com.conf

И добавим:

RemoteIPHeader CF-Connecting-IP
# cloudflare.com/ips
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/13
RemoteIPTrustedProxy 104.24.0.0/14
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

Проверим конфигурацию и перезапустим apache2:

apache2ctl configtest
systemctl restart apache2

Если веб сервер nginx, то добавим к конфигурации сайта:

real_ip_header CF-Connecting-IP;
# cloudflare.com/ips
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;

Проверим конфигурацию и перезапустим nginx:

nginx -t
service nginx restart

Готово, заголовок CF-Connecting-IP настроен.

Также можно написать скрипт который будет обновлять IP адреса Cloudflare, но на практике они очень редко изменяются, дату последних изменений видно на странице с их списком.
Например скриптом их можно получать по официальным ссылкам www.cloudflare.com/ips-v4 и www.cloudflare.com/ips-v6, сохранять в файл и делать nginx -s reload чтобы применить изменения.

Также по желанию можно ограничить фаерволом порт 80 и 443 только для сетей Cloudflare, чтобы не получать прямые запросы на IP адрес сервера «Origin IP» или на домен если кто-то уже знает IP адрес сервера и пропишет его в локальном DNS или hosts на своем компьютере. Так как например есть сервисы которые хранят историю изменений DNS записей.

Пример скрипта:

#!/bin/bash
for ip in $(curl -s https://www.cloudflare.com/ips-v4); do
    iptables -A INPUT -p tcp -m multiport --dports 80,443 -s $ip -j ACCEPT
done

for ip in $(curl -s https://www.cloudflare.com/ips-v6); do
    ip6tables -A INPUT -p tcp -m multiport --dports 80,443 -s $ip -j ACCEPT
done

#iptables -A INPUT -p tcp -m multiport --dports 80,443 -j DROP
#ip6tables -A INPUT -p tcp -m multiport --dports 80,443 -j DROP
#iptables -nvL
#ip6tables -nvL

Или вручную:

iptables -A INPUT -s 173.245.48.0/20 -p tcp -m multiport --dports 80,443 -j ACCEPT
iptables -A INPUT -s 103.21.244.0/22 -p tcp -m multiport --dports 80,443 -j ACCEPT
iptables -A INPUT -s 103.22.200.0/22 -p tcp -m multiport --dports 80,443 -j ACCEPT
iptables -A INPUT -s 103.31.4.0/22 -p tcp -m multiport --dports 80,443 -j ACCEPT
iptables -A INPUT -s 141.101.64.0/18 -p tcp -m multiport --dports 80,443 -j ACCEPT
iptables -A INPUT -s 108.162.192.0/18 -p tcp -m multiport --dports 80,443 -j ACCEPT
iptables -A INPUT -s 190.93.240.0/20 -p tcp -m multiport --dports 80,443 -j ACCEPT
iptables -A INPUT -s 188.114.96.0/20 -p tcp -m multiport --dports 80,443 -j ACCEPT
iptables -A INPUT -s 197.234.240.0/22 -p tcp -m multiport --dports 80,443 -j ACCEPT
iptables -A INPUT -s 198.41.128.0/17 -p tcp -m multiport --dports 80,443 -j ACCEPT
iptables -A INPUT -s 162.158.0.0/15 -p tcp -m multiport --dports 80,443 -j ACCEPT
iptables -A INPUT -s 104.16.0.0/13 -p tcp -m multiport --dports 80,443 -j ACCEPT
iptables -A INPUT -s 104.24.0.0/14 -p tcp -m multiport --dports 80,443 -j ACCEPT
iptables -A INPUT -s 172.64.0.0/13 -p tcp -m multiport --dports 80,443 -j ACCEPT
iptables -A INPUT -s 131.0.72.0/22 -p tcp -m multiport --dports 80,443 -j ACCEPT

ip6tables -A INPUT -s 2400:cb00::/32 -p tcp -m multiport --dports 80,443 -j ACCEPT
ip6tables -A INPUT -s 2606:4700::/32 -p tcp -m multiport --dports 80,443 -j ACCEPT
ip6tables -A INPUT -s 2803:f800::/32 -p tcp -m multiport --dports 80,443 -j ACCEPT
ip6tables -A INPUT -s 2405:b500::/32 -p tcp -m multiport --dports 80,443 -j ACCEPT
ip6tables -A INPUT -s 2405:8100::/32 -p tcp -m multiport --dports 80,443 -j ACCEPT
ip6tables -A INPUT -s 2a06:98c0::/29 -p tcp -m multiport --dports 80,443 -j ACCEPT
ip6tables -A INPUT -s 2c0f:f248::/32 -p tcp -m multiport --dports 80,443 -j ACCEPT

Если политика INPUT по умолчанию DROP, то удалим разрешающие правила, если ACCEPT, то запрещающие правила всегда должны быть после разрешающих:

iptables -D INPUT -p tcp -m tcp --dport 80 -j ACCEPT
iptables -D INPUT -p tcp -m tcp --dport 443 -j ACCEPT
ip6tables -D INPUT -p tcp -m tcp --dport 80 -j ACCEPT
ip6tables -D INPUT -p tcp -m tcp --dport 443 -j ACCEPT

iptables -A INPUT -p tcp -m multiport --dports 80,443 -j DROP
ip6tables -A INPUT -p tcp -m multiport --dports 80,443 -j DROP

Смотрите также мою статью:
Подключение Cloudflare proxy

Оставьте комментарий

Добавить комментарий