#!/usr/bin/perl
#
# スクリプトの設置パス
$dir = '/usr/local/bin/hack/';
# エラー回数
$limit = 2;
# チェーンの名称
$chain="HACKER";
# iptablesのパス
$iptables="/usr/sbin/iptables";
# FTPのプログラム名
$ftpd = 'proftpd';
# SSHDのプログラム名
$sshd = 'sshd';
###############################################
while ($data = <STDIN>) {
if ($data =~ /\s(\w+)\[.*\]:.*\[([\d\.]+)\]/){
$hack = $2;
if ($1 eq $ftpd) {
$port = 21;
}elsif ($1 eq $sshd) {
$port = 22;
}else{ next;}
# 特定アドレスは除外
if ($hack eq "127\.0\.0\.1") {exit;}
# 家庭内のアドレスは除外
if ($hack =~ m/^(\d+)\.(\d+)\.(\d+)\.(\d+)/){
# if ($1 == 10) {exit} # クラスA
# if (($1 == 172) && ($2 >
15) && ($2 < 32)) {exit} # クラスB
if (($1 == 192) && ($2 == 168)) {exit;} # クラスC
}
$hack_cnt = $dir . "$hack.cnt";
$cnt = 1;
if(-f "$hack_cnt"){
open(TIN, "$hack_cnt");
flock(TIN, 1);
truncate(TIN, 0);
while($cc = <TIN>){
$cc =~ s/\s+$//;
$reg = system("$iptables
--list $chain -n | grep -q $hack");
if($reg != 0){
if($cc
>= $limit){
system("$iptables -A $chain -p tcp --dport $port -s $hack -j DROP");
close(TIN);
exit;
}
}
$cc++;
$cnt = $cc;
}
close(TIN);
}
open(TTCNT, "> $hack_cnt");
print(TTCNT "$cnt\n");
close(TTCNT);
}
}
exit;