xtables-addons: фильтруем пакеты по странам
Задача блокировки трафика из определенных стран кажется простой, но первое впечатление обманчиво. Сегодня расскажем, как это можно реализовать.
Предыстория
Рекомендуем прочитать статью полностью, прежде чем выполнять указанные команды.
Подготовка операционной системы
Фильтрация будет настраиваться с помощью утилиты iptables, которой требуется расширение для работы с GeoIP-данными. Такое расширение можно найти в xtables-addons. xtables-addons устанавливает расширения для iptables в виде самостоятельных модулей ядра, благодаря чему не нужно перекомпилировать ядро ОС.
На момент написания статьи актуальная версия xtables-addons — 3.9. Тем не менее, в стандартных репозиториях Ubuntu 20.04 LTS можно найти только 3.8, а в репозиториях Ubuntu 18.04 — 3.0. Установить расширение из пакетного менеджера можно следующей командой:
Отметим, что между версией 3.9 и текущим состоянием проекта есть небольшие, но важные различия, о которых мы поговорим позднее. Для сборки из исходных кодов устанавливаем все необходимые пакеты:
xtables-addons содержит множество расширений, но нас интересует только xt_geoip. Если не хочется тащить в систему ненужные расширения, их можно исключить из сборки. Для этого нужно отредактировать файл mconfig. Для всех желаемых модулей поставить m, а все ненужные отметить n. Собираем:
И устанавливаем с правами суперпользователя:
Во время установки модулей ядра может возникнуть ошибка примерно такого содержания:
Такая ситуация возникает из-за невозможности подписать модули ядра, т.к. нечем подписывать. Решить эту проблему можно парой команд:
Скомпилированный модуль ядра установлен, но система его не определяет. Попросим систему создать карту зависимостей с учетом нового модуля, а затем загрузим его:
Убедимся, что xt_geoip загружен в систему:
Дополнительно убедимся, что расширение загрузилось в iptables:
Нас все устраивает и остается только добавить название модуля в /etc/modules, чтобы модуль заработал после перезагрузки ОС. С этого момента iptables понимает команды geoip, но ему не хватает данных для работы. Приступаем к загрузке базы данных geoip.
Получение базы данных GeoIP
Создаем каталог, в котором будет хранится информация, понятная расширению iptables:
В начале статьи мы упоминали, что между версией из исходного кода и версией из пакетного менеджера есть различия. Самое заметное различие заключается в смене поставщика базы данных и скрипте xt_geoip_dl, который скачивает актуальные данные.
Версия из пакетного менеджера
Скрипт лежит по пути /usr/lib/xtables-addons, однако при попытке запуска можно увидеть не самую информативную ошибку:
Ранее в качестве базы данных использовался продукт GeoLite, ныне известный как GeoLite Legacy, распространяемый по лицензии Creative Commons ASA 4.0 компанией MaxMind. С этим продуктом произошло сразу два события, которые «сломали» совместимость с расширением для iptables.
Во-первых, в январе 2018 года объявили о прекращении поддержки продукта, и второго января 2019 года с официального сайта убрали все ссылки на скачивание старой версии базы. Новым пользователям рекомендуется использовать продукт GeoLite2 или его платную версию GeoIP2.
Во-вторых, c декабря 2019 года MaxMind заявила о значительном изменении в доступе к их базам. Чтобы соответствовать Калифорнийскому закону о защите прав потребителей, компания MaxMind приняла решение «прикрыть» распространение GeoLite2 регистрацией.
Так как мы хотим воспользоваться их продуктом, зарегистрируемся на этой странице.
После на почту придет сообщение с просьбой установить пароль. Теперь, когда мы завели аккаунт, нужно создать лицензионный ключ. В личном кабинете находим пункт My License Keys, а затем нажимаем на кнопку Generate new License Key.
При создании ключа нам зададут только один вопрос: будем ли мы использовать этот ключ в программе GeoIP Update? Отвечаем отрицательно и нажимаем на кнопку Confirm. Во всплывающем окне будет отображен ключ. Сохраните этот ключ в надежное место, так как после закрытия всплывающего окна вы больше не сможете посмотреть ключ полностью.
У нас есть возможность скачивать базы GeoLite2 в ручном режиме, но их формат не совместим с форматом, который ожидает скрипт xt_geoip_build. Здесь на помощь приходят скрипты GeoLite2xtables. Для работы скриптов устанавливаем perl-модуль NetAddr::IP:
Далее клонируем репозиторий со скриптами и записываем в файл полученный ранее лицензионный ключ:
Запускаем в работу скрипты:
MaxMind накладывает ограничение в 2000 скачиваний в сутки и при большом количестве серверов предлагает кэшировать обновление на прокси-сервере.
Обратите внимание, что выходной файл обязательно должен называться dbip-country-lite.csv. К сожалению, 20_convert_geolite2 выдает не идеальный файл. Скрипт xt_geoip_build ожидает три колонки:
Отметим, что автор GeoLite2xtables не считает свои скрипты готовыми для продакшена и предлагает следить за разработкой оригинальных скриптов xt_geoip_*. Поэтому перейдем к сборке из исходных кодов, в которой эти скрипты уже обновлены.
Версия из исходных кодов
При установке из исходных кодов скрипты xt_geoip_* располагаются в каталоге /usr/local/libexec/xtables-addons. В этой версии скрипта используется база данных IP to Country Lite. Лицензия — Creative Commons Attribution License, а из доступных данных те самые необходимые три столбца. Скачиваем и собираем базу:
После этих действий iptables готов к работе.
Используем geoip в iptables
Модуль xt_geoip добавляет всего два ключа:
Файлы, созданные xt_geoip_build, используются только при создании правил, но не учитываются при фильтрации. Таким образом, для корректного обновления базы geoip необходимо сначала обновить iv*-файлы, а затем пересоздать все правила, которые используют geoip в iptables.
Заключение
Фильтрация пакетов в зависимости от принадлежности к странам — несколько забытая временем стратегия. Несмотря на это, программные средства для такой фильтрации развиваются и, возможно, в скором времени в пакетных менеджерах появится новая версия xt_geoip с новым поставщиком geoip-данных, что значительно упростит жизнь системным администраторам.
GeoIP, попытки нетрадиционного использования
Предыстория
В один прекрасный момент, случайно наткнулся на старый сервис, который позволяет вешать картинку на свой сайт, которая показывает географическое положение посетителей. Их много и разных.
Вещь сама по себе не такая уж полезная, мне как то данные awstats’а хватает за глаза.
Но для демонстрации посетителю, что он не случайный идиот прохожий забредший на мертвый сайт это дело подходит.
Дальше как и полагается раскинул мозгами на тему, а как же они это делают, разобрался и вроде успокоился…
Но больная голова покоя рукам не дает, так что сейчас я вам покажу один забавный и не несущий смысловую нагрузку эксперимент.
Это выборка всех возможных координат IP-шников (с округленные до целых).
Можно сказать, что это фотография интернета ареал обитания TCP/IP
Внимание, автор не является кодером в хорошем смысле этого слова, поэтому лиц, которых может шокировать копрокод прошу удалиться.
Осмотр файла GeoLiteCity.dat показал, что очень похоже на бинарное дерево, а его как парсить быстро и безболезненно я к сожалению пока не раскурил.
Первой мыслей сразу же пришел вариант перебора всех возможных ip адресов в занесении в БД уникальных координат.
256^4=4294967296 даже за минусом резервных, локальных и т.д. все равно приводит к оценкам времени, которые никак не радуют. Закончим за полгода, это уже хорошо.
После активного подхода к задачке вспомнилось, что у GeoIP вроде были и другие варианты хранения их данных, и бинго CSV формат спас отца русской демократии.
Пример файла:
5751,»US»,»NY»,»Albany»,»12209″,42.6390,-73.7890,532,518
5752,»US»,»NY»,»Hillsdale»,»12529″,42.2164,-73.5413,532,518
5753,»US»,»NY»,»Albany»,»12225″,42.6706,-73.7791,532,518
Всего 310070 запись.
Так как генерить картинку по всем трехсотдесяти тысяч точкам как то не кошерно, то делаем скрипт, который будет парсить CSV файл и заносить уникальные округленные позиции в БД, ну а потом уже делать выборку из БД и рисовать картинку.
Почему округленные, мне не нужна была высокая точность, так что точка длины и широты была достаточна.
Если же захочется сделать что то подобное размером 3600 на 1800, то ничто не запрещает вам повторить данный эксперимент дочитать пост до конца.
Выбор инструментов.
MySQL — уже стоит, уже под рукой. там создается одна таблица, со 4 колонками (x, y, kol, достаточно было двух, но последнее я добавил, что бы посмотреть где больше всего сконцентрировано записей)
Perl — для написания парсера CSV и занесения в БД, Так же под рукой, плюс в нем удобней писать в joe через SSH с коммуникатора. Проффесионалов перлистов прошу сильно не смотреть на код.
PHP с библиотекой GD, собственно для генерации собственно картинки. Почему? опыт работы с GD библиотекой именно из php большой.
Создаем БД и таблицу:
CREATE DATABASE IF NOT EXISTS `geo`;
CREATE TABLE IF NOT EXISTS `all` (
`x` int(3) NOT NULL,
`y` int(3) NOT NULL,
`kol` int(64) NOT NULL
);
И понеслось, основная проблема во времени обработки была, не в том что данных много, а то что мы их тупо и без красивых решений перебираем по порядку.
php скрипт по генерации картинки:
#!/usr/local/bin/php
Итог парсера:
Всего 310072 строк в файле
уникальных координат (с округлением) 8226, что всего 2,65%
Размер таблицы 384 килобайт 🙂
Время обработки:
На заполнения БД: порядка пару часов.
На формирование картинки, в приделах миллисекунд.
База GeoIP для геолокации по IP-адресу превратила в кошмар жизнь женщины в Канзасе

Геолокация IP-адресов в мире
Компания MaxMind начала свою работу в 2002 году. Она поставила цель собрать базу IP-адресов и попытаться совершить географическую привязку этих адресов. Обычно такое делают с помощью «вардрайвинга» — автомобили курсируют по дорогам в поисках открытых хотспотов Wi-Fi, регистрируя их IP-адреса и GPS-координаты. Сбор идёт также с приложений на мобильных телефонов, которые сохраняют IP-адреса и свои координаты — так определяется принадлежность диапазона адресов какой-то компании.
В результате была создана база данных GeoIP, которая сейчас используется очень широко, в самых разных интернет-сервисах.
Разумеется, это не точная наука (пример). Иногда сервис может определить только страну по IP-адресу, иногда — город. Чтобы отображать такие «нечёткие» данные на карте, MaxMind определяет координаты для условного центра каждой страны, штата и города. Например, если неизвестно местоположение американского IP-адреса, тогда просто отображается метка в центре страны.
Тут начинается самое интересное. Точный географический центр США находится в северном Канзасе, около границы с Небраской. Технически, его географические координаты 39°50′N 98°35′W. На цифровых картах это соответствует 39.8333333,-98.585522. По какой-то причине компания MaxMind в 2002 году решила «упростить» указатель на географический центр и установила его в более простом виде 38°N 97°W или 38.0000,-97.0000.
В итоге, за последние 14 лет для каждого неизвестного адреса в США компания указывала эти координаты. Такое случалось часто: около 5000 компаний запрашивают эти данные из базы MaxMind, а вообще сейчас более 600 миллионов IP-адресов связаны с этими координатами. Если хотя бы один из этих адресов используется мошенниками, преступниками, ворами мобильных телефонов — база данных MaxMind выдаёт одинаковые координаты: 38.0000,-97.0000.
Координаты прямо перед домом Джойс Тейлор.
Первый звонок она получила в 2011 году из Коннектикута. Разъярённый мужчина ругался, что его фирма не может пользоваться электронной почтой: все ящики завалены спамом. «Он сказал, спам идёт с адреса фермы. — говорит Тейлор. — Тогда я начала подозревать, что-то происходит».
В следующие месяцы звонки и визиты неизвестных участились. «Сыщики»-любители проводили свои расследования и «пробивали человека по IP», что приводило их к дому пожилой женщины в Канзасе. До сих пор в сети можно найти многочисленные жалобы в Facebook, YouTube, Reddit, Ripoff Report и Google+, если ввести её домашний адрес в поиске.

Тот самый унитаз
Нападки на Джойс Тейлор продолжались, так что пришлось вмешаться даже местному шерифу. Он разместил дорожный знак в конце дороги с просьбой не проезжать к дому и по всем вопросам звонить ему.
«Эта бедная женщина годами подвергалась притеснениям», — говорит он. Местная полиция взяла на себя общение с представителями различных силовых ведомств, которые приезжали сюда.
Джойс Тейлор — не единственная жертва «бага» в сервисах определения координат по IP-адресу. В прошлом году журналистка Кашмир Хилл рассказывала, как к молодой паре в одном доме в Атланте постоянно приезжают люди, требуя вернуть свои телефоны, по наводке приложений типа Find-My-Phone.
Хилл предположила, что есть и другие с аналогичными проблемами — и попросила знакомого программиста обработать открытую базу данных MaxMind, чтобы составить список адресов, которым соответствует максимальное количество IP. Таких оказались тысячи. Адрес Тейлор был на первом месте с 600 млн IP-адресов, многократно опережая других (дом в Атланте оказался на 865 месте).
Кашмир Хилл написала в MaxMind — они ни о каких проблемах не слышали.
Она также связалась с другими людьми из списка. У некоторых действительно случались странные похожие истории. Например, Тони Пав живёт в Эшбёрне (шт. Виргиния). Рядом располагаются несколько крупных дата-центров. В общей сложности на данные координаты приходится более 17 миллионов IP-адресов. Из-за выбора координат по умолчанию в городе картографические сервисы указывают именно на жилище Тони. У него проблемы начались в 2012 году, когда он обнаружил наряд полиции возле дома. Они искали украденный ноутбук одной из государственных служб.

Поисковый ордер, предъявленный Тони Паву в 2012 году
Затем были звонки от разозлённых людей и т.д. Тони планирует продать дом через три года, когда уйдёт на пенсию, и он опасается, что никто не захочет его покупать, если узнает об этой ситуации.
Один из основателей компании MaxMind пообещал журналистке в переписке, что они предпримут меры для решения проблемы. Будут выбраны новые точки по умолчанию для географических объектов — посреди водоёмов.
Обновление базы данных MaxMind намечено на вторник (12.04.2016 г), а большинство фирм-клиентов выпустят свои обновления через несколько недель или месяцев.
EssentialsX
Сам плагин состоит из не нескольких плагинов, а именно:
Каждый из этих плагинов выполняет свои функции, необязательно ставить весь комплект этих плагинов. Достаточно будет поставить плагины: EssentialsX, EssentialsX Chat, EssentialsX Spawn. Данные 3 плагина добавят все основное на ваш сервер.
Плагин EssentialsX
Это основной плагин из плагинов EssentialsX, он добавляет все основные команды на сервер.
Плагин EssentialsX Spawn
Плагин EssentialsX Chat
Этот плагин позволяет настроить чат на вашем сервере. Благодаря этому плагину на вашем сервере станут показываться префиксы в чате. Также есть настройка для включения отображения префиксов в табе.
Ещё можно использовать необязательные дополнения:
Мы настоятельно рекомендуем использовать последнюю версию Paper. В ней исправлены ошибки и улучшена производительность по сравнению со Spigot и CraftBukkit, включая исправление некоторых не ванильных поведений. EssentialsX использует преимущества более эффективной асинхронной телепортации и поддержку современных функций геймплея, которые возможны только на Paper.
В комментариях выше относительно оценки ядер Akarin, Yatopia, Mohist или Magma изложено мнение разработчиков EssentialsX, которое не обязательно совпадает с мнением редакции сайта Minecrafter.pro
ВНИМАНИЕ
Для работы плагина EssentialsX нужно установить плагин Vault
ВНИМАНИЕ
Для Майнкрафт 1.7.10 или еще более старых версий — нужно использовать Essentials.
Сага о геолокации и как сделать гео-вебсервис на NGINX без движка базы данных и без программирования
Сегодня мы поднимем довольно старую тему про геолокацию по IP-адресу и новую про быстрые веб-сервисы без «языков программирования» 
Наша компания занимается созданием Интернет-магазинов запчастей на собственной SaaS-платформе (ABCP.RU), а также у нас есть несколько связанных проектов, например, сервис поиска запчастей 4MyCar.ru.
Как и многие другие веб-проекты, мы в своё время пришли к пониманию необходимости геолокации по IP-адресу. Например, сейчас она используется на 4MyCar.ru для определения региона (при первом входе на сайт регион автоматически устанавливается именно так).
Аналогично производится выбор ближайшего к клиенту филиала магазина на сайтах клиентов платформы ABCP.
Когда перед нами впервые возникла задача геолокации, мы только начинали изучать этот вопрос. Собственно говоря, на тот момент, кроме баз MaxMind, особых альтернатив не было. Попробовали, поигрались и забросили. В реальной работе несколько раз воспользовались MaxMind GeoLite для того, чтобы отфильтровать особо назойливых ботов, пытавшихся уложить сайты наших клиентов 
(хватило фильтрации по стране в nginx, примитивная проверка в if, см. документацию ngx_http_geoip_module). Бесплатные базы не давали достаточной точности в RU, содержали названия городов в латинице и поэтому не очень нам подходили для других целей.
Через некоторое время один из наших сотрудников обнаружил отличный сайт ipgeobase.ru, позволяющий “скачать” базы геолокации для России и Украины, а также воспользоваться его XML веб-сервисом через простой http запрос. Например, переход на сайт 4mycar.ru по фразе “масляный фильтр купить в урюпинске” из соответствующего города вызывал в итоге примерно такой запрос к веб-сервису http://ipgeobase.ru:7020/geo?ip=217.149.183.4. В результатах были названия города и региона на русском языке, что было очень удобно. В очень короткие сроки работу с веб-сервисом задействовали в коде, определяющем ближайший филиал магазина. Однако, после запуска в продакшн выявилось несколько проблем:
1) обычно запрос к веб-сервису требовал некоторого небольшого времени (сотые доли секунды в нормальном состоянии из датацентра в Москве), но вот из офиса разработчиков в регионе задержки были уже выше (где-то полсекунды);
2) изредка (по нашим наблюдениям, в “часы пик”) это время было ощутимо больше, что вызывало уже неприятные задержки при ответе нашим клиентам;
3) так уж вышло, что для одного и того же клиента несколько раз требовалось провести геолокацию, отсюда возник вопрос о кешировании геоданных;
4) своими неоптимальными запросами мы создавали нагрузку на веб-сервис ipgeobase, что было нехорошо по отношению к владельцам сервиса;
5) для других стран (не RU и не UA) геолокация не работала.
Для решения этих проблем мы быстро “собрали совещание”
и получили два основных варианта решения: взять базы и написать свой веб-сервис (периодически скачиваем базы ipgeobase, импортируем в свою базу данных, отдаём через http с кешированием, например, в memcached) или сделать кеширование геоданных в memcached или redis (запрашиваем данные в ipgeobase и сохраняев в кеш). Навскидку оба варианта требовали достаточно много столь дефицитных человеко-часов разработчиков, и в итоге нашелся третий вариант: мы несколько снижаем точность (заменяем последний октет в ip адресе на 0 и исходим из того, что у провайдеров одна подсеть /24 находится в разных городах не слишком часто) и делаем на своём оборудовании кеширующий прокси на nginx с большим временем кеширования и маленькими таймаутами при запросах к ipgeobase. Этот вариант оказался очень эффективным, в разы снизил нагрузку на ipgeobase и время геолокации. Вариант с собственным веб-сервисом был отложен на неопределенное время.
Через некоторое время нам вновь понадобилась геолокация в nginx (да, опять эти боты, но теперь уже много из RU), поэтому фильтрации по стране по данным баз MaxMind оказалось недостаточно. 
Потребовалось это срочно, поэтому воспользовались другим geo модулем (ngx_http_geo_module) и вывели из базы ipgeobase номер региона в переменную. Этого хватило, чтобы “заткнуть дыры”.
Вскоре нам попался скрипт ipgeobase2nginx.php, который создавал базы для nginx и, в итоге, получили человекочитаемую информацию о городе в переменной. Эти данные, а также данные MaxMind, можно уже было выводить в логи или передавать в заголовках на backend, что, в принципе, всех устраивало.
Всё это время мы периодически задумывались о дальнейшем развитии. Планы по созданию собственного веб-сервиса пылились в списках TODO и всплывали изредка в виде “а я тут вечером хочу изучить python/erlang/haskell/etc, что бы написать следующим после ‘Hello world’?”, но дальше хотелок не двигались.
Внезапно, сначала в виде шутки за чаем (just for fun), возникла идея на основе имеющихся в nginx наработок сделать веб-сервис, аналогичный ipgeobase, но без движка базы данных и использования скриптовых языков.
Быстрый анализ того, что мы имеем, дал такой результат:
1) в свободном доступе есть базы GeoLite в csv и ipgeobase в тексте;
2) модуль ngx_http_geo_module умеет выставлять значения переменных по IP-адресу, а также делает это ужасно быстро (даже использует для ускорения binary geo range base);
3) для RU и UA мы доверяем ipgeobase, но, по возможности, хотим видеть и данные MaxMind;
4) в nginx отлично реализованы ssi (ngx_http_ssi_module), причем не только для text/html, но и для других типов файлов;
5) nginx может взять ip адрес из заголовка запроса и считать, что это IP-адрес клиента (ngx_http_realip_module), а значит, передать его модулю geo.
Осталось добавить несколько “наколеночных” скриптов, которые из файлов csv и ipgeobase сделают требуемые куски конфигов для nginx.
Вот что у нас получилось:
https://yadi.sk/d/QsNN87nMesXo8 — конфиги и скрипты.
Для того чтобы показать веб-сервис в работе, мы временно развернули его на VDS, доступном по ссылке http://muxgeo-demo.4mycar.ru:6280/muxgeo/.
Чтобы быстро запустить такой сервис у себя, вы можете загрузить готовый образ LXC — https://yadi.sk/d/1WrvV2RyesYFM (логин: пароль — ubuntu:ubuntu).
Приведем краткое описание работы скриптов, в LXC мы располагаем их в /opt/scripts.
Для работы требуется дополнительный файл от MaxMind с названиями регионов:
dev.maxmind.com/static/csv/codes/maxmind/region.csv
Теперь сами скрипты:
GeoLite2nginx.pl — генерирует файлы out/nginx_geoip_*
ipgeobase2nginx.pl — генерирует файлы out/nginx_ipgeobase_*
Нам потребуется наложить диапазоны IP-адресов в geoip и ipgeobase. Для этого первые два скрипта при выполнении создали файлы с целочисленным представлением IP-адресов ( out/nginx_geoip_num.txt и out/nginx_ipgeobase_num.txt ). Мы вручную сделали файл in/nginx_localip_num.txt, в который положили список зарезервированных диапазонов (локальные сети и т.п.). Дополнительно из результирующих списков исключить диапазон multicast адресов.
Как мы это делаем:
Скрипт make-dup-ranges.pl проходит по списку и для каждого четного ip (начало нового диапазона) добавляет в список предыдущий (конец предыдущего диапазона), а для каждого нечетного — следующий. Дальше список сортируем, убираем дубликаты.
Скрипт make-ranges.pl создает такой конфиг с диапазонами для nginx.
Теперь у нас есть конфиги для nginx, надо их подключить.
Схема у нас будет состоять из frontend и backend (frontend передает запросы на backend с преобразованием заголовков и кешированием). Сделаем всё это на ubuntu 14.04 в контейнере LXC, nginx возьмем с официального сайта.
Содержимое out положим сюда:
/etc/nginx/muxgeo/data/
Сделаем “обвязки”, которые установят необходимые переменные:
/etc/nginx/muxgeo/muxgeo.conf
/etc/nginx/muxgeo/muxgeo-geoip.conf
/etc/nginx/muxgeo/muxgeo-ipgeobase.conf
А также примитивную логику для backend:
/etc/nginx/muxgeo/muxgeo_site.conf
Конфиги для frontend и backend находятся здесь:
/etc/nginx/conf.d/muxgeo-frontend.conf (слушает порт 6280)
/etc/nginx/conf.d/muxgeo-backend.conf (порт 6299)
Также нам понадобится файл, допустим, index.html, в котором мы выведем в нужном нам формате данные с помощью SSI в nginx. Расположим его в каталоге
/opt/muxgeo/muxgeo-backend/muxgeo
Таким образом, запрос к
http://muxgeo-demo.4mycar.ru:6280/muxgeo/?ip=217.149.183.4
транслируется на backend с подменой ip адреса на 217.149.183.4, а backend вставит информацию в нужные места html текста.
Но html страничка — это немного не то, что нам хотелось, нужен xml, как у ipgeobase. Просто заполняем шаблон выводом соответствующих полей, смотрите пример в файле muxgeo.xml
По ссылке
http://muxgeo-demo.4mycar.ru:6280/muxgeo/muxgeo.xml?ip=217.149.183.4
получим “такой же, но лучше”, чем у ipgeobase вывод xml, да еще и в utf-8
Для того, чтобы протестировать работу, можно, например, создать гео-базу по адресам всех стран в формате, похожем на результат упоминавшегося выше (ipgeobase2nginx.php). Сделаем текстовый файл с шаблоном (muxgeo_fullstr.txt) и простой скрипт, который прочитает данные для всех имеющихся диапазонов.
Небольшое замечание. В примерах frontend и backend работают на одном nginx. В случае большой нагрузки имеет смысл разнести их на разные nginx, так как воркер для backend с геоданными потребляет больше памяти, чем минимальный nginx с proxy_cache.
Каково дальнейшее развитие этого проекта? Можно, например, добавить другие источники данных, совсем немого усложнив конфигурацию, а также подключить свои гео-базы, в которые поместить “уточнения, полученные из достоверных источников 🙂 ”.




