geoip2 и Cloudflare

Rambal Cochet
На сайте с 13.08.2022
Offline
9
778

Всем привет! Бьюсь над задачкой уже не один день и не могу найти решение.

Есть сервер с Nginx. Установил на него модуль geoip2 и новые базы от MaxMind (которые .mmdb). Настроил конфиг nginx и протестировал:

http {
    geoip2 /usr/share/GeoIP/GeoLite2-Country.mmdb {
    auto_reload 5m;
        $geoip2_metadata_country_build metadata build_epoch;
        $geoip2_data_country_code default=US country iso_code;
        $geoip2_data_country_name country names en;
    }
    geoip2 /usr/share/GeoIP/GeoLite2-City.mmdb {
        $geoip2_data_city_name default=London city names en;
    }

Чтобы удостовериться в работоспособности добавил add_header X-Real-IP в заголовок. Работает, IP отлавливает, показывает страны-города. Проверил работоспособность:

map $geoip2_data_country_code $allowed_country {
    default no;
      RU yes;
    }

в секцию http { и

if ($allowed_country = no) {
        return 444;
    }

в server нужного сайта. Работает.

Дальше добавил сервер за Cloudflare. Чтобы пробрасывались реальные адреса создал cloudflare.inc:

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;

и подключил, модуль ngx_http_realip_module имеется. Проверил - работает, реальный IP в логах, все хорошо.

И вот с этого момента начались приключения. Как-будто бы geoip2 перестал срабатывать. Инструкции

map $geoip2_data_country_code $allowed_country {
    default no;
      RU yes;
    }

и

if ($allowed_country = no) {
        return 444;
    }

не выполняются. Выглядит так, как будто либо поиска по базе вообще не происходит, либо туда передается неверный IP и поэтому не срабатывает. Add_header за Cloudflare уже не пробрасывается, естественно, и проверить не получится. Пробовал создавать map и специально передавать переменную в поиск по базе:

$geoip2_data_country_code source=$beri_IP_tut default=US country iso_code;
        $geoip2_data_country_name source=$beri_IP_tut country names en;

Результатов нет. Почему так? Стандартный $remote_addr видит правильный IP посетителя и пишет его в лог как полагается. Почему же тогда не срабатывает поиск по базе geoip2? Подставлять $remote_addr в качестве source= я тоже пробовал, не помогло. В чем может быть затык?

Старый вариант базы (с .dat) работает без проблем: ip видит и nginx инструкции выполняет (за Cloudflare).

geoip_country /usr/share/GeoIP/GeoIP.dat;
в секции http
Включение инклюда c диапазоном cloudflare выше него, как и в случае с geoip2

Подскажите, пожалуйста, куда копать.

[Удален]
#1

Зачем вам этот древний MaxMind?

Cloudflare сам страну передает - 

HTTP_CF_IPCOUNTRY
Rambal Cochet
На сайте с 13.08.2022
Offline
9
#2

Разобрался.

В nginx для виртуального хоста создается ДВЕ конфигурации server {

Первая слушает :80; , а вторая :443 ssl; В моем случае условие для хоста на проверку страны было указано только для второй конфигурации ssl и без CF оно срабатывало. Добавил условия для первого server и вуаля, все работает! Мда, и на старуху бывает проруха.

WapGraf #:

Зачем вам этот древний MaxMind?

Cloudflare сам страну передает

Привычка + куча уже готовых и проверенных конструкций-условий для блокировки ботов, юзерагентов и тд. на уровне nginx. А еще, когда читал гайды по использованию видел много нареканий на точность определения самим CF. Правда, это все были обсуждения годов 17-18, сейчас может точность идеальная, но все же.

Д
На сайте с 01.04.2012
Offline
165
#3
WapGraf #:

Зачем вам этот древний MaxMind?

Cloudflare сам страну передает - 

В каких-то случаях это небезопасно. Это ведь

HTTP_CF_IPCOUNTRY

подменить можно 

lutskboy
На сайте с 22.11.2013
Offline
192
#4
а как устанавливали?  Nginx пересобирали?
M
На сайте с 17.09.2016
Offline
135
#5
lutskboy #:
а как устанавливали?  Nginx пересобирали?

На современных версиях nginx, модуль можно собрать как динамический и подключить его в конфигурационном файле nginx

Авторизуйтесь или зарегистрируйтесь, чтобы оставить комментарий