Nmail PHP
제품소개
데모
다운로드
구입안내
FAQ (21)
Q&A (5851)
사용후기 (21)
Home    Contact us    Sitemap
기술지원안내
FAQ
Q&A 게시판
사용자 팁


nmail@passkorea.net
Home > Support > 사용자 팁 > Nmail PHP
Nmail PHP


제 목 19 - SMTP 인증오류 IP 자동차단 스크립트
글쓴이 프리한놈

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 '해당 일자의 로그파일이 존재하지 않습니다.';    

}

?>


       

리스트
번호   제목 글쓴이 등록일 조회수
19  
프리한놈
22-08-12 369
18  
개인
22-07-20 544
17  
20-01-20 1876
16  
최인대
13-06-25 6014
15  
안철룡
13-02-26 8417
14  
사용자
11-05-17 10163
13  
손성원
11-01-05 11679
12  
봄돌
10-06-22 13704
11  
조충용
09-12-16 11550
10  
김종곤
09-04-01 48068
9  
조남식
09-02-06 11854
8  
김태관
08-10-24 17010
7  
관리자
07-06-19 15558
6  
관리자
07-06-16 21388
5  
최태영
07-06-14 14566
   
관리자
07-07-23 10843
4  
관리자
07-04-14 19542
   
안철룡
13-02-21 6055
3  
관리자
07-03-28 14881
2  
양성안
07-02-15 20457
◀◀ ◁ | 1 | 2 | 3 | ▷ ▶▶
패스코리아넷   경남 창원시 마산회원구 내서읍 중리상곡로 129, 한성빌딩 701호
메일 문의 : nmail@passkorea.net   I   전화 : 1544-1608   I   팩스 : 055-231-2069
사업자 등록번호 : 608-25-32288   I   대표자 : 빈경윤