2012-09-16

mail]sendmail tip


센드메일설정을 알아보러 다니던중.. 얻었던 문서중에서 유용한 내용을 옮겨봤습니다. --maylinux

Contents

1 sendmail quota 설정
1.1 SMTP 서버에서 보내는 양 제한하는 법.
1.2 받는 메일 서버에서 받는 양 제한하는 법.
1.3 메일 용량 쿼터 설정하기
1.3.1 참고.Quota 의 설정에 대해
2 바이러스 메일 필터링 방법
3 메일이 수신이 안되는 경우
3.1 (1)IMAP 패키지가 설치되지 않았을 경우
3.2 (2)Inetd 에 설정되어 있지 않을 경우
3.3 (3)TCP Wrapper 에 설정되었는지 여부 확인
3.4 (4)계정에 Lock 이 걸리지 않았는지 확인
3.5 (5)Pop3 접속이 많은 경우
3.6 (7)mail –v 로 확인
4 센드메일 오류
4.1 Transient parse error -- message queued for future delivery
4.2 Name server: domain: host not found

[edit]

1 sendmail quota 설정 #

[edit]

1.1 SMTP 서버에서 보내는 양 제한하는 법. #

/etc/mail/sendmail.cf (또는 /etc/sendmail.cf.이는 sendmail 의 패키징 방법에 따라 다르 다.)파일에서 다음과 같이MaxMessageSize 부분의 주석을 제거하고 제한하고자 하는 적 절한 값을 입력한다.

          #maximum message size

          O MaxMessageSize=5024000
          


위와 같이 설정하였을 경우 현재의 서버를 보내는 메일 서버로 이용시 첨부파일을 포함한 전체 메일사이즈가 5M 이상 초과하거나 웹에서 /usr/sbin/sendmail 을 실행하여 외부로 메일을 발송하는 메일링 리스트등의 프로그램에서도 메일 발송시 5 메가 이상의 메일은 보낼 수 없게 된다. 5024000 은 byte 단위이며 설정 변경 후 변경된 내용을 적용하려면 killall –HUP sendmail 로 sendmail 데몬을 Refresh 하면 된다. (/etc/rc.d/init.d/sendmail restart 로 해도 적용됨. 이것을 추천) ( 일반적으로 3M 의 파일을 첨부할시에 base64 로 인코딩하므로 전체메일사이즈가 5M 에 가깝게 됨 )
[edit]

1.2 받는 메일 서버에서 받는 양 제한하는 법. #

외부에서 서버로 들어오는 메일에 대해서 용량을 제한하고 싶다면 같은 파일(sendmail.cf) 에서 "Local and Program Mailer specification"부분을 설정해 주면 된다.

          Mlocal,P=/usr/bin/procmail,F=lsDFMAw5:/|@qSPfhn9,S=10/30,

          R=20/40,M=5024000,T=DNS/RFC822/X-Unix,A=procmail -Y -a $h -d $u
          


위와 같이 T=DNS/RFC822/X-Unix 앞부분에 M=5024000 부분을 추가해 주면 된다. 마찬가지로 5024000는 byte 단위이며 각자의 시스템 환경에 따라 원하는 용량만큼 적절히 설정해 주면 된다 역시 설정 변경 후 sendmail 을 refresh 하면 적용이 된다. 위의 경우 서버에서는 5메가 이상의 메일은 수신하지 않으며 5메가 이상의 메일을 보낸 이는

552 5.2.3 <antihong@tt.co.kr>...Message is too large;5024000 bytes max
554 5.0.0 <antihong@tt.co.kr>...Service unavailable
}} 와 같은 에러 메시지를 회신받게 된다. 아울러

          #maximum number of recipients per SMTP envelope

          O MaxRecipientsPerMessage=20
          


와 같은 부분이 있는데,이 부분은 한번에 메일 발송 시 동시 발송(참조 발송)이 가능한 메 일 계정의 수를 뜻하는 것으로 SMTP 서비스를 제공한다면 이 설정을 적용하는 것이 좋다. 기본적으로 이 값에도 제한이 없으므로 먼저 주석을 삭제한 후 적절한 값을 설정해 주면 한 번에 동시 발송 가능한 메일의 수도 제한할 수 있다. (위의 경우에는 한번에 참조 발송이 가능한 메일 유저를 20명으로 제한) 설정이 끝난 후에는 killall –HUP sendmail 로 sendmail 을 재가동해주면 적용된다. (/etc/rc.d/init.d/sendmail restart 도 가능 )
[edit]

1.3 메일 용량 쿼터 설정하기 #

각 유저의 홈페이지 공간에 대한 쿼터 설정방법은 잘 알고 있는데,Sendmail 을 제공시 메 일 용량 쿼터에 대한 설정은 잘 모르는 경우가 많이 있다.매일 쿼터에 대한 설정은 다소 복잡하기는 하지만 설정은 가능하다.기본적으로 각 유저의 메일은 /var/spool/mail/디렉 토리에 자신의 계정 소유로 저장이 되게 되는데 바로 이 특성을 이용하여 쿼터 설정이을 하 면 된다.쿼터는 각 파일 시스템별로 각각 설정이 가능하므로 각 유저의 홈디렉토리외에 /var 파티션에도 추가적으로 쿼터를 설정하면 되는 것이다. 쿼터를 설정하는 방법은 일반적인 방법과 동일하다. 먼저 /etc/fstab 파일을 열어 /var 파티션이 별도로 설정되어 있다면 /var 파티션에,별도 로 없으면 /파티션에 유저쿼터나 또는 그룹쿼터 설정을 하면 된다.

          /dev/sda1 /home ext2 defaults,usrquota=/home/.quota

          /dev/sda8 /var ext2 defaults,usrquota=/var/.mailquota
          


위에서는 /home 파티션에도 쿼터 설정을 하고 /var 파티션에도 쿼터 설정을 한 것을 볼 수 있다.이후 touch /home/.quota 및 touch /var/.mailquota 로 사이즈가 0인 파일을 생성한 후 quotacheck –a 를 실행하면 파일 시스템을 스캔하여 디스크 사용량을 체크하여 해당 파일에 정보를 저장한다. edquota user 를 실행하면

          /dev/sda1:blocks in use:0,limits (soft =99980,hard =99980)

          inodes in use:0,limits (soft =0,hard =0)

          /dev/sda8:blocks in use:0,limits (soft =29980,hard =29980)

          inodes in use:0,limits (soft =0,hard =0)
          


위와 같이 쿼터 설정이 나오는데,여기에서 /dev/sda1 은 /home/디렉토리에 대한 쿼터 설정이고,/dev/sda8 은 /var/디렉토리에 대한 쿼터 설정이다.위 설정으로 각각 /home 디 렉토리에는 100메가로,메일 용량은 30메가로 총 130메가를 할당하여 쿼터를 설정한 것을 알 수 있다.만약 별도의 /var 파티션이 없이 /파티션만 있는 상황에서 100 메가로 쿼터 설정을 했다면 이 용량은 홈페이지의 용량과 메일 용량을 합쳐서 100메가로 적용이 되므로 주의하기 바란다.
[edit]

1.3.1 참고.Quota 의 설정에 대해 #

위와 같이 edquota 사용시 관련된 라인이 아래와 같이 보이는 부분이 있다.이 중 "blocks in use:"는 유저가 현재 파티션에서 사용중인 총 블럭의 수를 킬로바이트로, "inodes in use:"는 유저가 현재 파티션에서 사용중인 총 파일의 개수를 보여준다. 이 두개의 "blocks in use:"와 "inodes in use:"는 시스템에 의해 자동으로 설정되고 제어되므로 이 값을 임의로 변경할 필요는 없다. 그리고 quota 설정시 soft 제한(soft =5000)은 유저가 사용할 수 있는 최대 용량을 뜻하 며 (이 예제에서는 약 5M 이다.)hard 제한(hard =6000)은 유저가 초과할 수 없는 절대 적인 디스크 사용량을 뜻한다."hard limit"는 "grace period"옵션이 설정되었을 때에만 적용된다. grace period 는 쿼터가 설정된 유저나 그룹이 soft limit 을 초과한 이후에도 사용 가능한 시간의 한계이다.예를 들어서 여러분이 관리하는 시스템에 "해당 유저의 홈디렉토리를 50MB 로 쿼터 제한하고 초과시 7일간의 유예기간을 준다"는 정책을 세울 수도 있다.각 자 유예 기간의 설정에 대해서는 나름대로 적당하다고 생각하는 기간을 정의할 수 있다. grace period 는 edquota –t 로 확인 및 설정할 수 있으며 아래의 경우에는 grace period 가 7일로 설정되어 있는 것을 알 수 있다.

          /dev/sd1:block grace period:7 days,file grace period:7 days

          /dev/sda8:block grace period:7 days,file grace period:7 days
          


그리고 한 유저에게 적용된 쿼터 설정을 다른 유저에게도 그대로 적용하려면 –p 옵 션을 사용하면 되는데,아래와 같이 실행하면 edquota 프로그램은 /etc/passwd 에 정 의된 유저중 UID 가 499 이후의 모든 유저에 대해 "user"의 쿼터 설정을 그대로 복사하 게 된다.

          edquota -p user `awk -F:'$3 >499 {print $1}'/etc/passwd`
          


만일 사용자가 제한량을 넘게되면, 에러메세지를 출력하면서 메일수신을 하지 않는다.
[edit]

2 바이러스 메일 필터링 방법 #

최근에 Sircam 이나 Nimda 등 일정 주기마다 발생하는 바이러스 메일 때문에 서버 관리자 들은 마음 고생이 이만저만이 아니다.Sendmail 에서는 이러한 바이러스 메일이나 스팸메일 에 대해 룰셋(ruleset)을 이용하여 차단하는 기능이 있는데,이를 사용하는 방법에 대해 알 아보도록 하자. Sendmail 에서는 제목이나 메일러 또는 첨부파일의 화일명등 각종 메일헤더 정보를 이용하 여 필터링을 할 수 있는데,먼저 발송되는 메일 제목(subject)으로 필터링을 해 보도록 하자. 아래는 메일 제목에 ILOVEYOU 로 발송하는 멜리사 바이러스를 차단하는 룰셋을 적용해

본 예이다. 먼저 sendmail.cf 파일을 열어 제일 하단에 아래의 내용을 추가한다.

          HSubject:$>Check_Subject

          D{WORMmsg}Access Denied -This message may contain a virus.

          SCheck_Subject

          RILOVEYOU $#error $:501 ${WORMmsg}

          RRe:ILOVEYOU $#error $:501 ${WORMmsg}

          RFW:ILOVEYOU $#error $:501 ${WORMmsg}
          


#주의 :$#error 앞의 blank는 스페이스가 아니라 반드시 탭으로 띄워주어야 한다. Sendmail.cf 의 설정 내용이 다소 어렵고 복잡하기는 한데,위 설정의 의미를 간단히 살펴보도록 하자.

  • H --위 경우에는 헤더에서 Subject:는 문자열을 찾아 이 헤더를 Check_Subject로
정의한다.

  • D --WORMmsg 라는 매크로를 정의하여 해당 룰셋에 적용되는 제목을 확인시 발송한
유저에게 보낼 메시지를 정의한다.

  • S --헤더에서 check_subject로 정의한 부분을 룰셋으로 지정하는 부분이다.
  • R --해당 문자열이 포함된 메일을 발견시 앞에서 정의한 에러 메세지를 첨부하여
반송을 시킨다.

위와 같이 룰셋을 적용하였을 경우 "I LOVE YOU"와 같이 공란이 있을 경우 적용되지 않으며 "ILOVEYOU from me"와 같이 특정 단어가 추가시에도 적용되지 않으며 반드시 정확히 일치하여야 한다.추가적으로 회신시 추가되는 Re:전달(포워딩)시 추가되는 FW:추가된 메일도 거부한다.

다음으로 얼마전 유행했던 Sircam 바이러스 메일을 필터링해 보도록 하자. Sircam 바이러스의 헤더를 보면 정상적인 메일과는 달리 메일 헤더에 Content-Disposition:Multipart message 와 같은 부분이 추가되어 있으며 이 특징을 이용 하여 필터링을 하면 된다. Sendmail.cf 파일에 아래의 룰셋을 추가하면 된다.

          HContent-Disposition:$>check_sircam

          D{SIRCAM}"Warning:I Guess Sircam.worm Virus"

          Scheck_sircam

          RMultipart message $#error $:550 ${SIRCAM}
          


#주의 :$#error 앞의 blank는 스페이스가 아니라 탭으로 띄워주어야 한다. sendmail.cf의 수정을 끝낸 후 바로 sendmail을 재 시작하지 말고 룰셋이 정상적으로 작동하고 있는지 아래와 같이 테스트를 하는 것이 좋다.

          #/usr/lib/sendmail &#8211;bt #테스트 모드로 접속

          ADDRESS TEST MODE (ruleset 3 NOT automatically invoked)

          Enter

          >check_sircam Multipart message #Sircam 룰셋 테스트

          check_sircam input:Multipart message

          check_sircam returns:$#error $:550 553 Warning:Virus

          >ctrl-D #테스트 종료
          


위와 같이 확인된 후 sendmail을 재시작(killall –HUP sendmail)하면 바로 적용된다. 아래와 같이 tail –f /var/log/maillog 로 로그 파일을 지켜보면 아래와 같이 실제로 Sircam 바이러스가 필터링되고 있음을 확인할 수 있다.

          Sep 27 15:09:51 www sendmail [21386 ]:f8369of21386:to=<antihong@tt.co.kr>,

          Guess Sircam.worm Virus.
          


마지막으로 최근에 가장 영향을 많이 주었던 변형된 Nimda Worm 을 필터링하는 방법에 대해 알아보자.Nimda Worm 은 정상적인 메일 메시지와 달리 헤더에 boundary="====_ABC1234567890DEF_===="나 라는 부분이 있는데,이 부분으로 필터 링을 할 수 있다.즉 메일 헤더에 위와 같은 설정이 되어 있으면 Nimda Worm 으로 간주 하고 필터링 하면 되는 것이다.Sircam 에서와 같은 방법으로 sendmail.cf 파일의 설정은 아래와 같다.

          HContent-Type:$>check_ct

          D{NIMDA}"I guess NIMDA.WORM!!!"

          Scheck_ct

          R$+boundary="====_ABC1234567890DEF_===="$#error $:550 ${NIMDA}

          R$+boundary="====_ABC123456j7890DEF_===="$#error $:550 ${NIMDA}
          
[edit]

3 메일이 수신이 안되는 경우 #

아웃룩 익스프레스에서 “배달 ”을 눌러 메일을 수신하려고 할 때 메일이 받아지지 않는 경 우가 있다.이러한 경우에는 아래와 같이 여러가지 이유가 있을 수 있으니 아래의 사항에 대해 하나씩 원인을 찾아보기 바란다.
[edit]

3.1 (1)IMAP 패키지가 설치되지 않았을 경우 #

서버에 배달되어 있는 자신의 계정으로 온 메일을 클라이언트 PC에서 받으려면 pop3 데몬이 반응하게 된다.pop3d 는 IMAP 패키지안에 포함되어 있으므로,IMAP 패키지 를 설치하여야 pop3 를 사용할 수 있다.Rpm 으로 설치했다면 rpm –q imap 으로 현 재 시스템에 imap 패키지가 설치되어 있는지 확인한다.또는 /usr/sbin/ipop3d 파일이 있는지 확인해 본다.
[edit]

3.2 (2)Inetd 에 설정되어 있지 않을 경우 #

pop3d 는 inetd 또는 Xinetd 에서 작동하게 된다. /etc/inetd.conf 또는 /etc/xinetd.conf 파일을 살펴보아 ipop3 가 주석처리 되어 있거 나 pop3 가 disable =yes 로 되어 있지는 않은지 확인한다.
[edit]

3.3 (3)TCP Wrapper 에 설정되었는지 여부 확인 #

/etc./hosts.deny 에 pop3d 접근이 차단되지는 않았는지 확인한다.
[edit]

3.4 (4)계정에 Lock 이 걸리지 않았는지 확인 #

메일을 받는 과정에서 갑자기 회선이 끊기거나 PC가 다운되는 등 비정상적으로 종료 시 서버의 pop3d 프로세스가 죽지 않고 계속 남아 있는 경우가 있다. 이러한 경우 계정에 “Lock 이 걸렸다 ”라고 하며 이러한 경우에는 해당 프로세스를 찾 아 kill 을 하면 된다.만약 계정에 Lock 이 걸린 상태에서 아웃룩 익스프레스에서 메일을 수신하려고 하면 아래와 같은 에러가 나게 된다. “메일 서버에 로그온하는 데 문제가 있습니다.지정한 암호가 거부되었습니다. 계정:'temazone.com',서버:'tt.co.kr',프로토콜:POP3,서버 응답: '-ERR Can't get lock.Mailbox in use',포트:110,보안(SSL):아니오, 서버 오류:0x800CCC90,오류 번호:0x800CCC92 ” 변경 설정) pop-3 stream tcp (6)110 번 포트로 확인 Trying 210.17.6.5... quit +OK Sayonara
[edit]

3.5 (5)Pop3 접속이 많은 경우 #

Pop3d 가 서비스되는 inetd는 기본적으로 60초동안 40회의 접속을 받아들이 도록 (즉,maximum 40회 fork되도록)설정되어 있다.따라서 짧은 시간에 pop3d 요구가 많을 경우에는 메일로그에 pop3/tcp server failing (looping)라는 메시지가 나면서 pop3d 데몬 자체가 다운되어 버리므로 동시에 처리 가능한 프로세스의 한계 를 적절히 높여주어야 한다. 이를 위해서는 /etc/inetd.conf 를 열어 아래와 같이 수정하면 된다. 이전설정)

          pop-3 stream tcp nowait root /usr/sbin/tcpd ipop3d
          


바뀐설정)

          pop-3 stream tcp nowait:200 root /usr/sbin/tcpd ipop3d
          


(위의 경우 처리 가능한 프로세스를 200회로 늘려주었다.
[edit]

3.6 (7)mail –v 로 확인 #

타 서버에서 mail –v antihong@tt.co.kr 와 같이 메일을 발송하여 정상적으로 메일이 도착 하는지를 확인해 본다.–v 옵션을 이용하여 메일 발송시에는 메일 전송의 경로 및 메일 서 버간에 주고받는 메시지를 확인할 수 있으므로 문제의 원인을 찾는데 도움이 된다.
[edit]

4 센드메일 오류 #

[edit]

4.1 Transient parse error -- message queued for future delivery #

[edit]

4.2 Name server: domain: host not found #


참고: [http] -1){ thisSrc = this.src; ns = thisSrc.lastIndexOf('='); ne = thisSrc.length; orgImg = thisSrc.substr(ns + 1, ne); this.src = './dnImage/' + orgImg;}" src="http://tfile.nate.com/download.asp?FileID=5403760" localfile="yes" align="middle">http://www.brandonhutchinson.com/host_maplookup_(domain)deferred.html

sendmail 8.12 이후부터는 AAAA(IPv6), A, MX 순서로 도메인을 찾는다. 그런데 DNS가 AAAA를 제대로 지원하지 않을 경우 sendmail이 DNS에 질의를 하는 과정에서 오류가 생긴다.

          $ dig 도메인이름 aaaa
          


했을 때 status에 NOERROR 대신 SERVFAIL이 나오면 DNS에 문제가 있는 것이다.

근본적인 해결책은 DNS 관리자에게 고쳐 달라고 하는 것이지만([http] -1){ thisSrc = this.src; ns = thisSrc.lastIndexOf('='); ne = thisSrc.length; orgImg = thisSrc.substr(ns + 1, ne); this.src = './dnImage/' + orgImg;}" src="http://tfile.nate.com/download.asp?FileID=5403760" localfile="yes" align="middle">http://www.sendmail.org/compiling.html#DNS), 그게 안 될 때는 /etc/mail/sendmail.mc, /etc/mail/submit.mc에

          define(`confBIND_OPTS', `WorkAroundBrokenAAAA')dnl
          

을 추가하여 m4로 각각 sendmail.cf, submit.cf를 생성한 뒤에 sendmail을 재시동하면 문제를 회피할 수 있다.


댓글 없음:

댓글 쓰기