Debian.pro/

Про Debian


iptables+geoip. Баним по странам через iptables. Установка iptables-geoip/netfilter-geoip в Debian Squeeze.

UPD: начиная с Debian 8 Jessie в non-free репозитории есть пакет xtables-addon
Соответственно, тем, у кого jessie и выше, статью можно не читать, а просто сделать так:
apt-get install xtables-addon

Часто в разговоре с заказчиками или со знакомыми начинающими админами мелькает фраза «а забань китай!». Если админы говорят это с юмором, то заказчики — на полном серьезе с непониманием того, что не существует единого диапазона IP для Китая. И вот, админ топает куда-нибудь на ресурс, где есть списки подсетей, генерирует список для htaccess и/или nginx… И вот типа забанил. Угу. Чуть более глупые заказчики просят сделать это программеров. Программер подключает GeoIP к PHP…. Ну дальше вы поняли. Банить-то оно банит, но затраты ресурсов…
Кто-то поступает чуть более умнее. Берет списки подсетей и забивает их в iptables.
Несколько раз передо мной вставала такая задача. Первый раз я долго переводил взгляд со слова iptables на слово geoip и обратно. Думал, размышлял, фантазировал. Потом пошел в гугл и вбил «iptables + geo». Ну и нашел нужный модуль)
Всё бы хорошо, но его установка в Debian Squeeze несколько нетривиальна. Далее будет инструкция по установке в моем любимом дистре, а в конце статьи — несколько примеров использования этого прекрасного модуля.

Для начала скомпилируем сам модуль:
root@firewall:~# module-assistant auto-install xtables-addons-source
Если вылетит ошибка — жмите Continue и запускайте ещё раз — у меня после этого всё поставилось нормально.
Теперь запустим такую команду:
root@firewall:~# iptables -I INPUT ! -i lo -m geoip --src-cc US -j DROP
Нам пожалуются, что у нас нет БД в каталоге. Либо /usr/share/xt_geoip/LE, либо /usr/share/xt_geoip/BE. Зависит от архитектуры, но мне лениво запоминать какой каталог от какой архитектуры. Да и скопипастить директорию проще, чем потом создавать) Я буду отталкиваться от того, что у меня попросили директорию /usr/share/xt_geoip/LE.
Поставим нужные модули для perl и unzip:
root@firewall:~# aptitude install libtext-csv-xs-perl libxml-csv-perl libtext-csv-perl unzip
Собственно, проблема в том, что автособиралка модулей для дебиана не создаёт базу GeoIP для iptables. Но никто не мешает создать нам её руками. Идем за исходниками и распаковываем оттуда архив. После распаковки у меня получился каталог xtables-addons-1.28/
Соберем базу:
root@firewall:~# cd xtables-addons-1.28/geoip/
root@firewall ~/xtables-addons-1.28/geoip # ./geoip_download.sh
root@firewall ~/xtables-addons-1.28/geoip # mkdir -p /usr/share/xt_geoip/LE
root@firewall ~/xtables-addons-1.28/geoip # ./geoip_build_db.pl -D /usr/share/xt_geoip/LE < GeoIPCountryWhois.csv

База собрана. Можем начинать её использовать.
Приведу несколько примеров.
Забаним на сервере весь трафик от/до хостов, которые расположены не в Германии, Украине или России:
root@firewall:~# iptables -I INPUT ! -i lo -m geoip ! --src-cc DE,UA,RU -j DROP
Тоже самое, но только для 80го порта, с доступом только из России:
root@firewall:~# iptables -I INPUT -p tcp --dport 80 ! -i lo -m geoip ! --src-cc RU -j DROP
Забаним ненавистный китай совсем:
root@firewall:~# iptables -I INPUT ! -i lo -m geoip --src-cc CN -j DROP


Комментарии (29):

  1. Fix :

    Очень полезная статья.

  2. Roma :

    прикольная статья. Уже хотел самостоятельно собирать xtables, а оказалось он в m-a есть. Кстати я бы посоветовал запихнуть импорт базы ip в крон так как раз в месяц geoip обновляет опенсорсную базу. У меня была ситуация, когда geoip не мог определить страну, обновил базу и все стало на свои места.

  3. gridis :

    Все сделал по статье, только возникает проблема
    при установке правила iptables -I INPUT ! -i lo -m geoip ! —src-cc DE,UA,RU -j DROP пишет: iptables: No chain/target/match by that name.
    Вроде правило верное, но информации что-то больше не нашел

  4. Чудес не бывает, недоставили что-либо.

  5. gridis :

    Ну как бы использовал твой мануал, что бы настроить, так как испытал атаку на 1 из серверов компании и потребовалось решение. Честно скажу, занимался копипастом, так как хотел для начала просто решить проблему, а потом разобраться что и как, но как оказалось не все так гладко

  6. «как бы используя мануал», ты мог не заметить сообщение об ошибке. Или каталог для сборки перепутать.
    Выполняй все команды заново, лог консоли на пасту.

  7. ZULI :

    gridis, по этому мануалу поставил уже на десяток серверов с дебиан 6 — все в поряде.

  8. > iptables: No chain/target/match by that name.
    Это значит, что расширение установлено, но в iptables и ядро оно ещё не загружено. Самое простое решение — перезагрузить. Без перезагрузки modprobe с каким-то ключём, не помню, а залазить в маны лень.

  9. 2 Вася:
    Не, iptables умеет на лету подгружать модули, если для заведения правила нет нужного модуля.
    conntrack — яркий тому пример.

  10. Сори, перепутал. Не modprobe, а depmod.

  11. depmod запускаться из module-assistant запускаться.
    Но да, как вариант — там что-то пофейлилось. Хедеров ядра не было, например.

  12. ibiivomatvolk :

    А у меня проблема следующего характера:
    Could not open /usr/share/xt_geoip/LE/RU.iv4
    Разумеется нет, ведь в папке места назначения лежит RU.iv0
    Чего я сделал не так?

  13. А в BE нет ничего?

  14. ibiivomatvolk :

    где чего нет?
    з.ы. за тупость извиняюсь

  15. ibiivomatvolk :

    Понял. У меня только /LE, вероятно это из-за версии iptables и версии xtables-addons 1.32

  16. Тогда не всё скачалось.

  17. tsyuha :

    Статья очень лаконична и полезна — спасибо!

  18. Та не за чт ;)

  19. Андрей :

    При ребуте надо заново вводить, как сделать при рестарте чтобы появлялось в правилах само? :)

  20. apt-get install iptables-persistent
    Когда добьётесь нужного набора правил:
    iptables-save > /etc/iptables/rules

    После ребута правила применятся. Без iptables-save применяться не будут (чтобы ребутом можно было «починить»).

  21. Андрей :

    у меня там от fail2ban много правил, мне кажется если так сохранить, то при ребуте начнется ад?

  22. Ну поправьте конфиг после сохранения — он там понятный будет.

  23. aprogrammer :

    Класная штука, я юзал эту инструкцию для защиты от скана портов тем же аддоном http://sysadm.pp.ua/linux/xtables-addons.html

  24. Тем у кого проблема вроде: «Could not open /usr/share/xt_geoip/LE/RU.iv4 Разумеется нет, ведь в папке места назначения лежит RU.iv0» Не качайте xtables-addons с левых сайтов поставьте через apt-get install xtables-addons-source а потом:
    cd /usr/src/xtables-addons*
    ./xt_geoip_dl
    ./xt_geoip_build -D /usr/share/xt_geoip < GeoIPCountryWhois.csv

    Если потом iptables пожалуется: "iptables: No chain/target/match by that name." перезагрузите машину — модуль geoip не активировался.

    Просто версия билдера в статье неподходящая и зачем надо качать исходники xtables-addons со стороннего сайта если они есть в репозитарии непонятно. Всё это проверено мной на Debian Jessie. Задолбался гуглить — на форумах горе сисадмины с умным видом говорят мол версия у вас не правильная и копипастят туже самую инструкцию, но своими словами.

  25. > Просто версия билдера в статье неподходящая и зачем надо качать исходники xtables-addons со стороннего сайта если они есть в репозитарии непонятно.
    Ты год статьи посмотри.
    xtables-addon появился только в jessie.

  26. > горе сисадмины
    Я бы не стал называть горе-сисадминами тех, кто не держит серверов на testing/sid-ветках.

    А статью апнул, спасибо.

  27. Собственно:
    «но его установка в Debian Squeeze несколько нетривиальна»

  28. Недовольный :

    спасибо блеа
    iptables -I INPUT ! -i lo -m geoip —src-cc CN -j DROP
    после последнего примера инет отпал!

  29. Годная инструкция, пригодилась. Но в 2020-м году уже не так просто добыть базу maxmind-а в legacy-формате. Может, кому-то, как и мне, пригодится набор скриптов https://github.com/mschmitt/GeoLite2xtables которыми можно сконвертить то, что нынче раздает maxmind в тот формат, который ожидает увидеть xtables-addons версий 2.x

Написать комментарий