qmail에서 failure notice 라는 제목으로 스팸 메일이 mailq에 자꾸 쌓여 리턴되는경우 대처법.
qmail에는 double bounce라는 효과적인 방법이 있지만 그방법으로 되지않을경우에는
qmail-remote 파일을 perl로 스크립트해서 1차적인 방법으로 막고 정상적인 qmail-remote를 실행하는 방법이다.
이방법을 QMAIL-REMOTE 인터셉트라고 한다.
- 발송을 담당하는 Qmail-remote 를 가로채 발송 직전 메일 헤더를 통해
Return Mail 을 SMTP 단에서 DROP 시킨다.
1. Qmail 발송 Log 생성
[/var/log] echo > qmail-remote.log
[/var/log] chmod 666 qmail-remote.log
[/var/log] chown qmailr.qmail qmail-remote.log
2. 원본 remote 파일 변경
[/var/qmail/bin] cp -a qmail-remote qmail-remote-org
: -a 옵션으로 동등한 소유권, 허가권을 가지고 가야 함
3. Script 작성
#!/usr/bin/perl
# 스탠다드 입력으로 메일 내용을 읽어들인다.
undef $/;
$inputdata = <STDIN>;
$/ = "\n";
$inputdata =~ /Subject: (.*)/;
$subject = $1;
$inputdata =~ /Received: from.*\(([0-9.]+)\)/;
$ip = $1;
# 시간을 구한다.
$now_string = localtime;
# 로그를 기록한다.
open FH, ">>/var/log/qmail-remote.log";
flock(FH,2);
# 반송메일을 드롭한다.
if ($subject =~ /(failure notice)/i) {
$inputdata =~ /(no mailbox here by that name)/i;
if ($1 eq "no mailbox here by that name") { // 없는유저일경우
print FH "$now_string\tIP:$ip\tTo:$ARGV[2]\tFrom:$ARGV[1]\tDroped!!(NoUser) Subject:$subject\n";
close FH;
exit 2;
} else {
print FH "$now_string\tIP:$ip\tTo:$ARGV[2]\tFrom:$ARGV[1]\tSubject:$subject - Other\n";
close FH;
}
} else {
print FH "$now_string\tIP:$ip\tTo:$ARGV[2]\tFrom:$ARGV[1]\tSubject:$subject\n";
close FH;
}
# 원래 qmail-remote 프로그램을 실행시킨다.
open (MAIL, "| /var/qmail/bin/qmail-remote-org $ARGV[0] $ARGV[1] $ARGV[2]");
print {MAIL} $inputdata;
close MAIL;
4. Qmail 서비스 중지.
[/etc/rc.d/init.d] ./qmaild stop
5. Qmail-remote 파일 바꿔치기 및 퍼미션 변경
[/var/qmail/bin] cp test qmail-remote (OverWirte ?? Yes )
[/var/qmail/bin] chmod 655 qmail-remote
[/var/qmail/bin] chown root.qmail qmail-remote
6. 정상 작동 확인법.
1) ps -aux : qmail-remote 프로세스 확인
2) [/var/log] qmail-remote.log : log 확인
3) [/var/qmail/bin] qmail-qstat : Queue 상태확인
4) 직접 메일 발송 후 이상여부 확인
참고 자료 : http://home.netizen.ne.kr/board/read.php3?uid=225&code=_tip
댓글 없음:
댓글 쓰기