FreeBSD

Apache — mod_geoip

В данной статье будет вестись рассказ о настройке модуля mod_geoip для веб-сервера Apache. Данный модуль позволяет определить географическое положение подключившегося к серверу клиента по IP адресу. Зачем это нужно? Ответ прост — появляется возможность фильтрации клиентов по странам или автоматом направлять клиента на нужную часть сайта. К примеру, на данном сайте используется модуль, который сохраняет информацию о посетителях, оставивших комментарий (геоположение, ОС, браузер).
Вот информацию о геоположении как раз предоставляет модуль mod_geoip.

На момент написания статьи в портах доступна версия mod_geoip 1.2.8. Ставим модуль.

  1. # cd /usr/ports/www/mod_geoip2
  2. # make install clean

После установки модуля необходимо проверить включен ли он, для этого нужно посмотреть в главном конфигурационном файле Apache присутствует ли строчка:

  1. LoadModule geoip_module       libexec/apache22/mod_geoip.so

Для настройки модуля доступны следующие директивы:

  • GeoIPEnable bool — включить/отключить модуль. Включить/отключить модуль можно в любом месте конфигурационного файла, даже в .htaccess. Возможные значения On или Off.
  • GeoIPDBFile dbpath [flag] — путь к файлу с базой данных о географической информации. По умолчанию файл находится здесь: /usr/local/share/GeoIP/GeoIP.dat. Опциональное поле flag позволяет установить дополнительные режимы работы с базой данных (на данный момент модуль не позволяет комбинировать опции):
    • Standard — не использовать кеширование, таким образом используется меньше памяти. Является значением по молчанию.
    • MemoryCache — кешировать данные в памяти, влечет за собой большее потребление памяти. Рекомендуется использовать с небольшими базами днных.
    • MMapCache — делает тоже самое, что и MemoryCache, только для загрузки в память базы данных используется системный вызов mmap.
    • CheckCache — заставляет модуль проверять базу данных на предмет изменения (обновления). Если база данных была изменена, то модуль перезагрузит ее. Если опция не используется, то при изменении базы данных необходимо перезагружать Apache.
    • IndexCache — частичное кеширование данных из базы данных, то есть будут кешироваться данные, к которым были обращения. Рекомендуется использовать с большими базами данных.
  • GeoIPEnableUTF8 bool — предоставлять информацию о геоположении в кодировке UTF-8 вместо ISO-8859-1. Возможные значения On или Off.
  • GeoIPOutput param — параметр определяет, куда помещать информацию о геположении. Возможные значения:
    • Notes — только в таблицу уведомлений Apache (например, доступ из PHP можно осуществить через функцию apache_note).
    • Env — только в переменные окружения. Полный список переменных, которые добавляет модуль, есть на официальном сайте (ссылка на него в конце статьи).
    • All — комбинация Notes и Env. Является значением по умолчанию.
  • GeoIPScanProxyHeaders bool — проверять запрос на наличие заголовков (заголовки указаны в порядке проверки их модулем) HTTP_CLIENT_IP, HTTP_X_FORWARDED_FOR, X-Forwarded-For, HTTP_REMOTE_ADDR. Если такие присутствуют, то использовать IP адрес из них для определения местоположения. Возможные значения On или Off.
  • GeoIPUseLastXForwardedForIP bool — используется, если включен параметр GeoIPScanProxyHeaders. В заголовках (указанных выше), может быть указан не один IP адрес, а список IP адресов. Если такой присутствует, то по умолчанию используется первый IP адрес. С включением данного параметра будет использоваться последний IP адрес из списка. Возможные значения On или Off.

Не полный список переменных, которые добавляет модуль в переменные окружения и в таблицу уведомлений Apache:

  • GEOIP_ADDR — IP адрес, который использовался для поиска в базе данных.
  • GEOIP_CONTINENT_CODE — 2-х буквенный код континента, к которой принадлежит IP адрес (пример, EU для Европы).
  • GEOIP_COUNTRY_CODE — 2-х буквенных код страны (например, RU для России)
  • GEOIP_COUNTRY_NAME — полное название страны (например, Russian Federation для России)

Пример конфигурации модуля:

    <ifmodule geoip_module>
      GeoIPEnable Off
      GeoIPDBFIle /usr/local/share/GeoIP/GeoIP.dat Standard
      GeoIPEnableUTF8 Off
      GeoIPOutput Env
      GeoIPScanProxyHeaders On
      GeoIPUseLastXForwardedForIP On
    </ifmodule>

Модуль достаточно сконфигурировать глобально, а потом подключать его в нужных виртуальных хостах, например, таким образом:

    <virtualhost *:80>
    <ifmodule geoip_module>
      GeoIPEnable On
      <filesmatch ".(gif|jpe?g|png|ico|bmp|css|xml|pdf|rar|jar|js|doc|docx|html|xhtml)$">
        GeoIPEnable Off
      </filesmatch>
    </ifmodule>
    </virtualhost>

При желании там же можно изменить и другие параметры. Как говорилось ранее с помощью информации от модуля можно ограничивать доступ по странам, например для какого-нибудь виртуального хоста можно сделать:

    <ifmodule geoip_module>
      GeoIPEnable On
    </ifmodule><ifmodule setenvif_module>
      SetEnvIf GEOIP_COUNTRY_CODE RU AllowCountry
    </ifmodule>
      <directory /path/to/www>
        Deny from all
        Allow from env=AllowCountry
      </directory>

Таким образом, доступ к сайту будет только у жителей РФ. На официальном сайте можно скачать дополнительные базы (например, чтобы, отображался еще и город).

Оставить комментарий