Образовательный проект «SnakeProject» Михаила Козлова

Навигация

⇒ FreeBSD and Nix ⇐

CISCO

Voice(Asterisk\Cisco)

Microsoft

Powershell

Python

SQL\T-SQL

Общая

WEB Разработка

ORACLE SQL \ JAVA

Мото

Стрельба, пневматика, оружие

Саморазвитие и психология


geoip2 nginx доступ в России и СНГ версия 2


geoip2 nginx доступ в России и СНГ версия 2

Первая версия статьи:
https://snakeproject.ru/rubric/article.php?art=geoip2_rsng_25022025

Вявились баги, описание и решение

В /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.

Пример:
# mmdblookup --file /var/lib/GeoIP/GeoLite2-Country.mmdb --ip 1.1.1.1 country iso_code
"UA" <utf8_string>

Пробуем определить для него параметр 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

Выполняем повторную проверку subdivisions 0 iso_code для адреса 1.1.1.1:
# mmdblookup --file /var/lib/GeoIP/GeoLite2-City.mmdb --ip 1.1.1.1 subdivisions 0 iso_code
"30" <utf8_string>

и более широкий набор параметров раздела subdivisions:
# mmdblookup --file /var/lib/GeoIP/GeoLite2-City.mmdb --ip 1.1.1.1 subdivisions

  [
    {
      "geoname_id":
        703447 <uint32>
      "iso_code":
        "30" <utf8_string>
      "names":
        {
          "de":
            "Stadt Kiew" <utf8_string>
          "en":
            "Kyiv City" <utf8_string>
          "fr":
            "Municipalité de Kiev" <utf8_string>
          "ru":
            "Киев" <utf8_string>
        }
    }
  ]

Видим, что для сети 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."
---

Пример файла

# cat /etc/nginx/nginx.conf
...
http {
...
    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 registered_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;
    }
...
}

Файл домена:
server {
    listen 443;                       
    server_name ***;
    if ($allowed_reg = no) { return 204; }
...

 


Комментарии пользователей

Эту новость ещё не комментировалиНаписать комментарий
Анонимам нельзя оставоять комментарии, зарегистрируйтесь!

Контакты Группа ВК Сборник материалов по Cisco, Asterisk, Windows Server, Python и Django, SQL и T-SQL, FreeBSD и LinuxКод обмена баннерами Видео к IT статьям на YoutubeВидео на другие темы Смотреть
Мои друзья: Советы, помощь, инструменты для сис.админа, статическая и динамическая маршрутизация, FreeBSD

© Snakeproject.ru создан в 2013 году.
При копировании материала с сайта - оставьте ссылку.
Весь материал на сайте носит ознакомительный характер,
за его использование другими людьми, автор ответственности не несет.

Рейтинг@Mail.ru
Рейтинг@Mail.ru Яндекс.Метрика





Поддержать автора и проект