#!/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;