Cloudflare — отличная штука для защиты сайтов от разных компьютерных жуликов — хацкеров. Однако, если они всё же узнали как-то оригинальный IP веб-сервера, на котором расположен сайт, они как минимум будут пробовать атаковать его по IP, минуя прокси. Можно городить редиректы, слать NGINX-ом ресеты кодом 444 при попытке зайти на несуществующие домены, но самый железный выход из ситуации такой: открыть http/https трафик на сервер только для IP адресов нашей защитной прокси.
Кстати, данный метод также может сделать отчасти бесполезным разного рода сайты вроде crimeflare.org. Ну узнал «сыщик», что домен когда-то был доступен по такому-то IP — проверить, там ли он ещё, попытавшись зайти директом на IP:443 или IP:80 будет уже бесполезно.
А если на сервере закрыть вообще все порты, отключить ICMP и реализовать доступ только через IPMI/VNC, никто не узнает, что на нашем IP вообще что-то существует.
Сделаем это в iptables.
У CloudFlare есть огромное количество адресов, но все они ужимаются в небольшое количество подсетей. Предвидя такой запрос, ребята опубликовали статью, рассказывающую, где можно найти их актуальные подсети и даже что писать в iptables. Одна проблема — делать это предполагается вручную, что довольно неудобно и ненадёжно: адресация в CloudFlare может меняться со временем, и когда-нибудь может получиться так, что прокся, расположенная на новых адресах, будет не разрешена у вас на сервере. Соответственно клиенты, чьи сесссии будут проходить через эти новые адреса, не смогут зайти на ваш сайт.
К счастью, проблема автоматизируема. Итак:
1. Запрещаем в iptables весь HTTP/HTTPS трафик:
iptables -I INPUT 1 -p tcp -m multiport --dports http,https -j DROP
2. Кладём куда-нибудь, например, по /root/cloudflare-update.sh скрипт cloudflare-update.sh со следующим содержимым:
#!/bin/bash
while read ip ; do iptables -D INPUT -p tcp -m multiport --dports http,https -s "$ip" -j ACCEPT ; done <<< "$(curl https://www.cloudflare.com/ips-v4)"
while read ip ; do iptables -I INPUT -p tcp -m multiport --dports http,https -s "$ip" -j ACCEPT ; done <<< "$(curl https://www.cloudflare.com/ips-v4)"
iptables-save > /etc/iptables/rules.v4
То есть мы удаляем все существующие записи, добавленные ранее, заново добавляем всё, что имеется в списке адресов CloudFlare. Таким образом избегаем дубликатов правил. К конце — сохраняемся.
3. Делаем скрипт исполняемым:
chmod +x /root/cloudflare-update.sh
4. В крон (например, в конец файла /etc/crontab) добавляем задание обновлять адреса каждые 12 часов:
0 */12 * * * root /root/cloudflare-update.sh &> /dev/null
Всё! Теперь попасть по 80 и 443 портам на ваш сервер можно только через прокси, т.к. в любой момент времени только адреса, принадлежащие прокси, разрешены на сервере.
Автор: crypby