Оказывается, мне не нужно полностью заново изобретать колесо, чтобы смешать какую-то поддержку GeoIP с IPTables. Просто используйте IPSet с копией базы данных MaxMind GeoIP Country в формате CSV - в дополнение к одному простому правилу IPTables - все, что вам нужно для запуска и запуска в Ubuntu 12.04.5 (LTS).
Дополнительное примечание, но некоторые онлайн-учебники, которые объясняют процедуру, подобную этой, рекомендуют использовать веб-файлы страновых зон, подобные тем, которые приходят с веб-сайта IPDeny:
http://www.ipdeny.com/ipblocks/data/countries/cn.zone
Хотя это технически работает, мне не нравится идея быть настолько зависимой от данных внешнего сайта, как это. Что если я захочу создать автоматизированный процесс создания сценариев для управления этим, а сайт IPDeny выйдет из строя или будет взломан? Чьи IP-адреса я бы заблокировал.
Вот почему я предпочитаю использовать базу данных MaxMind GeoIP Country в формате CSV на своих серверах. Я всегда могу получить новую копию этой базы данных, если мне нужны обновления, и даже если их сайт не работает, у меня всегда есть копия базы данных на моих серверах. И поскольку в этой базе данных содержатся все страны мира, я всегда могу легко добавить больше стран в набор IP-адресов, используя двухбуквенный код страны ISO 3166-1 .
В любом случае, вот шаги, которые я предпринял, чтобы сделать это с помощью IPSet и базы данных MaxMind GeoIP Country.
1. Установите IPSet.
Сначала установите IPSet следующим образом.
sudo aptitude install ipset
Как только это будет установлено, создайте набор IP-адресов BANNED_RANGES
следующим образом:
sudo ipset create BANNED_RANGES hash:net
2. Получить копию базы данных MaxMind GeoIP Country в формате CSV.
Следующим ключом к этому является получение копии базы данных MaxMind GeoIP Country в формате CSV, установленной на сервере. Мои шаги следующие:
curl -O -L http://geolite.maxmind.com/download/geoip/database/GeoIPCountryCSV.zip
Теперь просто распакуйте этот архив:
unzip -o -q -d . GeoIPCountryCSV.zip
3. Фильтруйте и импортируйте конфигурацию IPSet для конкретной страны, как это.
Теперь мы будем использовать Awk для фильтрации определенных диапазонов IP-адресов в Китае в конфигурационном файле IPSet:
awk -F "," -v COUNTRY_CODE=CN -v IPSET_TABLE=BANNED_RANGES} '$5 ~ COUNTRY_CODE { gsub(/"/, "", $1); gsub(/"/, "", $2); print "add "IPSET_TABLE" "$1"-"$2; }' /usr/local/share/GeoIP/GeoIPCountryWhois.csv >> ipset.BANNED_RANGES.conf
Это создаст файл конфигурации IPSet с именем ipset.BANNED_RANGES.conf, который затем можно импортировать в IPSet следующим образом:
sudo ipset restore < ipset.BANNED_RANGES.conf
И затем вы можете проверить элементы в этом наборе с помощью этой команды:
sudo ipset -l BANNED_RANGES | more
4. Информируйте IPTables об IPSet.
Теперь последний шаг, который объединяет все это - вставить простое правило в IPTables, например так:
sudo iptables -I INPUT -p tcp -m set --match-set BANNED_RANGES src -j REJECT
Как только это будет сделано, IPTables теперь знает, что любые IP-адреса или диапазоны, добавленные в набор BANNED_RANGES
будут просто отклонены через REJECT
.
Если вы как-то захотите избавиться от этого правила позже, вы можете запустить эту команду:
sudo iptables -D INPUT -p tcp -m set --match-set BANNED_RANGES src -j REJECT
Но для меня это немного грязно. Более чистый способ обработки такого случая - просто удалить все данные IP из набора BANNED_RANGES
например так:
sudo ipset flush BANNED_RANGES
Делая это, вы можете иметь это правило IPTables на месте и не делать ничего другого, кроме как сбросить данные из BANNED_RANGES
. Упрощает / упрощает обновление адресов или диапазонов, если вы хотите когда-либо добавлять или удалять IP-адреса или диапазоны из этого набора.