В /etc/nginx/nginx.conf скорректировали строку
$geoip2_data_country_code country iso_code; на
$geoip2_data_country_code registered_country iso_code;
Ранее была выполнена настройка ограничения регионов, из которых доступен сайт:
...
geoip2 /var/lib/GeoIP/GeoLite2-Country.mmdb {
$geoip2_data_country_iso_code country iso_code;
$geoip2_data_continent_code continent code;
auto_reload 60m;
$geoip2_metadata_city_build metadata build_epoch;
$geoip2_data_country_name country names en;
$geoip2_data_country_code country iso_code;
$geoip2_data_city_name city names en;
$geoip2_data_region_name subdivisions 0 names en;
$geoip2_data_state_code subdivisions 0 iso_code;
}
...
map "$geoip2_data_country_code:$geoip2_data_state_code" $allowed_reg {
~^RU: yes; #Россия
~^BY: yes; #Белоруссия
~^AM: yes; #Армения
~^KZ: yes; #Казахстан
~^KG: yes; #Кыргызстан
UA:40 yes; #Севастополь
UA:43 yes; #Крым
UA:14 yes; #Донецкая область
UA:09 yes; #Луганская область
UA:23 yes; #Запорожская область
UA:65 yes; #Херсонская область
GE:AB yes; #Абхазия
default no;
}
...
Т.е. на основании данных из файла GeoLite2-Country.mmdb
для ip-адресов клиента определяются параметры
и по значению параметра country iso_code решается,
давать доступ клиенту или нет.
Если country iso_code равен UA,
то для принятия решения нужен еще параметр subdivisions 0 iso_code.
Проанализировав при помощи команды
mmdblookup --file /var/lib/GeoIP/GeoLite2-Country.mmdb --ip ххх.ххх.ххх.ххх country_code state_code
ряд проблемных адресов, видим, что country iso_code равен UA.
Пробуем определить для него параметр subdivisions 0 iso_code:
# mmdblookup --file /var/lib/GeoIP/GeoLite2-Country.mmdb --ip 1.1.1.1 subdivisions 0 iso_code
Got an error looking up the entry data -
The lookup path does not match the data
(key that doesn't exist, array index bigger than the array, expected array or map where none exists)
Т.е. указанный параметр в файле GeoLite2-Country.mmdb не определен.
Сверяемся с официальной документацией nginx по использованию модулю GeoIP2:
https://docs.nginx.com/nginx/admin-guide/security-controls/controlling-access-by-geoip/
Видим, что параметр subdivisions 0 iso_code хранится не в файле БД GeoLite2-Country.mmdb,
а в файле GeoLite2-City.mmdb.
Пробуем скачать архив с файлом GeoLite2-City.mmdbпо ссылке в документации, сталкиваемся с проблемой:
компания maxmind, с сайта которой предлагается брать файл,
закрыла свободный доступ к нему и предлагает оформить подписку.
Находим альтернативный источник и скачиваем файл:
cd /var/lib/GeoIP
wget https://git.io/GeoLite2-City.mmdb
Видим, что для сети 1.1.1.1/22 оператора связи ООО <***>, зарегистрированного в г.Симферополь,
ошибочно определяются country iso_code UA и subdivisions 0 iso_code 30 (Киев).
Для примера, проверяем еще одну сеть этого же оператора: 2.2.2.2/20.
В GeoLite2-Country.mmdb country iso_code опять указан UA,
в GeoLite2-City.mmdb данные subdivisions 0 iso_code отсутствуют.
Итого, при текущей конфигурации блокировки с использованием GeoIP2
Для многих сетей в БД в параметре country iso_code страна ошибочно
(с т.з. законодательства РФ) определяется как UA,
а исключение по регионам работать не будет,
т.к. не настроено обращение к файлу БД GeoLite2-City.mmdb
Если скорректировать и настроить обращение к GeoLite2-City.mmdb,
то для многих подсетей регион в БД либо не указан,
либо указан некорректно
Т.е. многие сети ошибочно не попадают в белый список.
Ввиду большого количества, добавлять их вручную в исключения будет нерационально.
Предлагаем немного изменить подход и для определения разрешенных сетей использовать параметр
registered_country iso_code из GeoLite2-Country.mmdb, а не country iso_code.
Для упомянутых в качестве примера сетей 1.1.1.1/22 и 2.2.2.2/20 его значение RU.
Из issue репозитория компании MaxMind
на GitHub https://github.com/maxmind/libmaxminddb/issues/291?ysclid=mj05ghqd22945173811, "The country value is where the network is located, while the registered_country is the country of the organization the network was allocated to, and these aren't always expected to match." ---