Есть FreeBSD, перелопатил один скрипт из журнала "Системный администратор" (кривой он был и не рабочий)
#!/usr/bin/perl -w
#use Sys::Syslog;$max= 10;
$watchfile= '/var/log/auth.log';
$ipfw= '/sbin/ipfw';
$ipfw_list= '/var/tmp/ipfw.list';
$num_rule= 65500;
$my_ip= '111.111.111.111'; # Мой внешний IP
%tries=();
%blocked=();
`$ipfw list $num_rule > $ipfw_list`;
open(IPFWLIST, "<$ipfw_list");
while (<IPFWLIST>){
$blocked{$1}=1 if (/(\d+\.\d+\.\d+\.\d+)/);
}
close IPFWLIST;
open(LOGFILE, "<$watchfile");
while (<LOGFILE>) {
if (/sshd\[\d+\]: Failed password for .+ from (\d+\.\d+\.\d+\.\d+) port/) {
$ip=$1;
next if defined($blocked{$ip});
$tries{$ip}+=1;
if ($tries{$ip} eq $max){
`$ipfw add $num_rule deny tcp from $ip to $my_ip ssh`;
$blocked{$ip}=1;
# syslog('warning', "IP $ip has been blocked !");
}
}
if (/sshd\[\d+\]: Illegal user .+ from (\d+\.\d+\.\d+\.\d+)/) {
$ip=$1;
next if defined($blocked{$ip});
$tries{$ip}+=1;
if ($tries{$ip} eq $max){
`$ipfw add $num_rule deny tcp from $ip to $my_ip ssh`;
$blocked{$ip}=1;
# syslog('warning', "IP $ip has been blocked !");
}
}
}
close(LOGFILE);
Юзайте, может кому пригодится ;)
Смысл прост. Смотрим лог auth.log, если встречается попытка подбора пароля более 10 раз, то в ipwf добавляется правило типа (для примера)
ipfw add 65500 deny tcp from 212.191.6.130 to 111.111.111.111 ssh
И так каждые 11 минут через крон :)
Только есть недостаток :( такое впечатление, что в auth.log пишется всё с задержкой и мой скрипт опаздывает, если атака идёт на протяжении 15-20 мин.
Может у кого аеть комментарии или мысли как с этим справиться...