Фильтрация пакетов по географическому признаку с помощью iptables и 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-адресов к странам
Мы будем использовать свободно распространяемую базу с Она имеет заявленную точность в 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
Оригинал:
5.02.08 | *NIX, Network |
А нафик оно нужно, если модуль ядра можно заменить простейшим скриптом?
Fat Bastard, хде яма? :-D
Возможна ли установка как-нибудь без пересборки ядра?
Например, установка супер-пупер ванильного ядра из репозитория?
Модуль ядра гораздо быстрее работает. Тебе так не кажется?
Так я дро и не надо пересобирать.. Надо собрать один модуль к нему
Быстрее чем что он работает? я имел ввиду сделать подобие таблицы в pf и заколотить туда скриптом нужные подсети.
Да на здоровье, в принципе.. Можешь хоть по одному IP-шнику вписывать :)
Или ты просто завидуешь, ведь у тебя на FreeBSD нет iptables :)
Я сочуствую бедным линуксоидам, потому что у них в линуксе нет pf
а на каждый чих модуль для ведра писать - это не Ъ
[…] руками. неполохое описание этого процесса есть здесь на русском или здесь на английском. версии немного […]