Мне очень часто приходят довольно интересные и нестандартные задания по настройке серверов.
Сегодня, например, меня попросили настроить ряд серверов для фильтрации любого трафика из определенных стран.
Причин для такой защиты много – снижение спама и атак, выравнивание коэффициентов и многое другое.
В моем случае нужно было заблокировать CN полностью, отдать полный канал РУ и вдвое меньше другим странам.
Конечно, полностью вводить все подсети вручную неудобно, да и они часто меняются.
Логичнее всего было использовать geoip. Самое эффективное это, конечно, привязать geoip к ядру.
В моем случае серверами были Debian, поэтому и даю рецепт именно на него.
Сначала скачайте исходники
apt-get install linux-source-2.6.18
tar xjf /usr/src/linux-source-2.6.18.tar.bz2 -C /usr/src/
apt-get source iptables
wget people.netfilter.org/peejix/patchlets/geoip.tar.gz
wget 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
tar xzf geoip.tar.gz -C patch-o-matic-ng-20070414/patchlets/
Теперь мы будем собирать
cd patch-o-matic-ng-20070407/
KERNEL_DIR=/usr/src/linux-source-2.6.18/ .
/runme geoip
Говорим «да» и уходим.
Теперь самое время установить все необходимое для сборки, если вы еще этого не сделали: apt-get install build-essential
После копирования текущей конфигурации ядра я просто вношу изменения: cd /usr/src/linux-source-2.6.18/
make oldconfig
поддержка сопоставления geoip (IP_NF_MATCH_GEOIP) [N/m/?] (НОВОЕ)
Здесь нужно сказать «м», чтобы собрать модуль.
Затем: make modules_prepare
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: make KERNEL_DIR=/usr/src/linux-source-2.6.18/ extensions/libipt_geoip.so
cp extensions/libipt_geoip.so /lib/iptables/
Совсем немного - база данных GeoIP
Для подготовки необходимо скачать бесплатную базу, хотя лучше взять платную версию – она более точная.
В любом случае база данных будет подготовлена с помощью csv2bin, который необходимо скомпилировать: wget people.netfilter.org/peejix/geoip/tools/csv2bin-20041103.tar.gz
tar xzf csv2bin-20041103.tar.gz
cd csv2bin/
make
Что ж, давайте собственно конвертируем бесплатную версию базы данных:
wget www.maxmind.com/download/geoip/database/GeoIPCountryCSV.zip unzip GeoIPCountryCSV.zip
.
/csv2bin .
/GeoIPCountryWhois.csv
Появляются 2 файла, geoipdb.bin и geoipdb.idx, которые необходимо закинуть в /var/geoip: mkdir /var/geoip
mv geoipdb.* /var/geoip/
После этого вы можете работать с mod_geoip, например так: iptables -A INPUT -p tcp --dport 80 -m geoip --src-cc CN -j REJECT
Отбрасываем трафик из CN. Вы также можете отмечать и менять полосы движения с помощью TC.
Вариант применения: NGINX
Если вы не собираете ядро или даже VDS, то вы можете сделать почти то же самое, установив nginx с mod_geoip на фронтенде.Во-первых, убедитесь, что nginx создан с поддержкой mod_goip. Я установил его; тем, у кого его нет, придется собирать заново, но это несложно.
Саму базу необходимо преобразовать с помощью geo2nginx.pl (находится в архиве с исходниками nginx) и добавить в конфиг: perl geo2nginx.pl < GeoIPCountryWhois.csv > geo.conf
cp geo.conf /etc/nginx/
Проще использовать пареную репу:
гео $country {
по умолчанию нет;
включите /etc/nginx/geo.conf;
127.0.0.0/24 ру;
}
Пример с трафиком CN: if ($country ~* cn )
{
rewrite ^(.
*)$ baidu.com/;
}
Как всегда, быстрое решение всегда имеет недостаток — в данном случае в виде паузы перед запуском nginx, так как база данных считывается в память.
Теги: #linux #Nginx #настройка Linux #защита #geoip
-
Asus Готовит Несколько Новых Продуктов Eee
19 Oct, 24