인터넷정보

SSH 공격 아이피 필터링 스크립트(recent IP 기반) - 아이피 차단

알 수 없는 사용자 2007. 10. 13. 14:17
<?

$attach_ip;
$block_ip;

function parse_file()
{
global $attach_ip;

$fp = fopen("/var/log/auth.log", "r");
if (! $fp)
{
echo "open error!\n";
return;
}

$line_num = 0;
while (! feof($fp)) {
$line_num ++;

$buff = trim(fgets($fp));
//$tok = explode(" ", $buff);
$tok = preg_split("/[\s]+/", $buff);
//print_r($tok);

if (!strcmp($tok[5], "Failed") && !strcmp($tok[6], "password"))
{
// from 다음에 ip 값이 위치함.
$ip = $tok[array_search("from", $tok) + 1];
$time = strtotime($tok[1] . " " . $tok[0] . " 2006 " . $tok[2]);

$attach_ip[] = array($ip, $time);
//echo "DEBUG:".$line_num."|".$buff."\n";
//echo "DEBUG:".$ip."|".$time."\n";
}

}
fclose($fp);

// sorting with ip
//sort ($attach_ip);
}

// 블럭 시킬 ip을 찾는다.
function make_block_list()
{
global $attach_ip, $block_ip;

$size = count($attach_ip);

$cnt = 1;
list($w_addr, $w_time) = $attach_ip[0];
for ($i = 1; $i < $size; $i++) {
list($ip, $time) = $attach_ip[$i];

if (count($block_ip) > 0 && in_array($ip, $block_ip))
continue; // 이미 목록상에 있는경우 다음것을 찾음

if (strcmp($ip, $w_addr)) {
$cnt = 1; // 횟수
$w_addr = $ip;
$w_time = $time;
$diff = 0;

$recent = array($time);
}
else {
$cnt ++;

$recent[$cnt - 1] = $time;
}
// 가장 인접한 목록에서 diff 값을 계산한다.
if ($cnt >= 10) $diff = $time - $recent[$cnt - 10];
else $diff = $time - $recent[$cnt - 1];

//echo "DEBUG:" . $ip . "/" . $cnt . "/" . $diff . "/" . $diff/$cnt . "\n";

// 횟수가 6번 이상이고 60초 이내인 경우
if ($cnt >= 10 && $diff <= 60) {
// block 시킬 IP로 판단하고 등록한다.
$block_ip[] = $w_addr;

//echo "DEBUG:".$diff."/".$w_addr."\n";
}

// 횟수가 30번 이상이고 6시간이내인 경우
//else if ($cnt >= 30 && $diff <55*60*50) {
// $block_ip[] = $w_addr;
//}

}
}

parse_file();
//print_r ($attach_ip);

make_block_list();
echo "\nALL: ";
$i = 0;
while (list($time,$ip) = each($block_ip))
{
echo $ip;

$i ++;
if ($i < count($block_ip))
echo ", ";
}
echo "\n";

?>



서버설정 : http://kltp.kldp.org/stories.php?story=05/08/02/4164861

반응형