Содержание

Установка модуля GeoIP2 Nginx с новым форматом базы MaxMind

Компания MaxMind начала свою работу в 2002 году. Она поставила цель собрать базу IP-адресов и попытаться совершить географическую привязку этих адресов. Обычно такое делают с помощью «вардрайвинга» — автомобили курсируют по дорогам в поисках открытых хотспотов Wi-Fi, регистрируя их IP-адреса и GPS-координаты. Сбор идёт также с приложений на мобильных телефонов, которые сохраняют IP-адреса и свои координаты — так определяется принадлежность диапазона адресов какой-то компании. В результате была создана база данных GeoIP, которая сейчас используется очень широко, в самых разных интернет-сервисах.

Модуль GeoIP для Nginx создаёт переменные, значения которых зависят от IP-адреса клиента, используя готовые базы данных MaxMind.

Новый формат БД GeoIP2 создан с полной поддержкой IPv6, локализованными данными на нескольких языках, дополнительными данными и новым форматом, который позволил продолжать совершенствовать данные.

Задача: установить модуль ngx_http_geoip2_module, скачать базы GeoIP2 MaxMind и подключить к Nginx.

Шаг 1: Как скачать, установить и обновить базы GeoIP MaxMind

Если у вас Ubuntu 22, вам не нужны сторонние репозитории, модуль ngx_http_geoip2_module находится в стандартных репозиториях. Просто установите его при помощи apt. Настройка конфигурационного файла geoip2 такая же как и в CentOS7.

Для обновления GeoIP требуется учетная запись MaxMind. Начните с установки пакета geoipupdate и этих зависимостей из вашего менеджера пакетов. Требуется GeoIP Update 4.x или выше. Смотрим что у нас в репозиториях:

Обновление утилиты geoipupdate для CentOS 7 (как видно ниже, в репозиториях версия 2.5, а на нужно выше четвертой версии):

yum install geoipupdate geoipupdate-cron

# geoipupdate -V
geoipupdate 2.5.0

yum remove geoipupdate
yum -y install https://repo.aerisnetwork.com/pub/aeris-release-7.rpm
yum install geoipupdate libmaxminddb libmaxminddb-devel mmdb2

# geoipupdate -V
geoipupdate 4.9.0

Установка geoipupdate на Ubuntu через PPA. MaxMind предоставляет PPA для последних версий Ubuntu. Чтобы добавить PPA в ваши источники, запустите:

sudo add-apt-repository ppa:maxmind/ppa
sudo apt update
sudo apt install geoipupdate libmaxminddb0 libmaxminddb-dev mmdb-bin
  1. Вам необходимо создать учетную запись на веб-сайте MaxMind, который предоставляет эти базы данных. Я выбираю версию Lite. Это менее точно, но бесплатно: зарегистрируйтесь в GeoLite2.
  2. После регистрации на сайте теперь вы можете сгенерировать новый лицензионный ключ в своей учетной записи MaxMind. После генерации, вы сможете скачать файл с настройками, в котором будет указаны ваш аккаунт, номер лицензии и тип вашей лицензии. geoipupdate по умолчанию ищет файл конфигурации /etc/GeoIP.conf. В файле /etc/GeoIP.conf теперь нужно заменить YOUR_ACCOUNT_ID_HERE, YOUR_LICENSE_KEY_HERE и EditionID из скаченного файла.

После этого вы сможете обновить базу данных geoip.

EditionIDs GeoLite2-ASN GeoLite2-City GeoLite2-Country

После этого вы сможете обновить базу данных geoip.

geoipupdate

Добавьте новое правило cron, чтобы включить еженедельное обновление:

crontab -e
# Run GeoIP database update all the thuesday at 02:00
0 2 * * 2 /usr/bin/geoipupdate

Файлы базы данных хранятся в директории /usr/share/GeoIP

# ls -la /usr/share/GeoIP
total 78672
-rw-r--r-- 1 root root  7709554 Apr 27 13:24 GeoLite2-ASN.mmdb
-rw-r--r-- 1 root root 67340309 Apr 27 13:24 GeoLite2-City.mmdb
-rw-r--r-- 1 root root  5501501 Apr 27 13:24 GeoLite2-Country.mmdb

Шаг 2: Установка модуля GeoIP2 Nginx

Мы обновили базу данных GeoIP2, теперь нам нужно добавить модуль GeoIP2 в Nginx. Начните с клонирования репозитория модуля на github.

git clone https://github.com/leev/ngx_http_geoip2_module.git

Для компиляции модуля ngx_http_geoip2_module действуйте так же, как в статье 2 способа установки модуль testcookie для борьбы с DDoS в Nginx. Не имеет смысла рассматривать этап компиляции несколько раз. Все одно и тоже, добавляет путь к модулю

--add-module=/root/nginxmake/ngx_http_geoip2_module

Шаг 3: Пример использования GeoIP2: управление доступом для стран

В нашем примере мы ограничим доступ к нашему серверу для нескольких стран. Редактируем /etc/nginx/nginx.conf

http {
geoip2 /usr/share/GeoIP/GeoLite2-Country.mmdb {
        $geoip2_data_country_iso_code country iso_code;
        $geoip2_data_continent_code   continent code;
    }

geoip2 /usr/share/GeoIP/GeoLite2-City.mmdb {
    $geoip2_data_city_name   city names en;
    $geoip2_data_postal_code postal code;
    $geoip2_data_latitude    location latitude;
    $geoip2_data_longitude   location longitude;
    $geoip2_data_state_name  subdivisions 0 names en;
    $geoip2_data_state_code  subdivisions 0 iso_code;
}

    map $geoip2_data_country_iso_code $allowed_country {
       default no;
       FR yes; # France
       BE yes; # Belgium
       DE yes; # Germany
       CH yes; # Switzerland
    }

Редактируем нужный виртуальный домен, добавим строки

server {
# Block forbidden country
       if ($allowed_country = no) {
           return 444;
       }

Все, что вам нужно сделать, это попытаться получить доступ к вашему сайту через VPN из страны, которую вы забанили.

curl https://wiki.darkfire.cf
curl: (92) HTTP/2 stream 1 was not closed cleanly: PROTOCOL_ERROR (err 1)

Поздравляю! Установка модуля и его настройка закончены.

Заключение: Что содержится в базах MaxMind и как с ними работать?

Бесплатно MaxMind позволяет подключить 3 геолокационных базы данных. База данных содержит блоки IP в качестве ключей и названия стран (городов, ASN) в качестве значений. Эти данные более полные и точные, чем полученные при помощи реверсивного поиска в DNS.

  1. GeoLite2-ASN.mmdb - определение автономной системы (AS) по IP
  2. GeoLite2-City.mmdb - определение города по IP
  3. GeoLite2-Country.mmdb - определение страны (ИСО 3166) по IP

Вы можете напрямую работать с этими базами из своих используя утилиту mmdblookup, например выведем на русском языке в какой стране зарегистрирован IP 8.8.8.8

mmdblookup --file /usr/share/GeoIP/GeoLite2-Country.mmdb --ip 8.8.8.8 registered_country names ru
 
  "США" <utf8_string>