NEW Nmail PHP 3 업그레이드 할인
자세히 보기

Nmail PHP TIP

SMTP 인증오류 IP 자동차단 스크립트

프**놈 2022.08.12 14:58 조회 2063

SMTP 인증오류 IP 자동차단 스크립트

지긋지긋한 SMTP 인증으로 들어오는 IP들을 차단하고자 할때 사용합니다.

자동으로 IP 찾아서 nmail 블랙리스트 테이블에 넣는 역할을 합니다. 수작업은 너무 지쳐요 ㅠ.ㅠ

계속 인증시도하다보면 언젠가 성공해서 스팸메일 뿌리는 경우도 있어서요 -_-;;;

Nmail PHP 2.X 버전대에서 사용하고 있습니다.

허접한 소스니까 더 좋은 로직으로 수정해서 사용하시기 바랍니다.


※ 스크립트 파일명은 반드시 변경해서 사용하세요. ip_ban_manager.php라는 이름으로 사용하면 타인이 접근하기 쉽습니다.


>>>> ip_lists table 생성 쿼리

CREATE TABLE nmail2.ip_lists (

  start_ip VARCHAR(20) DEFAULT NULL,

  end_ip VARCHAR(20) DEFAULT NULL,

  country_code VARCHAR(4) DEFAULT NULL

)

>>>> ip_lists 데이터

여기서 다운로드 받으세요 ip2location.com에서 작년 8월에 받은 데이터입니다. (신규 업데이트하기 귀찮아서 그냥 방치 -_-)

https://drive.google.com/file/d/1QYVubHXlFd2cVOPWxgtTkONz-KdA0Ndi/view?usp=sharing


>>>> 파일명 : /etc/crontab

*/5 * * * * root wget http://mail.domain.com/
ip_ban_manager.php -O /dev/null
(crontab 에 추가함)


>>>>파일명  : ip_ban_manager.php 

<?php

/**

 * $chk_ip가 $ip와 $subnet 범위내에 있는지 체크 (출처: http://b1ix.net/240)

 * @param string $ip

 * @param string $subnet

 * @param string $chk_ip

 * @return number

 */

function ip_chk( $ip, $subnet, $chk_ip) {

$long_ip = ip2long($ip);

$long_subnet = ip2long($subnet);

$long_max = ip2long('255.255.255.255');

$long_chk_ip = ip2long($chk_ip);

$range_from = ($long_ip & $long_subnet);

$range_bo = $long_subnet ^ $long_max;

$range_to = ($long_ip | $range_bo);

if( $long_chk_ip > $range_from && $long_chk_ip < $range_to ) return 1;

else return 0;

}


$date = date("Ymd");

$smtp_log_file = "/var/MailRoot/logs/smtp-".$date."0000";


if(file_exists($smtp_log_file)) {

$ip_array = array();

$log_contents = file($smtp_log_file);

$log_contents = array_reverse($log_contents);

foreach ($log_contents as $line) {

$item = explode("\t", str_replace('"','',$line));

$remote_ip = trim($item[2]);

$log_date = $item[3];

$remote_ip2 = trim($item[4]);

$status = $item[9];

$remote_ip_array = explode('.', $remote_ip);

$remote_ip = $remote_ip_array[0] . '.' . $remote_ip_array[1] . '.' . $remote_ip_array[2] . '.0';

if(strpos($status,'AUTH=EFAIL:TYPE=LOGIN') !== false && !in_array($remote_ip, $ip_array)) { // SMTP 인증오류를 발생시킨 IP만 찾아요

//echo "$remote_ip / $remote_ip2 / $log_date / $status<br>\n";

$ip_array[] = $remote_ip;

}

}

if(count($ip_array) > 0) {

$db_host = "localhost";

$db_name = "nmail2";

$db_user = "nmail2";

$db_password = 'xxxxxxxxx';

$connect_public= mysql_connect($db_host, $db_user, $db_password);

mysql_select_db($db_name);

$in_sqls = array();

foreach ($ip_array as $ip) {

$ip2long = ip2long($ip);

$sql = "SELECT country_code FROM ip_lists WHERE INET_ATON(start_ip) <= $ip2long AND INET_ATON(end_ip) >= $ip2long ";

$row = mysql_fetch_assoc(mysql_query($sql));

$code = $row['country_code'];


if($code != 'KR') {  // 접근 서버가 한국이 아니라면 무조건 차단

//echo "$ip / $code ---- ";

$in_sql = "('$ip','255.255.255.0',NOW())";

$in_sqls[] = $in_sql;

//echo "$in_sql <br>\n";

}

//ip_chk( $ip, $subnet, $chk_ip);

}

if(count($in_sqls) > 0) {

$insert_sql = "INSERT IGNORE INTO nmail_black_ip (ip_ipaddr, ip_netmask, ip_regdate) VALUES " . implode(',', $in_sqls);

//echo $insert_sql;

mysql_query($insert_sql);

$total = mysql_affected_rows();

echo $total . "개의 IP를 등록했습니다.";

} else {

echo "등록한 IP가 없습니다.";

}

mysql_close();

}

} else {

echo '해당 일자의 로그파일이 존재하지 않습니다.';

}

?>

댓글 0
다음 글 웹하드업로가안되면이렇게하세요 2020.01.20