2015-03-25 4 views
0

Мы используем CentOS и хотели бы запретить нескольким азиатским странам доступ ко всему серверу. Почти каждый IP-адрес, который мы проверяем, который пытался взломать наш сервер, относится к азиатской стране (Россия, Китай, Пакистан и т. Д.)Как я могу вызвать скрипт оболочки или Perl из iptables?

У нас есть база данных MySQL по странам, с которой мы можем эффективно запросить и хотели бы попробовать что-то вроде:

-A INPUT -p tcp -m tcp --dport 80 -j /path/to/perlscript.pl 

Сценарий нужно бы IP передается в качестве аргумента, то он будет возвращать либо цель или DROP ACCEPT?

Спасибо за ответы, вот мое продолжение.

Знаете ли вы, если это возможно? Наличие правила указывает на скрипт, который возвращает цель? (ACCPET/DROP)

Не совсем уверен, как работает ipset, мне придется экспериментировать, но похоже, что он создает одно правило. Как он будет обрабатывать Россию, например, которая имеет более 6000 диапазонов? И мы хотим добавить, вероятно, 20-40 стран, поэтому нам может понадобиться добавить более 100 000 диапазонов. Разве накладные расходы на один запрос MySQL не будут облагаться налогом?

SELECT country FROM ip_countries WHERE $VAR{ip} >= range1 && $VAR{ip} <= range2 

В базе данных мы используем свободно доступна здесь: http://software77.net/geo-ip/

Он представляет собой IP-адреса в базе данных путем преобразования IP в число, используя следующую формулу:

$VAR{numberedIP} = $octs[3] + ($octs[2] * 256) + ($octs[1] * 256 * 256) + ($octs[0] * 256 * 256 * 256); 

Он будет хранить начало диапазона в столбце «range1» и конце диапазона в столбце «range2».

Итак, вы можете увидеть, как мы будем искать IP-адрес, используя указанный выше запрос. Буквально занимает менее сотой доли секунды, чтобы получить результат, и это довольно точно. У нас есть один веб-сайт на выделенном сервере, довольно низкий трафик. Но, как и во всех серверах, которые я когда-либо проверял, каждый день он попадает в роботы хакеров, проверяет учетные записи электронной почты, учетные записи FTP и т. Д. И почти каждый веб-сервер, с которым я когда-либо работал, рано или поздно скомпрометирован. В нашем случае 99,99% трафика из азиатских стран имеют к нему преступные намерения.

Мы хотели бы, чтобы это выполнялось через iptables, чтобы покрыть все порты, а не только HTTP, например, используя директивы в .htaccess.

Считаете ли вы, что ipset все равно будет быстрее и эффективнее?

+1

Подумайте о производительности сети в случае, когда каждый пакет tcp вызывает отдельный процесс. –

+3

Используйте подходящий инструмент для работы. В этом случае это ['ipset'] (http://ipset.netfilter.org/). Ваш скрипт Perl может вывести все диапазоны IP из вашей базы данных MySQL и использовать их в вызовах 'ipset'. Затем заблокируйте весь набор, используя 'iptables'. –

ответ

3

Было бы слишком медленно запускать perl для каждого соответствующего пакета. Правильный инструмент для такого рода вещей - ipset, и есть более подробная информация и документация на ipsetman page.

В CentOS вы можете установить его с помощью yum.Естественно, что все эти команды и сценарии необходимо запустить как корень:

# yum install ipset 

Далее устанавливаем модули ядра (вы хотите, чтобы это произошло при загрузке, а):

# modprobe -v ipset ip_set_hash_netport 

А потом использовать сценарий вроде следующего для заполнения в ipset и блок IP-адресов из своих диапазонов с помощью iptables:

#!/usr/bin/env perl 
use strict; 
use warnings; 
use DBI; 

my $dbh = DBI->connect('... your DSN ...',...); 
# I have no knowledge of your schema, but if you can pull the 
# address range in the form: AA.BB.CC.DD/NN 
my $ranges = $dbh->selectcol_arrayref(
    q{SELECT cidr FROM your_table WHERE country_code IN ('CN',...)}); 

`ipset create geoblock hash:netport`; 
for (@$ranges) { 
    # to match on port 80: 
    `ipset add geoblock $_,80`; 
} 
`iptables -I INPUT -m set --set geoblock src -j DROP`; 

Если вы хотите, чтобы заблокировать все порты, а не дзю st 80, используйте модуль ip_set_hash_net вместо ip_set_hash_netport, смените hash:netport на hash:net и удалите ,80 из команды ipset.

+0

Спасибо за информацию. Вы знаете, если это возможно? Наличие правила указывает на скрипт, который возвращает цель? (ACCPET/DROP) – user1749141

+0

Невозможно, насколько я знаю. Но вы могли бы написать модуль ядра netfilter, если бы вы были так склонны. –