Давно я хотел заняться ограничением доступа на сервера (особенно которые вещают стримы) на базе библиотеки GeoIP , но всё как-то отлаживал. Пока сегодня не заглянул в iftop. Большая часть адресов — китайгород. Приступаем к наведению порядка…
Есть хорошее дополнение xtables-addons которое работает-таки с либой GeoIP (как определить страну в php-скрипте на её базе писал здесь). Вот его и будем использовать для поставленной задачи. Тем более, что оно умеет определять страны в т.ч. по IPv6.
Ставим необходимые пакеты:
apt-get install iptables-dev xtables-addons-common libtext-csv-xs-perl pkg-config
Качаем, компилим и устанавливаем последнюю версию xtables-addons (на данный момент 2.12):
wget http://downloads.sourceforge.net/project/xtables-addons/Xtables-addons/xtables-addons-2.12.tar.xz tar xf xtables-addons-2.12.tar.xz cd xtables-addons-2.12 ./configure make make install
В скачанном xtables-addons в папке geoip уже имеются скрипты, которые способны осуществить обновление базы с сервиса geolite.maxmind.com.
Для этого выполняем следующие команды (в идеале добавить в крон раз в мес):
cd geoip ./xt_geoip_dl ./xt_geoip_build GeoIPCountryWhois.csv mkdir -p /usr/share/xt_geoip cp -r {BE,LE} /usr/share/xt_geoip
Всё! Сервер готов фильтровать трафик с помощью iptables.
Блочим негодяев:
# блокируем входящий китайтрафик iptables -A INPUT -m geoip --src-cc CN -j DROP # блокируем исходящий китайтрафик iptables -A OUTPUT -m geoip --dst-cc CN -j DROP
Страна (или если страны, то через запятую без пробелов) указываются в двухбуквенном обозначении согласно ISO-3166-1.
Если, например, надо заблочить все страны кроме Беларуси, то делается это так:
iptables -I INPUT -m geoip ! --src-cc BY -j DROP