Home
Contact us
Sitemap
제품소개
다운로드
기술지원
구입안내
고객안내
Nmail PHP
Nmail PHP
Nmail NET
Nmail ASP
기술지원안내
FAQ
Q&A
사용자팁
Nmail PHP
공지사항
고객&파트너
기술지원안내
FAQ
Q&A 게시판
사용자 팁
Home
> Support
> 사용자 팁
>
Nmail PHP
Nmail PHP
※
기술문의
는
자세한 상황
을 적어주셔야 하며,
구입문의
는
전화
나
메일
로 부탁드립니다.
글쓴이
제목
<p style="font-size: 13.3333px;">SMTP 인증오류 IP 자동차단 스크립트</p><p style="font-size: 13.3333px;">지긋지긋한 SMTP 인증으로 들어오는 IP들을 차단하고자 할때 사용합니다.</p><p style="font-size: 13.3333px;">자동으로 IP 찾아서 nmail 블랙리스트 테이블에 넣는 역할을 합니다. 수작업은 너무 지쳐요 ㅠ.ㅠ</p><p style="font-size: 13.3333px;">계속 인증시도하다보면 언젠가 성공해서 스팸메일 뿌리는 경우도 있어서요 -_-;;;</p><p style="font-size: 13.3333px;">Nmail PHP 2.X 버전대에서 사용하고 있습니다.</p><p style="font-size: 13.3333px;"><span style="font-size: 13.3333px;">허접한 소스니까 더 좋은 로직으로 수정해서 사용하시기 바랍니다.</span></p><p style="font-size: 13.3333px;"><b><br>※ 스크립트 파일명은 반드시 변경해서 사용하세요. ip_ban_manager.php라는 이름으로 사용하면 타인이 접근하기 쉽습니다.</b></p><p style="font-size: 13.3333px;"><span style="font-size: 13.3333px;"><br></span></p><p style="font-size: 13.3333px;"><span style="font-size: 13.3333px;">>>>> </span><span style="font-size: 13.3333px;">ip_lists table 생성 쿼리</span></p><p>CREATE TABLE nmail2.ip_lists (</p><p> start_ip VARCHAR(20) DEFAULT NULL,</p><p> end_ip VARCHAR(20) DEFAULT NULL,</p><p> country_code VARCHAR(4) DEFAULT NULL</p><p>)</p><p style="font-size: 13.3333px;"><span style="font-size: 13.3333px;">>>>> ip_lists 데이터</span></p><p style=""><span style="font-size: 13.3333px;">여기서 다운로드 받으세요 ip2location.com에서 작년 8월에 받은 데이터입니다. (신규 업데이트하기 귀찮아서 그냥 방치 -_-)</span></p><p style=""><span style="font-size: 13.3333px;">https://drive.google.com/file/d/1QYVubHXlFd2cVOPWxgtTkONz-KdA0Ndi/view?usp=sharing</span></p><p style="font-size: 13.3333px;"><br></p><p style="font-size: 13.3333px;">>>>> 파일명 : /etc/crontab<br><span style="font-size: 13.3333px;"><br>*/5 * * * * root wget http://mail.domain.com/</span><span style="font-size: 13.3333px;">ip_ban_manager</span><span style="font-size: 13.3333px;">.php -O /dev/null<br>(crontab 에 추가함)</span></p><div><br></div><p style="font-size: 13.3333px;"><span style="font-size: 13.3333px;">>>>></span><span style="font-size: 13.3333px;"> </span>파일명 : ip_ban_manager.php </p><p style=""><span style="font-size: 13.3333px;"><?php</span></p><p style=""><span style="font-size: 13.3333px;">/**</span></p><p style=""><span style="font-size: 13.3333px;"> * $chk_ip가 $ip와 $subnet 범위내에 있는지 체크 (출처: http://b1ix.net/240)</span></p><p style=""><span style="font-size: 13.3333px;"> * @param string $ip</span></p><p style=""><span style="font-size: 13.3333px;"> * @param string $subnet</span></p><p style=""><span style="font-size: 13.3333px;"> * @param string $chk_ip</span></p><p style=""><span style="font-size: 13.3333px;"> * @return number</span></p><p style=""><span style="font-size: 13.3333px;"> */</span></p><p style=""><span style="font-size: 13.3333px;">function ip_chk( $ip, $subnet, $chk_ip) {</span></p><p style=""><span style="font-size: 13.3333px;"><span style="white-space:pre"> </span>$long_ip = ip2long($ip);</span></p><p style=""><span style="font-size: 13.3333px;"><span style="white-space:pre"> </span>$long_subnet = ip2long($subnet);</span></p><p style=""><span style="font-size: 13.3333px;"><span style="white-space:pre"> </span>$long_max = ip2long('255.255.255.255');</span></p><p style=""><span style="font-size: 13.3333px;"><span style="white-space:pre"> </span>$long_chk_ip = ip2long($chk_ip);</span></p><p style=""><span style="white-space: pre; font-size: 13.3333px;"> </span></p><p style=""><span style="font-size: 13.3333px;"><span style="white-space:pre"> </span>$range_from = ($long_ip & $long_subnet);</span></p><p style=""><span style="white-space: pre; font-size: 13.3333px;"> </span></p><p style=""><span style="font-size: 13.3333px;"><span style="white-space:pre"> </span>$range_bo = $long_subnet ^ $long_max;</span></p><p style=""><span style="font-size: 13.3333px;"><span style="white-space:pre"> </span>$range_to = ($long_ip | $range_bo);</span></p><p style=""><span style="white-space: pre; font-size: 13.3333px;"> </span></p><p style=""><span style="font-size: 13.3333px;"><span style="white-space:pre"> </span>if( $long_chk_ip > $range_from && $long_chk_ip < $range_to ) return 1;</span></p><p style=""><span style="font-size: 13.3333px;"><span style="white-space:pre"> </span>else return 0;</span></p><p style=""><span style="font-size: 13.3333px;">}</span></p><p style=""><span style="font-size: 13.3333px;"><br></span></p><p style=""><span style="font-size: 13.3333px;">$date = date("Ymd");</span></p><p style=""><span style="font-size: 13.3333px;">$smtp_log_file = "/var/MailRoot/logs/smtp-".$date."0000";</span></p><p style=""><span style="font-size: 13.3333px;"><br></span></p><p style=""><span style="font-size: 13.3333px;">if(file_exists($smtp_log_file)) {</span></p><p style=""><span style="white-space: pre; font-size: 13.3333px;"> </span></p><p style=""><span style="font-size: 13.3333px;"><span style="white-space:pre"> </span>$ip_array = array();</span></p><p style=""><span style="font-size: 13.3333px;"><span style="white-space:pre"> </span>$log_contents = file($smtp_log_file);</span></p><p style=""><span style="font-size: 13.3333px;"><span style="white-space:pre"> </span>$log_contents = array_reverse($log_contents);</span></p><p style=""><span style="font-size: 13.3333px;"><span style="white-space:pre"> </span>foreach ($log_contents as $line) {</span></p><p style=""><span style="font-size: 13.3333px;"><span style="white-space:pre"> </span>$item = explode("\t", str_replace('"','',$line));</span></p><p style=""><span style="font-size: 13.3333px;"><span style="white-space:pre"> </span>$remote_ip = trim($item[2]);</span></p><p style=""><span style="font-size: 13.3333px;"><span style="white-space:pre"> </span>$log_date = $item[3];</span></p><p style=""><span style="font-size: 13.3333px;"><span style="white-space:pre"> </span>$remote_ip2 = trim($item[4]);</span></p><p style=""><span style="font-size: 13.3333px;"><span style="white-space:pre"> </span>$status = $item[9];</span></p><p style=""><span style="font-size: 13.3333px;"><span style="white-space:pre"> </span>$remote_ip_array = explode('.', $remote_ip);</span></p><p style=""><span style="font-size: 13.3333px;"><span style="white-space:pre"> </span>$remote_ip = $remote_ip_array[0] . '.' . $remote_ip_array[1] . '.' . $remote_ip_array[2] . '.0';</span></p><p style=""><span style="font-size: 13.3333px;"><span style="white-space:pre"> </span>if(strpos($status,'AUTH=EFAIL:TYPE=LOGIN') !== false && !in_array($remote_ip, $ip_array)) { // SMTP 인증오류를 발생시킨 IP만 찾아요</span></p><p style=""><span style="font-size: 13.3333px;"><span style="white-space:pre"> </span>//echo "$remote_ip / $remote_ip2 / $log_date / $status<br>\n";</span></p><p style=""><span style="font-size: 13.3333px;"><span style="white-space:pre"> </span>$ip_array[] = $remote_ip;</span></p><p style=""><span style="font-size: 13.3333px;"><span style="white-space:pre"> </span>}</span></p><p style=""><span style="font-size: 13.3333px;"><span style="white-space:pre"> </span>}</span></p><p style=""><span style="white-space: pre; font-size: 13.3333px;"> </span></p><p style=""><span style="font-size: 13.3333px;"><span style="white-space:pre"> </span>if(count($ip_array) > 0) {</span></p><p style=""><span style="font-size: 13.3333px;"><span style="white-space:pre"> </span>$db_host = "localhost";</span></p><p style=""><span style="font-size: 13.3333px;"><span style="white-space:pre"> </span>$db_name = "nmail2";</span></p><p style=""><span style="font-size: 13.3333px;"><span style="white-space:pre"> </span>$db_user = "nmail2";</span></p><p style=""><span style="font-size: 13.3333px;"><span style="white-space:pre"> </span>$db_password = 'xxxxxxxxx';</span></p><p style=""><span style="white-space: pre; font-size: 13.3333px;"> </span></p><p style=""><span style="font-size: 13.3333px;"><span style="white-space:pre"> </span>$connect_public<span style="white-space:pre"> </span>= mysql_connect($db_host, $db_user, $db_password);</span></p><p style=""><span style="font-size: 13.3333px;"><span style="white-space:pre"> </span>mysql_select_db($db_name);</span></p><p style=""><span style="font-size: 13.3333px;"><span style="white-space:pre"> </span>$in_sqls = array();</span></p><p style=""><span style="font-size: 13.3333px;"><span style="white-space:pre"> </span>foreach ($ip_array as $ip) {</span></p><p style=""><span style="font-size: 13.3333px;"><span style="white-space:pre"> </span>$ip2long = ip2long($ip);</span></p><p style=""><span style="font-size: 13.3333px;"><span style="white-space:pre"> </span>$sql = "SELECT country_code FROM ip_lists WHERE INET_ATON(start_ip) <= $ip2long AND INET_ATON(end_ip) >= $ip2long ";</span></p><p style=""><span style="font-size: 13.3333px;"><span style="white-space:pre"> </span>$row = mysql_fetch_assoc(mysql_query($sql));</span></p><p style=""><span style="font-size: 13.3333px;"><span style="white-space:pre"> </span>$code = $row['country_code'];</span></p><p style=""><span style="font-size: 13.3333px;"><br></span></p><p style=""><span style="font-size: 13.3333px;"><span style="white-space:pre"> </span>if($code != 'KR') { // 접근 서버가 한국이 아니라면 무조건 차단</span></p><p style=""><span style="font-size: 13.3333px;"><span style="white-space:pre"> </span>//echo "$ip / $code ---- ";</span></p><p style=""><span style="font-size: 13.3333px;"><span style="white-space:pre"> </span>$in_sql = "('$ip','255.255.255.0',NOW())";</span></p><p style=""><span style="font-size: 13.3333px;"><span style="white-space:pre"> </span>$in_sqls[] = $in_sql;</span></p><p style=""><span style="font-size: 13.3333px;"><span style="white-space:pre"> </span>//echo "$in_sql <br>\n";</span></p><p style=""><span style="font-size: 13.3333px;"><span style="white-space:pre"> </span>}</span></p><p style=""><span style="font-size: 13.3333px;"><span style="white-space:pre"> </span>//ip_chk( $ip, $subnet, $chk_ip);</span></p><p style=""><span style="font-size: 13.3333px;"><span style="white-space:pre"> </span>}</span></p><p style=""><span style="white-space: pre; font-size: 13.3333px;"> </span></p><p style=""><span style="font-size: 13.3333px;"><span style="white-space:pre"> </span>if(count($in_sqls) > 0) {</span></p><p style=""><span style="font-size: 13.3333px;"><span style="white-space:pre"> </span>$insert_sql = "INSERT IGNORE INTO nmail_black_ip (ip_ipaddr, ip_netmask, ip_regdate) VALUES " . implode(',', $in_sqls);</span></p><p style=""><span style="font-size: 13.3333px;"><span style="white-space:pre"> </span>//echo $insert_sql;</span></p><p style=""><span style="font-size: 13.3333px;"><span style="white-space:pre"> </span>mysql_query($insert_sql);<span style="white-space:pre"> </span></span></p><p style=""><span style="font-size: 13.3333px;"><span style="white-space:pre"> </span>$total = mysql_affected_rows();</span></p><p style=""><span style="font-size: 13.3333px;"><span style="white-space:pre"> </span>echo $total . "개의 IP를 등록했습니다.";</span></p><p style=""><span style="font-size: 13.3333px;"><span style="white-space:pre"> </span>} else {</span></p><p style=""><span style="font-size: 13.3333px;"><span style="white-space:pre"> </span>echo "등록한 IP가 없습니다.";</span></p><p style=""><span style="font-size: 13.3333px;"><span style="white-space:pre"> </span>}</span></p><p style=""><span style="white-space: pre; font-size: 13.3333px;"> </span></p><p style=""><span style="font-size: 13.3333px;"><span style="white-space:pre"> </span>mysql_close();</span></p><p style=""><span style="font-size: 13.3333px;"><span style="white-space:pre"> </span>}</span></p><p style=""><span style="white-space: pre; font-size: 13.3333px;"> </span></p><p style=""><span style="font-size: 13.3333px;">} else {</span></p><p style=""><span style="font-size: 13.3333px;"><span style="white-space:pre"> </span>echo '해당 일자의 로그파일이 존재하지 않습니다.';<span style="white-space:pre"> </span></span></p><p style=""><span style="font-size: 13.3333px;">}</span></p><p style=""><span style="font-size: 13.3333px;">?></span></p>
비밀번호
패스코리아넷
경남 창원시 마산회원구 내서읍 중리상곡로 129, 한성빌딩 701호
메일 문의 :
nmail@passkorea.net
I 전화 : 1544-1608 I 팩스 : 055-231-2069
사업자 등록번호 : 608-25-32288 I 대표자 : 빈경윤