Фильтрация пакетов по географическому признаку с помощью iptables и geoip

Брутфорс-атаки не должны представлять реальной угрозы для хорошо настроенного сервера, но, тем не менее, они отвлекают и засоряют лог-файлы. Существуют различные решения для предотвращения подобных атак. В этой заметке я расскажу вам о еще одном из них: GeoIP
GeoIP - это модуль для netfilter/iptables, который позволяет фильтровать приходящие пакеты по их географическому местоположению.
Этот модуль может быть использован не только для предотвращения брутфорса. Например, его можно использовать для так называемой “расистской маршрутизации”, т.е. для ограничения доступа к серверу пользователям из определенных стран. Оставим цели использования на совести системных администраторов, а в этой заметке я просто опишу установку и настройку модуля

Все проверялось на Debian 4.0, но ничего debian-специфичного в процессе нет, так что все должно работать и на других дистрибутивах GNU/Linux. Для установки нам понадобятся новый модуля для ядра, библиотеки для iptables и база соответствия IP-адресов странам. Пересобирать ядро не нужно.
Итак:

Подготовка
Первым делом нам понадобятся исходные тексты ядра, которое используется в системе. Для Debian Etch это 2.6.18

# apt-get install linux-source-2.6.18

Скачанные исходники будут лежать в /usr/src. Распакуем их:

# tar xjf /usr/src/linux-source-<version>.tar.bz2 -C /usr/src/

Замените <version> на версию вашего ядра. Для распакованного архива понадобится около 300 Мб свободного места.

Теперь нам нужны исходные тексты iptables. Нет необходимости пересобирать сам iptables, но исходники понадобятся для сборки модуля. Для работы с ними удобно использовать временную директорию

# mkdir ~/geoip
# cd ~/geoip/
# apt-get source iptables

Внимание, для использования apt-get source в вашей системе должен быть установлен пакет dpkg-dev

Теперь не хватает только самого geoip

# wget http://people.netfilter.org/peejix/patchlets/geoip.tar.gz

Для дальнейшей работы нам понадобится patch-o-matic-ng, его можно найти на Если у вас старое ядро, то, возможно, вам придется выбрать более старую версию, но для нашей заметки актуален последний снапшот:

# wget http://ftp.netfilter.org/pub/patch-o-matic-ng/snapshot/patch-o-matic-ng-20070414.tar.bz2

Распакуем полученный архив:

# tar xjf patch-o-matic-ng-20070414.tar.bz2

И распакуем исходники geoip в поддиректорию patchlets/ пакета patch-o-matic-ng

# tar xzf geoip.tar.gz -C patch-o-matic-ng-20070414/patchlets/

Наложение патчей
Применим необходимые патчи к ядру и iptables

# cd patch-o-matic-ng-20070407/
# KERNEL_DIR=/usr/src/linux-source-<version>/ IPTABLES_DIR=~/geoip/iptables-<version>/iptables/ ./runme geoip

Не забудьте заменить <version> на используемые в вашей системе версии ядра и iptables.
Если все прошло успешно, то patch-o-matic-ng предоставит информацию о полученном патче и предложит применить его. Ответьте y.

Сборка и установка модуля для ядра
Для сборки нам понадобится пакет build-essential. Если вы работаете не с Debian, то установите средства для разработки: gcc, make и т.д.

# apt-get install build-essential

Так как нам потребуется немного переконфигурировать ядро, мы возьмем за основу уже имеющуюся конфигурацию:

# cd /usr/src/linux-source-<version>/
# make oldconfig

На вопрос:

geoip match support (IP_NF_MATCH_GEOIP) [N/m/?] (NEW)

Ответьте m, чтобы собрать geoip как модуль.

Выполните подготовку для сборки модулей:

# make modules_prepare

Затем соберите модули.. К сожалению, я не знаю как собрать только один необходимый модуль, так что собираем все модули netfilter, пока кто-нибудь не предложит лучший способ :)

# make -C $(pwd) M=net/ipv4/netfilter/ modules

Если все нормально, то файл ipt_geoip.ko должен появиться в net/ipv4/netfilter/. Скопируем его к остальным модулям системы

# cp net/ipv4/netfilter/ipt_geoip.ko /lib/modules/$(uname -r)/kernel/net/ipv4/netfilter/

И активируем его:

# depmod
# modprobe ipt_geoip
# echo “ipt_geoip” >> /etc/modules

Сборка и установка библиотек iptables
Соберем библиотеку:

# cd ~/geoip/iptables-<version>/iptables/
make KERNEL_DIR=/usr/src/linux-source-<version>/ extensions/libipt_geoip.so

Не забывайте заменять <version>!!!

Скопируем полученный файл к другим библиотекам iptables

cp extensions/libipt_geoip.so /lib/iptables/

Создание файла привязок IP-адресов к странам
Мы будем использовать свободно распространяемую базу с MaxMind Она имеет заявленную точность в 98% и обновляется раз в месяц. Если для вас этого недостаточно, можно купить более точную платную версию там же. Скачайте и распакуйте базу:

# cd ~/geoip/
# wget http://www.maxmind.com/download/geoip/database/GeoIPCountryCSV.zip
# unzip GeoIPCountryCSV.zip

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

# wget http://people.netfilter.org/peejix/geoip/tools/csv2bin-20041103.tar.gz
# tar xzf csv2bin-20041103.tar.gz
# cd csv2bin/
# make
# ./csv2bin ../GeoIPCountryWhois.csv

Она создаст два файла geoipdb.bin и geoipdb.idx, которые необходимо положить в /var/geoip

# mkdir /var/geoip
# mv geoipdb.* /var/geoip/

Теперь вы можете выполнять фильтрацию по географическому признаку :)

# # Блокировка доступа к SSH всем, кроме Афганистана
# iptables -A INPUT -p tcp –dport 22 -m geoip ! –src-cc AF -j REJECT
# # Запрет на пинг хостов, расположенных во Франции, Италии и Испании
# iptables -A OUTPUT -p icmp -m geoip –dst-cc FR,IT,ES -j REJECT
# # Помощь
# iptables -m geoip –help

Оригинал: http://www.debian-administration.org/articles/518


 

Comments: 12

  1. Fat Bastard February 6th, 2008 at 12:27 pm

    А нафик оно нужно, если модуль ядра можно заменить простейшим скриптом?

  2. Zettich February 6th, 2008 at 1:15 pm

    Fat Bastard, хде яма? :-D

  3. Руслан February 6th, 2008 at 1:20 pm

    Возможна ли установка как-нибудь без пересборки ядра?
    Например, установка супер-пупер ванильного ядра из репозитория?

  4. boombick February 6th, 2008 at 1:38 pm

    А нафик оно нужно, если модуль ядра можно заменить простейшим скриптом?

    Модуль ядра гораздо быстрее работает. Тебе так не кажется?

    Возможна ли установка как-нибудь без пересборки ядра?

    Так я дро и не надо пересобирать.. Надо собрать один модуль к нему

  5. Fat Bastard February 7th, 2008 at 9:25 am

    Быстрее чем что он работает? я имел ввиду сделать подобие таблицы в pf и заколотить туда скриптом нужные подсети.

  6. boombick February 7th, 2008 at 10:10 am

    Да на здоровье, в принципе.. Можешь хоть по одному IP-шнику вписывать :)
    Или ты просто завидуешь, ведь у тебя на FreeBSD нет iptables :)

  7. Fat Bastard February 7th, 2008 at 4:39 pm

    Я сочуствую бедным линуксоидам, потому что у них в линуксе нет pf

  8. Fat Bastard February 7th, 2008 at 4:39 pm

    а на каждый чих модуль для ведра писать - это не Ъ

  9. GROM September 29th, 2008 at 8:16 am

    Очень полезная вещь, спасибо!!

  10. moskva October 2nd, 2008 at 1:10 am

    Интересная заметка, спасибо.

  11. Всё не так просто…» Архив блога » geoip в iptables October 9th, 2008 at 2:18 pm

    […] руками. неполохое описание этого процесса есть здесь на русском или здесь на английском. версии немного […]

  12. YaD October 13th, 2008 at 4:49 pm

    Спасибо автору.

Add a Comment

XHTML: You can use these tags: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <code> <em> <i> <strike> <strong>