Pull to refresh

Как защитить сервер от посетителей из нежелаемых стран

Reading time 3 min
Views 9.8K
Ко мне очень часто поступают довольно интересные и нестандартные задачи по настройке серверов.

Сегодня например, меня попросили настроить ряд серверов на фильтрацию любого трафика из определенных стран. Причин такой защите есть множество — сокращения спама и атак, выравнивание соотношений, и многого другого.

В моем случае — надо было заблокировать CN полностью, на RU отдавать полный канал, а на остальные страны — в два раза меньше.

Разумеется, вбивать полностью все подсети руками неудобно, да и они часто меняются. Логичнее всего было сделать это с помощью 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 match support (IP_NF_MATCH_GEOIP) [N/m/?] (NEW)

Тут нужно сказать «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/


Использовать проще пареной репы:
geo $country {
default no;
include /etc/nginx/geo.conf;
127.0.0.0/24 ru;
}
Пример с CN трафиком:
if ($country ~* cn )
{
rewrite ^(.*)$ baidu.com/;
}


Как всегда у быстрого решения всегда найдется минус — в этом случае в виде паузы перед запуском nginx, так как база читается в память.
Tags:
Hubs:
+36
Comments 30
Comments Comments 30

Articles