Компания MaxMind начала свою работу в 2002 году. Она поставила цель собрать базу IP-адресов и попытаться совершить географическую привязку этих адресов. Обычно такое делают с помощью «вардрайвинга» — автомобили курсируют по дорогам в поисках открытых хотспотов Wi-Fi, регистрируя их IP-адреса и GPS-координаты. Сбор идёт также с приложений на мобильных телефонов, которые сохраняют IP-адреса и свои координаты — так определяется принадлежность диапазона адресов какой-то компании. В результате была создана база данных GeoIP, которая сейчас используется очень широко, в самых разных интернет-сервисах.
Модуль GeoIP для Nginx создаёт переменные, значения которых зависят от IP-адреса клиента, используя готовые базы данных MaxMind.
Новый формат БД GeoIP2 создан с полной поддержкой IPv6, локализованными данными на нескольких языках, дополнительными данными и новым форматом, который позволил продолжать совершенствовать данные.
Задача: установить модуль ngx_http_geoip2_module, скачать базы GeoIP2 MaxMind и подключить к Nginx.
Если у вас 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
После этого вы сможете обновить базу данных 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
Мы обновили базу данных 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
В нашем примере мы ограничим доступ к нашему серверу для нескольких стран. Редактируем /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 позволяет подключить 3 геолокационных базы данных. База данных содержит блоки IP в качестве ключей и названия стран (городов, ASN) в качестве значений. Эти данные более полные и точные, чем полученные при помощи реверсивного поиска в DNS.
Вы можете напрямую работать с этими базами из своих используя утилиту 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>