bbong blog : 위치로그 : 태그 : 방명록 : 관리자 : 새글쓰기
bbong blog 블로그에 오신것을 환영해요^^
방명록에 글 남기기!!
56
108
159247
'Linux/Mail'에 해당되는 글 9건

<Procmail Sendmail을 이용한 Outgoing 메일 필터링>

1) 개요

대부분의 리눅스 서버들이 스패머들의 공격으로 인하여 대량의 스팸메일 발송이 이루어 지고 있습니다. 이와 같은 경우 해당 서버의 아이피 블록 및 시스템 장애, 과부하 등이 일어나며 이에 대한 대처방안으로 Procmail을 이용한 필터링을 사용 할 수 있습니다.

Procmail은 리눅스설치시 기본적으로 설치되는 프로그램이며 혹시라도 설치가 되어 있지 않다면 패키지를 다운받아 설치가 가능 합니다.

또한 Sendmail과의 호환성이 매우 뛰어나며, 시스템 자원사용이 매우 적어 시스템에 부하를 일으키지도 않습니다.

Sendmail에서 발송시 sendmail.cf Ruleset에 의하여 해당 메일의 방향을 외부가 아닌 내부로 변경하게 됩니다. 내부로 돌아온 메일은 procmail에 의해 outgoing.rc와 같은 정규표현식 필터링을 거치게 되며, 모든 필터링이 완료되면 formail에 의하여 다시 Sendmail에게 전달되며, 해당 메일을 다시 전달 받은 Sendmail은 이제서야 정상적으로 메일발송을 하게 됩니다.

2) Sendmail.cf의 수정

Sendmail.cf의 수정은 아래 2가지 항목만 수정하시면 됩니다.

$ vi /etc/mail/sendmail.cf

- 아래 주석으로 검색하시면 구문이 있습니다.

(Before - 1)

# deal with other remote names

R$* < @$* > $*         $#esmtp $@ $2 $: $1 < @ $2 > $3 user@host.domain

(After - 1)

# deal with other remote names

#R$* < @$* > $*         $#esmtp $@ $2 $: $1 < @ $2 > $3 user@host.domain

R$*<@$*.procmail>$*     $#esmtp $@$2 $:$1<@$2>$3

R$*<@$*>$*           $#procmail $@/etc/outgoing.rc $:$1<@$2procmail.>$3

(Before -2)

#

#  envelope recipient rewriting --

#  also header recipient if not masquerading recipients

#

R$+                    $: $>PseudoToReal $1            sender/recipient common

R$+                    $: $>MasqSMTP $1                qualify unqual'ed names

R$* < @ *LOCAL* > $*    $: $1 < @ $j . > $2

(After 2)

#

#  envelope recipient rewriting --

#  also header recipient if not masquerading recipients

#

SEnvToSMTP

R$* < @$*.procmail > $* $: $1 < @ $2 > $3

R$+                     $: $>51 $1

R$+                     $: $>61 $1

R$+                    $: $>PseudoToReal $1            sender/recipient common

R$+                    $: $>MasqSMTP $1                qualify unqual'ed names

R$* < @ *LOCAL* > $*    $: $1 < @ $j . > $2

위와 같이 수정하시면 되며 탭구분을 주의하시기 바랍니다.

밑줄이 그어진 부분은 탭으로 구분하셔야 하는 부분입니다.

셋팅이 완료 된 후 outgoing.rx 파일을 생성하여야 하며, outgoing.rc는 제가 수정하여 놓은 파일을 이용하시면 됩니다.

Outgoing.rc /etc/ 폴더로 옮겨놓으신후 sendmail을 재시작 하면 셋팅은 완료가 되었습니다.

3) 테스트

#sendmail -d12.21 bt

ADDRESS TEST MODE (ruleset 3 NOT automatically invoked)

Enter <ruleset> <address>

> /parse mrmsm@sds.co.kr

Cracked address = $g

Parsing envelope recipient address

canonify           input: mrmsm @ sds . co . kr

Canonify2          input: mrmsm < @ sds . co . kr >

-- 중략 --

final              input: mrmsm < @ sds . co . kr . procmail . >

final            returns: mrmsm @ sds . co . kr . procmail

mailer procmail, host /etc/outgoing.rc, user mrmsm@sds.co.kr.procmail

> /parse mrmsm@sds.co.kr.procmail

Cracked address = $g

Parsing envelope recipient address

canonify           input: mrmsm @ sds . co . kr . procmail

Canonify2          input: mrmsm < @ sds . co . kr . procmail >

Canonify2        returns: mrmsm < @ sds . co . kr . procmail >

-- 중략 --

final              input: mrmsm < @ sds . co . kr >

final            returns: mrmsm @ sds . co . kr

mailer esmtp, host sds.co.kr, user mrmsm@sds.co.kr

위와 같이 이메일 주소 뒤에 .procmail이 붙으면 정상적으로 처리가 되는 것입니다. 그에 대한 역 또한 정상적으로 되고 있습니다.

만약 결과가 틀릴경우 sendmail.cf 파일의 셋팅이 잘못 된것이므로 다시한번 체크하여 보시기 바랍니다.

- -


위로
sendmail과 procmail을 이용한 outgoing mail filtering




                                                                             97/07/05

                                                                              98/05/08

                                                                              98/05/15


                                                                             이 상 로







프락메일은 외부에서 센드메일을 통해 들어오는 메일을 MDA수준에서 필터링할 때 주로
사용됩니다. 수신되는 메일의 헤더정보를 바꿀수 있고 본문의 내용을 각각의 문자셋에 따라
코드변환시킬수 있는등 여러 강력한 필터기능은 메일처리에 한껏 자유로움을
더해주었습니다. 특히 한글메일에 있어 잘못된 헤더정보나 본문을 프락메일 필터링을 통해
올바르게 잡아줌으로서 한글메일 송수신에 따른 어려움이 감소되었습니다.


이와 같은 프락메일의 필터링은 외부로 송신하는 메일에도 적용할 수 있습니다. 이를 통해
유도라와 같이 잘못된 인코딩 헤더정보를 변경하는 것이 가능하며 송신메일에 대한 통계나
컨트롤도 가능합니다.


      
  1. 준비물
      
  2. 수정된 sendmail.cf
      
  3. 프락메일을 위한 송신용 outgoing.rc
      
  4. 테스트
      
  5. 요약
      
  6. 기타



1. 준비물



센드메일 8.8.x와 procmail이 설치되어 있어야 합니다. 센드메일과 프락메일은 신정식님의
"센드메일 8.8.x와 procmail을 이용한 한글메일"에 따라 설치하도록 하십시오.. (자세한 것은
저의 센드메일과 프락메일 페이지를 참조하세요.)


2. 수정된 sendmail.cf


먼저 센드메일이 작동되는 원리를 간단히 알아볼까요. 만일 제가 leesl@suny.multi.co.kr로
메일을 보낸다고 가정해 봅시다. 그러면 이 메일주소는 제일 먼저 룰셋3을 거치게 됩니다.
룰셋 3에서는 Lee Sanglo과 같이 "이름<메일주소>"로 되어있는 완전한
메일주소에서 순수하게 메일주소만 담겨있는 < >안에 있는 정보만 뽑아냅니다.


이렇게 룰셋3을 통과한 메일주소는 다시 룰셋 0을 통과하게 됩니다. 룰셋 0에서는
메일주소에서 3가지 정보를 뽑아냅니다. 첫째는 Delivery Agent($#), 둘째는 Recipient
host($@), 셋째는 Recipient user($:)와 같은 정보가 추출됩니다. 예를 들어 제가
trade.chonbuk.ac.kr에 앉아서 leesl@suny.multi.co.kr로 메일을 보낸다고 합시다. 그러면 Delivery
Agent로는 esmtp가 선택되고 Recipient host로는 suny.multi.co.kr이, Recipient User로는 leesl이
선택됩니다. (자세한 것은 저의 "센드메일 구성요소를 통한 전반적 이해" 부분을
참조하세요.) 그러면 trade의 센드메일은 룰셋 0에서 얻은 정보에 따라 suny.multi.co.kr에
접속하여 메일을 전송하게 됩니다.


외부로 나가는 메일을 필터링하기 위해서는 룰셋 0의 시점에서 메일을 로컬메일인것처럼
해서 프락메일로 보내면 됩니다. 그리고 프락메일은 처방전에 따라 메일을 처방해서 다시
원래의 수신자에게 메일을 보내도록 합니다.


2.1 메일을 프락메일에 보내는 방법


메일을 로컬 메일러인 프락메일에 보내려면 위 룰셋 0에서 Delivery Agent를 #procmail로 ,
수신 호스트를 프락메일의 외부 송신용 처방전으로, 수신자는 수신자 주소에 .procmail을
붙여 보냅니다. 수신자의 주소를 leesl@suny.multi.co.kr.procmail과 같이 .procmail을 붙인
이유는 프락메일로 건네진 메일이 센드메일에 들어와 다시 프락메일로 건네지는 루핑을
막기 위해서입니다.


그러면 직접 /etc/sendmail.cf를 편집하면서 해봅시다.


1) CP.을 #CP.

여기를 코멘트 해둡니다. 이 클래스는 $~P와 같이 사용됩니다. 예를 들어 네트웍에 3대의
PC와 여러대의 유닉스가 있는데 3대의 PC는 메일을 받을 수 없습니다. 이때 $~P와 같이
지정하면 3대의 PC를 제외한 나머지 유닉스를 지칭합니다. 여기에서는 "."이 찍혀있으므로
나중에 .룰셋0의 strip trailing dot에 의해 제거됩니다. 그러나 거의 사용되는 경우가 드물어서
제외한다고 해도 큰문제가 없습니다.


2) procmail을 메일러로 등록

sendmail.cf를 만들 때 mc화일에 FEATURE(local_procmail)을 이용해 sendmail.cf를 만들었다면
다시 등록할 필요가 없습니다. 따라서 이번부분은 FEATURE(local_procmail)을 이용해
만드시고 바뀐 부분만 고치세요.


Mprocmail,       P=/usr/local/bin/procmail, F=DFMSPhnu, S=11, R=22,
               A=procmail -m $h $f $u



Mprocmail, 과 P사이에는 탭으로 구분되어 있습니다. 따라서 스페이스로 구분하시면 에러가
납니다. 그리고 P다음에 나오는 내용은 프락메일이 설치된 완전한 경로를 적어주면 됩니다.


F다음에 오는 것은 프락메일이 어떻게 작동할 것인지를 지정하는 것으로서 F다음에 나오는
내용중 m이 있으면 지워주세요. 이유는 이렇게 하면 좀 효율이 올라가고 리턴메일의 경우
처리가 잘됩니다(프락메일 부분참조)


R다음에 보통 21로 되어있으나 leesl@suny.multi.co.kr.procmail과 같이 뒤의 .procmail을
떼내기 위한 추가과정을 위해 21을 지정합니다.


또한 A까지는 탭문자로 되어있습니다. 그리고 나머지 부분은 위에 적힌대로 쓰시면 됩니다.


3) 룰셋 0에서 프락메일을 호출하여 세가지 정보를 넘겨줍니다.


********************************

**** Rulset 0 -- Parse Address *

********************************

S0


이렇게 시작하는 부분이 있습니다. 쭉 따라내려오다 보면


# deal with other remote names
R$*<@$*> $*            $#esmtp $@$2 $:$1<@$2>$3      user@host.domain


이런 부분이 있습니다.  

여기를 코멘트하고 다음과 같이 적어줍니다.

#R$*<@$*> $*           $#esmtp $@$2 $:$1<@$2>$3      user@host.domain
R$*<@$*.procmail>$*     $#esmtp $@$2 $:$1<@$2>$3
R$*<@$*>$*             $#procmail $@/etc/outgoing.rc $:$1<@$2procmail.>$3
         ---------------         --              --         --------
           탭              스페이스       스페이스      점의 위치에 주의
       



좀더 자세히 설명하면 leesl@suny.multi.co.kr은 Delivery agent로 procmail이 선택되고 host로는
procmail에 사용될 인수인 /etc/outgoing.rc가 사용됩니다. 그리고 프락메일에 넘겨지는 수신자
주소는 끝에 .procmail을 붙여 넘겨줍니다.


그러면 프락메일은 위정보에 의해 넘겨진 메일을 가공해서 다시 센드메일에 넘겨줍니다.
이때 주소는 끝에 .procmail이 붙어 있겠지요. 그러면 이번엔 끝의 .procmail을 제거하고
원래의 esmtp로 넘겨주어 메일을 송신합니다.


4) .pcormail이 붙은 수신자 주소변경

이젠 헤더에 나타나는 수신자의 주소를 .procmail을 떼어낸 상태로 바꿉니다.
이를 위해 다음의 내용을 S21과 S31란 사이에 끼워넣습니다.


#
# envelope recipient rewirting --
# also header recipient if not masquerading recipients
#
S21
R$*<@$*.procmail>$*      $: $1<@$2>$3   sender/recipient common
R$+                     $: $>51 $1      qualify unqual'ed names
R$+                     $: $>61 $1



3. 프락메일을 위한 송신용 outgoing.rc


------------
#LOGFILE=/var/log/outgoing_mail
#VERBOSE=yes
PATH=/usr/local/bin:/usr/bin:/bin
SHELL=/bin/sh  # 명시적으로 사용할 shell을 지정하는 것이 좋을 것임.
DEFAULT=|    # 디폴트로 메일이 다른 프로그램의 인풋으로 사용된다
REC=$2        # 변수 2에(수신자) 있는 정보를 REC변수에 넣는다.


# 이하 자신의 처방전
:0 f
* ^Subject:.*test
| formail -A "X-envelope: 0=$0, 1=$1, 2=$2 $REC" |\
$SENDMAIL -oi $REC


여기서는 간단히 메일제목이 test라고 되어 있는 송신 메일에 "X-envelope...."에 있는
헤더정보를 넣어서(필터링해서) 다시 센드메일에 넘겨줍니다. 각 변수에는 0=procmail 1=leesl
2=leesl@suny.multi.co.kr.procmail이 배정됩니다. 만일 위에서 SENDMAIL -oi "$@"을 사용하면
변수 1, 2에 해당되는 수신자에게 메일이 전송되므로 로컬의 leesl과 suny.multi.co.kr의
leesl에게 메일이 전달됩니다. 그러나 로컬의 leesl은 없으므로 로컬로 가는 메일은 Recipent
names must be specified...라는 에러를 내며 반송됩니다. 따라서 2의 변수를 REC에 대입해서
사용한 것입니다.


이 처방전은 제목이 test인 메일만 로그를 남기는 처방입니다. 모든 메일에 대해 로그를 남기고
싶으시면


* ^Subject:.*

와 같이 바꾸시면 됩니다.


그리고 $SENDMAIL -oi -f와 같이 f옵션을 사용하면 "X-warning....."라는 경고메세지가
쌓이게 됩니다. f옵션은 센드메일이 보내는 사람의 주소를 envelope가 아닌 command
line에서 읽어들이도록 하는 옵션이다. 이렇게 되면 전송하는 메일이 가짜메일가능성이
있다는 점에서 경고메세지가 나옵니다.


이 처방을 관리자의 필요에 맞게 처방전을 만들면 됩니다. 예를 들어 나가는 메일의 통계를
작성해둔다는지 헤더를 변경시킨다는지 본문의 인코딩 방식을 변경시킨다든지의 필터를 할
수 있습니다. (자세한 것은 저의 홈페이지의 프락메일 부분을 참조하세요)


4. 테스트


루트로 로긴하여 쉘상에서 다음과 같이 명령을 내립니다.
> trade:~# sendmail -d12.21 -bt

ADDRESS TEST MODE (ruleset 3 NOT automatically invoked)
Enter

>

그러면 위와 같은 내용이 나옵니다. 그러면 >다음에 다음과 같이 적어넣습니다.
>/parse leesl@multi.co.kr

과 같이 치면 제일 마지막에

mailer procmail, host /etc/suny.rc, user leesl@multi.co.kr.procmail

같은 내용이 나와야 합니다.


그리고

>/parse leesl@multi.co.kr.procmail

과 같이 치면 제일 마지막에

mailer esmtp, host multi.co.kr, user leesl@multi.co.kr

과 같이 나와야 합니다.


이런 결과가 나오면 잘 된 것입니다.

끝낼때는 CRTL + D 를 누릅니다.



5. 요약


그럼 전반적인 과정을 예를 들어 설명하겠습니다.

센드메일의 소스를 푼 디렉토리에서 trade:~/sendmail-8.8.8/cf/cf$

5.1 sol.mc 파일의 작성


------
VERSIONID(`@(#)sora.mc  8.3 (Berkeley) 3/23/96')
OSTYPE(solaris2)dnl
FEATURE(nouucp)dnl
FEATURE(always_add_domain)dnl
FEATURE(local_procmail)dnl
MAILER(local)dnl
MAILER(smtp)dnl
------

와 같은 내용을 작성하여 sol.mc라는 파일로 저장한다.



5.2  sol.mc를 이용하여 sendmail.cf 작성



m4 sol.mc > sendmail.cf



5.3 sendmail.cf에서 수정사항 변경



  • /usr/local/bin/procmail 의 위치를 자신이 설치한 procmail의 위치로 변경

       (procmail의 소스를 풀어 설치하면 디폴트로 /usr/bin/procmail에 설치됩니다. 그런데
        sendmail.cf는 /usr/local/bin/procmail로 지정하고 있으므로 변경해주어야 합니다.)
  • 룰셋0

  • 룰셋 21

       각각의 룰셋에서 탭의 수에 주의하십시오. 탭은 하나씩입니다.



5.4 outgoing.rc에서 지정한 outgoing mail의 로그화일의 소유권문제


    procmail이 suid를 갖지 않으면 writing error에러를 냅니다. 그냥 간단히 chmod u해+rw  
    outgoing_mail 명령어로 소유권한을 바꾸시면 됩니다.



5.5 /usr/sbin/sendmail -bd -q1h 로 센드메일을 가동합니다.



5.6 /parse leesl@multi.co.kr


위 테스트시 *.*.*.procmail의 주소를 찾을 수 없다는 에러가 나오면
끝의 procmail을 다른문자, 예를 들어 parsemail, out등으로 바꾸어 테스트해본다.

6. 기타


이것은 외부필터링에 대한 저의 생각을 센드메일과 프락메일을 써서 구현해본 것입니다.
오류가 있을수 있습니다. 테스트 해보실때는 각별히 메일을 잃지 않도록 주의하십시오.



수정사항


98/05/15
S21에서
R$*<@$*.procmail>$*      $: $1<@$2>$3   sender/recipient common
   ^^^
타이핑 미스체크함.

your.address.procmail과 같이 procmail을 붙였을경우 에러가 발생하는 경우가 있음
(solaris 2.6)이때 위 설정중 procmail을 붙이는 것을 parsemail 또는 out등을 붙여
에러가 없는 것으로 사용하면 됨

98/05/08  
1. dot의 위치변경
R$*<@$*>$*              $#procmail $@/etc/outgoing.rc $:$1<@$2.procmail>$3
R$*<@$*>$*              $#procmail $@/etc/outgoing.rc $:$1<@$2procmail.>$3

2. 탭의 숫자 명시
R$*<@*.procmail>$*      $: $1<@$2>$3    sender/recipient common
이때             ^^^^^^^^^^         ^^^^^^는 각기 탭이 하나만 사용되어야 합니다.
그렇지 않으면 replacement $3 out of bounds라는 에러를 만나게 됩니다.

3. 처방전의 예시명시
이 처방전은 제목이 test인 메일만 로그를 남기는 처방입니다.
모든 메일에 대해 로그를 남기려면 * ^Subject:.* 로 바꾸시면 됩니다.

위로
whitelist

/etc/mail/spamassassin/local.cf

위로
* 다람쥐 메일에는 imap 기반으로 운영. sendmail 경우에는 xinetd의 imap, dovecot (uw) 부분을 활용하면 된다.
* qmail 을 사용하는 경우는 대개 courier-imap 을 많이 사용함 ( courier-authlib , courier-imap )

### courier-authlib-0.57 설치 ###
코드:
cd /usr/local/src wget http://optusnet.dl.sourceforge.net/sourceforge/courier/courier-authlib-0.57.tar.bz2 tar jvxf courier-authlib-0.57.tar.bz2 chown -R root.root courier-authlib-0.57.tar.bz2 cd courier-authlib-0.57 ./configure --prefix=/usr/local/courier-authlib --with-redhat (default 로 설정하기 위해서 위의 옵션만 주면 된다) make make install make install-configure vi /usr/local/courier-authlib/etc/authlib/authdaemonrc authmodulelist="authvchkpw" cp courier-authlib.sysvinit /etc/rc.d/init.d/courier-authlib chmod 744 /etc/rc.d/init.d/courier-authlib chkconfig --add courier-authlib /etc/rc.d/init.d/courier-authlib start [root@zosen courier-authlib-0.57]# pstree init-+-courierlogger---authdaemond---5*[authdaemond] [root@zosen courier-authlib-0.57]# ps aux | grep courier root 4192 0.0 0.1 2160 452 ? S 10:35 0:00 /usr/local/courier-authlib/sbin/courierlogger -pid=/usr/local/courier-authlib/var/spool/authdaemon/pid -start /usr/local/courier-authlib/libexec/courier-authlib/authdaemond root 4193 0.0 0.3 4204 776 ? S 10:35 0:00 /usr/local/courier-authlib/libexec/courier-authlib/authdaemond root 4194 0.0 0.3 4204 780 ? S 10:35 0:00 /usr/local/courier-authlib/libexec/courier-authlib/authdaemond root 4195 0.0 0.3 4204 780 ? S 10:35 0:00 /usr/local/courier-authlib/libexec/courier-authlib/authdaemond root 4196 0.0 0.3 4204 780 ? S 10:35 0:00 /usr/local/courier-authlib/libexec/courier-authlib/authdaemond root 4197 0.0 0.3 4204 780 ? S 10:35 0:00 /usr/local/courier-authlib/libexec/courier-authlib/authdaemond root 4198 0.0 0.3 4204 780 ? S 10:35 0:00 /usr/local/courier-authlib/libexec/courier-authlib/authdaemond root 4273 0.0 0.2 5860 684 pts/0 R+ 10:36 0:00 grep courier


### courier-imap-4.0.6 설치 ###
코드:
cd /usr/local/src wget http://optusnet.dl.sourceforge.net/sourceforge/courier/courier-imap-4.0.6.tar.bz2 tar jvxf courier-imap-4.0.6.tar.bz2 chown -R root.root courier-imap-4.0.6 cd courier-imap-4.0.6 COURIERAUTHCONFIG=/usr/local/courier-authlib/bin/courierauthconfig CPPFLAGS=-I/usr/local/courier-authlib/include ./configure --prefix=/usr/local/courier-imap --disable-root-check --with-redhat make make install make install-configure vi /usr/local/courier-imap/etc/imapd MAXDAEMONS=40 MAXPERIP=40 IMAP_EMPTYTRASH=Trash:7,Sent:30 IMAPDSTART=YES cp courier-imap.sysvinit /etc/rc.d/init.d/courier-imap chmod 744 /etc/rc.d/init.d/courier-imap chkconfig --add courier-imap /etc/rc.d/init.d/courier-imap start [root@zosen courier-imap-4.0.6]# pstree init-+-courierlogger---authdaemond---5*[authdaemond] |-courierlogger---couriertcpd [root@zosen courier-imap-4.0.6]# ps aux | grep courier root 4192 0.0 0.1 2160 452 ? S 10:35 0:00 /usr/local/courier-authlib/sbin/courierlogger -pid=/usr/local/courier-authlib/var/spool/authdaemon/pid -start /usr/local/courier-authlib/libexec/courier-authlib/authdaemond root 4193 0.0 0.3 4204 776 ? S 10:35 0:00 /usr/local/courier-authlib/libexec/courier-authlib/authdaemond root 4194 0.0 0.3 4204 780 ? S 10:35 0:00 /usr/local/courier-authlib/libexec/courier-authlib/authdaemond root 4195 0.0 0.3 4204 780 ? S 10:35 0:00 /usr/local/courier-authlib/libexec/courier-authlib/authdaemond root 4196 0.0 0.3 4204 780 ? S 10:35 0:00 /usr/local/courier-authlib/libexec/courier-authlib/authdaemond root 4197 0.0 0.3 4204 780 ? S 10:35 0:00 /usr/local/courier-authlib/libexec/courier-authlib/authdaemond root 4198 0.0 0.3 4204 780 ? S 10:35 0:00 /usr/local/courier-authlib/libexec/courier-authlib/authdaemond root 11701 0.0 0.1 1592 388 ? S 11:17 0:00 /usr/local/courier-authlib/sbin/courierlogger -pid=/var/run/imapd.pid -start -name=imapd /usr/local/courier-imap/libexec/couriertcpd -address=0 -maxprocs=40 -maxperip=40 -nodnslookup -noidentlookup 143 /usr/local/courier-imap/sbin/imaplogin /usr/local/courier-imap/bin/imapd Maildir root 11702 0.0 0.1 3164 468 ? S 11:17 0:00 /usr/local/courier-imap/libexec/couriertcpd -address=0 -maxprocs=40 -maxperip=40 -nodnslookup -noidentlookup 143 /usr/local/courier-imap/sbin/imaplogin /usr/local/courier-imap/bin/imapd Maildir root 11812 0.0 0.2 5796 704 pts/0 R+ 11:17 0:00 grep courier [root@zosen courier-imap-4.0.6]# netstat -anp | grep LISTEN tcp 0 0 0.0.0.0:3306 0.0.0.0:* LISTEN 1552/mysqld tcp 0 0 0.0.0.0:110 0.0.0.0:* LISTEN 18663/tcpserver -> vpopmail 로써 pop3확인 tcp 0 0 0.0.0.0:80 0.0.0.0:* LISTEN 9097/httpd tcp 0 0 0.0.0.0:21 0.0.0.0:* LISTEN 1971/vsftpd tcp 0 0 0.0.0.0:25 0.0.0.0:* LISTEN 5812/sendmail: acce tcp 0 0 :::143 :::* LISTEN 11702/couriertcpd -> imap 확인. tcp 0 0 :::22 :::* LISTEN 1951/sshd unix 2 [ ACC ] STREAM LISTENING 4558 2016/saslauthd /var/run/saslauthd/mux unix 2 [ ACC ] STREAM LISTENING 4577 2029/dbus-daemon-1 /var/run/dbus/system_bus_socket unix 2 [ ACC ] STREAM LISTENING 1240384 4193/authdaemond /usr/local/courier-authlib/var/spool/authdaemon/socket.tmp unix 2 [ ACC ] STREAM LISTENING 3738 1552/mysqld /tmp/mysql.sock



### squirrelamil (다람쥐메일) 설치 ###
코드:
cd /usr/local/src wget http://superb.dl.sourceforge.net/sourceforge/squirrelmail/squirrelmail-1.4.5.tar.gz ===> http://www.squirrelmail.org/download.php (다운페이지) cd /usr/local/apache/htdocs tar xvzf /usr/local/src/ chown -R nobody.nobody squirrelmail-1.4.5 chmod -R 750 squirrelmail-1.4.5 ln -s squirrelmail-1.4.5 squirrelmail mkdir /var/squirrelmail mkdir /var/squirrelmail/data mkdir /var/squirrelmail/attach cd squirrelmail cp data/default_pref /var/squirrelmail/data chown -R nobody.nobody /var/squirrelmail chmod -R 0770 /var/squirrelmail/data chmod -R 0730 /var/squirrelmail/attach cd config ./conf.pl


코드:
Main Menu -- 1. Organization Preferences 2. Server Settings 3. Folder Defaults 4. General Options 5. Themes 6. Address Books 7. Message of the Day (MOTD) 8. Plugins 9. Database 10. Languages D. Set pre-defined settings for specific IMAP servers C Turn color on S Save data Q Quit Command >> D Please select your IMAP server: cyrus = Cyrus IMAP server uw = University of Washington's IMAP server (xinetd 의 imap 경우 -> 보통 sendmail에 다람쥐메일설치할경우 선택) exchange = Microsoft Exchange IMAP server courier = Courier IMAP server macosx = Mac OS X Mailserver hmailserver = hMailServer quit = Do not change anything Command >> courier



1 ] Organization Preferences
1. Organization Name : Webmail
2. Organization Logo : ../images/sm_logo.png
3. Org. Logo Width/Height : (308/111)
4. Organization Title : Webmail
5. Signout Page :
6. Top Frame : _top
7. Provider link : http://www.zosen.net/
8. Provider name : zosen webmail

R Return to Main Menu
C Turn color on
S Save data
Q Quit

Command >>

2 ] Server Settings

General
-------
1. Domain : example.com => ( zosen.net 로 수정.)
2. Invert Time : false
3. Sendmail or SMTP : SMTP

A. Update IMAP Settings : localhost:143 (courier)
B. Update SMTP Settings : localhost:25

R Return to Main Menu
C Turn color on
S Save data
Q Quit

Command >>

3 ] Folder Defaults

1. Default Folder Prefix : INBOX.
2. Show Folder Prefix Option : false
3. Trash Folder : Trash
4. Sent Folder : Sent
5. Drafts Folder : Drafts
6. By default, move to trash : true
7. By default, move to sent : true
8. By default, save as draft : true
9. List Special Folders First : true
10. Show Special Folders Color : true
11. Auto Expunge : true
12. Default Sub. of INBOX : false
13. Show 'Contain Sub.' Option : false
14. Default Unseen Notify : 2
15. Default Unseen Type : 2 -> ( 1-=>2 로 수정)
16. Auto Create Special Folders : true
17. Folder Delete Bypasses Trash : true
18. Enable /NoSelect folder fix : false

R Return to Main Menu
C Turn color on
S Save data
Q Quit

4 ] General Options

1. Data Directory : ../data/ => ( /var/squirrelmail/data ) 로 수정
2. Attachment Directory : $data_dir => ( /var/squirrelmail/attch) 로 수정
3. Directory Hash Level : 0
4. Default Left Size : 150
5. Usernames in Lowercase : false => ( true ) 로 수정
6. Allow use of priority : true
7. Hide SM attributions : false => ( true ) 로 수정
8. Allow use of receipts : true
9. Allow editing of identity : true
Allow editing of name : true
Remove username from header : false
10. Allow server thread sort : false
11. Allow server-side sorting : false
12. Allow server charset search : true
13. Enable UID support : true
14. PHP session name : SQMSESSID

R Return to Main Menu
C Turn color on
S Save data
Q Quit

Command >>


6 ] Address Books

1. Change LDAP Servers
2. Use Javascript Address Book Search : fault => ( true ) 로 수정
3. Global file address book :
4. Allow writing into global file address book : false

R Return to Main Menu
C Turn color on
S Save data
Q Quit

Command >>

8 ] Plugins

Installed Plugins
1. delete_move_next
2. spamcop
3. administrator
4. newmail
5. abook_take
6. message_details
7. info
8. mail_fetch
9. translate
10. listcommands
11. calendar
12. bug_report
13. filters
14. sent_subfolders
15. squirrelspell

Available Plugins:
16. fortune

R Return to Main Menu
C Turn color on
S Save data
Q Quit

10 ] Language preferences

1. Default Language : en_US => ( ko_KR)
2. Default Charset : iso-8859-1 => ( EUC-KR )
3. Enable lossy encoding : false

R Return to Main Menu
C Turn color on
S Save data
Q Quit

Command >>

cd /usr/local/src
wget http://www.squirrelmail.org/plugins/quota_usage-1.2.tar.gz
wget http://www.squirrelmail.org/plugins/compatibility-1.3.tar.gz

cd /usr/local/apache/htdocs/squirrelmail/plugins
tar xvzf /usr/local/src/quota_usage-1.2.tar.gz
cp quota_usage/config.php.sample quota_usage/config.php
chown -R nobody.nobody quota_usage
chmod -R o-rx quota_usage

vi quota_usage/functions.php
Go to line 43 and change the value 1000000 to 1048576
==> 43 라인 부분에서 1000000 을1048576 으로 수정,

tar xzf /usr/local/src/compatibility-1.3.tar.gz
chown -R nobody.nobody compatibility
chmod -R o-rx compatibility

cd ../config
./conf.pl

8 ] Plugins
부분에서
quota_usage
choose compatibility 을

-> Installed Plugins 으로 선택하여 올려준다.

# vi /usr/local/apache/conf/httpd.conf 부분에 webmail 페이지 띄우기 위해 버추얼 호스트 설정.

코드:
<VirtualHost 222.122.45.177:80> ServerAdmin webmaster@zosen.net DocumentRoot /usr/local/apache/htdocs/squirrelmail ServerName webmail.zosen.net ErrorLog logs/webmail.zosen.net-error_log CustomLog logs/webmail.zosen.net-access_log common </VirtualHost>

* 다람쥐메일 한글화

http://www.squirrelmail.org/download.php 에서 다람쥐메일 설치버전에 맞는 언어팩설치

코드:
cd /usr/local/apache/htdocs/squirrelmail/ wget http://heanet.dl.sourceforge.net/sourceforge/squirrelmail/all_locales-1.4.5-20050904.tar.gz tar xvzf all_locales-1.4.5-20050904.tar.gz cd locale ==> 부분에 ko_KR 이있는지 확인.


==> http://webmail.도메인/

출처 : Tong - BlueSky_09님의 Linux통


위로
sendmail.cf
Linux/Mail, (2008/08/25 15:17)

메일서버 &&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&

보낸메일 저장 : 메일서버에 /var/spool/mqueue

받을메일 저장 : 메일서버의 /var/spool/mail

$$ 관련파일
/usr/sbin/sendmail  : 데몬
/usr/bin/makemap  : 맵생성파일(access, virtususer 등 등록시)
/usr/bin/newaliases  : 엘리어스(alias)파일의 DB를 재생성함
/usr/lib/sendmail  : 데몬(대부분 /usr/sbin/sendmail 과 링크)
/var/spool/mqueue  : 큐디렉토리(메일 일시저장되는 디렉토리)
/var/spool/mail  : 받는 메일저장 디렉토리
/etc/mail/access  : Relay 제한 및 설정 파일
/etc/mail/aliases  : 엘리어스 설정파일
/etc/mail/domaintable  : 도메인테이블 등록파일
/etc/mail/local-host-names  : 최종수신지 설정파일
/etc/mail/sendmail.cf  : 설정파일
/etc/mail/virtusertable  : 가상메일주소 등록파일
/etc/rc.d/init.d/sendmail  : 시작 및 종료 스크립트(rpm설치시)
/etc/sysconfig/sendmail  : sendmail실행시 실행옵션 설정파일
/var/log/sendmail.st  : sendmail 실행 상황파일

$$$ 설치
0. 현재 버젼 확인 telnet localhost 25 -> 실행중지 -> 현재 데몬파일(/usr/sbin/sendmail) 및
   설정파일(/etc/mail/sendmail.cf) 백업하기
1. 다운 www.sendmail.org (wget)
2. 압축해제 후 이동(cd /usr/local ->tar ->cd)
3. 컴파일(전용프로그램 이용 sh Build)
4. cd /usr/local/sendmail-버전/makemap ;; make install ;;
    에러발생시 mkdir /usr/man ;; mkdir /usr/man/man8 ;; make install
5. 새 데몬파일 복사 cp /usr/local/sendmail-버전/obj.Linix.2.4..i686/sendmail /usr/sbin/sendmail
6. chown root:smmsp /usr/sbin/sendmail ;; chmod 2755 /usr/sbin/sendmail
7. 설정파일복사 cd /usr/local/sendmail-버전/cf/cf ;; cp generic-linux.cf /etc/mail/sendmail.cf
8. 시작하기 /etc/rc.d/init.d/sendmail start ;; /usr/sbin/sendmail -bd(백) -q30m(큐보관 30분)
9. 새 버젼 확인 telnet localhost 25( mail from:root@lo.com ;; rcpt to:root@df.com;;data . ;;quit

$$$$ 최종수신지 도메인 설징(/etc/mail/local-host-names)
현재 서버에 도착한 메일의 최송 수신지 인식. (ex. hyung.co.kr)

$$$$$ /etc/mail/access 를 이용한 Spam 메일방지법
localhost   RELAY (수신/발신 허용)
192.168.2.  REJECT (수신/발신 거부)
root@co.com DISCARD (메일을 받은후에 폐기함. 단 메일발신자에게 폐기통보를 전혀 하지 않음
            즉, /etc/sendmail.cf에 지정된 $#discard mailer에 지정된곳으로 메일을 폐기함
            발신자는 메일이 발신된것으로 알게됨)
192.168.3.0/255.255.255.0  OK (조건없이 메일의 모든것을 허용함)
do@do.com   501 You send Spammer. Delete your list(do@do.com에서 발송되는 메일을 거부하고
            위의 501 뒤에 있는 메시지와 함께 거부메일을 보내주게됨
502 "메시지" : 발신메일주소에 host명이 없을경우에 메일을 받지 않음
503 "메시지" : 관련(host에 지정된)된 도메인과 관련된 메일을 받지않음
505 "메시지" : 특정한 도메인에 대해 지정된 "메시지"로 거부
517 "메시지" : 주로 스팸메일의 경우에 사용하는 설정. "메시지"경고메일을 보낸후에 거부하게됨

 && 하지만 /etc/mail/access 파일을 작성 및 편집한 후에는 makemap 유틸리티를 이용하여
    /etc/mail/access.db 파일을 생성해 주어야 됨
    makemap hash /etc/mail/access.db < /etc/mail/access
    또는 /etc/mail 에서 "make"를 실행만 하면 /etc/mail/access 파일뿐 아니라
    /etc/mail/virtusertable 파일을 포함하여 변경된 사항들을 모두 적용해준다
    (확인 strings(이진파일) /etc/mail/access.db)

$$$$$ 가상메일 설정법(/etc/mail/virtusertable)
동일한 메일계정을 사용자의 도메인별로 여러 개 사용할 수 있도록 만듬. 가상메일 = 실제메일 매칭
1. 가상메일로 사용할 도메인이 있다면 해당 도메인 등록
vi /etc/mail/virtusertable ;; root@han.com [tab으로 띄움] han ;;
 ###root@han.com으로 오는 메일은 han이라는 실제계정에서 받게한다###
makemap hash /etc/mail/virtusertable.db < /etc/mail/virtusertable
strings virtusertable.db | grep han  >> sendmail 재구동하지 않아도 적용됨

$$$$$ 메일 엘리어스 설정 /etc/aliases
기능 : 메일별칭 기능, 소규모의 메일링 기능
/etc/aliases 메일별칭기능
mailer-daemon : postmaster (mairer-daemon의 별칭은 postmaster)
postmaster : root (postmaster의 별칭은 root)
 만약 postmaster : papa (root가 받던 모든 메일은 papa라는 계정이 모두 받게됨)

메일링예 1. 몇 명의 운용자 그룹 메일링 리스트 설정
# Person who...
staff : admin,kim,park,son (staff에 메일 보내면 뒤에4명이 메일 받게됨(admin.kim,park,son)

메일링예 2. 일정규모 이상의 메일링리스트 설정
# superuser korea mail-list
staff:   :include:/home/staff/staff_list(이 파일에 존재하는 모든 사용자에게 메일 전달)
cat staff_list ;; admin@ab.com
                  kim@ab.com
적용하기 : newaliase 또는 sendmail -bi ( /etc/aliases.db 파일 새로 갱신되어 생성)

$$$$ /etc/mail/sendmail.cf 파일의 주요 설정 $$$$
C : 클래스의 정의 설정
D : 매크로의 정의 설정
E : 환경변수의 정의 설정
F : 클래스의 정의 파일 설정
H : 헤드(header) 정의 설정
K : Key file 정의(map 정의) 설정
M : Mailer 정의 설정
O : 옵션설정
P : Messenger Precedences 설정
R : 덮어쓰기 설정(Rewrite)
S : Ruleset 설정
T : 사용자 설정
V : 버전

$$$ 최종 수신지 및 localhost 설정(/etc/mail/local-host-names)
현재 이 메일서버를 최종수신지로 설정할 도메인을 설정합니다
 ** 수정 후에는 sendmail을 재시작 해주셔야 합니다

$$$ 가상메일 설정파일(/etc/mail/virtuertable)
# Virtual user table
Kviruser hash -o /etc/mail/virtusertable
가상유저테이블로 사용할 사용자리스트를 /etc/mail/virtusertable에 보관하고
hash 테이블로 그 내용을 참고하겠다라는 설정

$$$ relay 설정파일 지정(/etc/mail/access)
# Access ..
Kaccess hash -o /etc/mail/access

$$$ 메일 장애시 보내는 사람이름 설정
# my
DnMAILER-DAEMON (Dn 지시자 다음에 "MAILER-DAEMON"로 보내게 됨>> aliases 참조)

$$$ sendmail 버전 설정
DZ8.13.2 (DZ 다음에 버전 표시)

$$$ 메일별칭 파일 설정(/etc/aliases)
O(대문자O) AliasFile=/etc/aliases

$$$ 발송메일의 최대크기 제한설정(MaxMessageSize)
O MaxMessageSize=10000000 (최대크기를 10000000byte 로 제한 - 약 10MB)
 .. MDA(예: procmail)가 MTA에게 보내는 메일의 최대 크기 제한하는 설정

$$$ 보관가능한 메일의 최대 크기 설정
MDA가 한번에 받는 메일의 용량을 제한하는 설정. bible라는 사용자가 도착한 메일은
/var/spool/mail/bible 파일에 저장되게됨. 이때 받은 한건한건에 용량을 제한하는 설정.
bible파일의 전체용량을 제한하는 설정이 아님!!! 주의
Mlocal, P=/usr/bin/procmail, F=lsDFMAw5:/|@qSPfhn9, S=EnvFromL/HdrFromL,
R=EnvToL/HdrToL,   M=2048000,    T=DNS/RFC822/X-Unix, A=procmail -Y -a $h -d $u
위에서 M=2048000 메일한건한건 2MB로 제한

$$$ sendmai 백그라운드로 실행
O DeliveryMode=background (interactivity,background,queue,defer 가능)

$$$ 최대 Hop수 제한설정(MaxHopCount)
메일서버 거칠때마다 1씩증가. 최대값도달하면 최초 수신지 서버로 리턴하게 


위로
I had a similar error (along with many others) using Fedora Core 2 until I
   update "src/osdep/unix/Makefile" like this:

       SSLDIR=/usr/local/ssl
         to:
       SSLDIR=/usr/share/ssl

       SSLINCLUDE=$(SSLDIR)/include
         to:
       SSLINCLUDE=/usr/include

       SSLLIB=$(SSLDIR)/lib
         to:
       SSLLIB=/usr/lib

Presuming you have OpenSSL installed, then your key directories likely don't
match the Makefile defaults.
                                         Michael Russell
                                         russell at mtifilm.com
                                         MTI Film, LLC
                                         Providence, RI  02906  USA

                                         Tel: (401) 831-1315

위로

1)  tcprules /etc/tcp.smtp.cdb /etc/tcp.smtp.tmp

1번으로 안될 경우 2번으로 (*폴더에 들어가서 실행하기)

2)  tcprules tcp.smtp tcp.smtp.cdb < tcp.smtp


위로


** QMAIL, vpopmail, qmailadmin 의 장점.

  . 한개의 서버, 한개의 IP 에서 무한정(?)의 도메인, pop 메일 서비스를 해 줄수 있다.
  . 한개의 uid,gid 로 모든 버츄얼 도메인, pop 계정을 관리 하므로 불필요한 유저 생성을 피할수 있다.
  . 각 도메인의 postmaster 는 웹 인터페이스로 pop 메일 유저 설정을 직접 할수 있다.
  . 각 도메인마다 메일 계정, 메일링 리스트의 한계를 설정 할 수 있다.
  . 유저 별로 quota 설정이 가능하다.

  vpopmail 은 데이타베이스(MySQL, Oracle, Sybase)를 이용한 사용자 관리,
  smtp 사용자들의 로밍 서비스 (고정 IP를 가지고 있지 않은 사용자에게 smtp 릴레이를 허용해주는)를 해줄 있다.

  * qmailadmin 은 vpopmail의 웹 인터페이스로 POP 사용자 관리를 브라우저를 통해 편하게 할 수 있도록 해준다.
  * qmailadmin 을 설치하려면 autoresponder 와 ezmlm 도 설치한다.
  * ezmlm 은 qmail 하에서 돌아가는 강력한 메일링 리스트로서 http://www.ezmlm.org/에서 ezmlm 과 ezmlm-idx 를 받는다.

## Qmail 설치.
  1. ucspi-tcp 설치하기
  tar -xvzf ucspi-tcp-0.88.tar.gz
  cd ucspi-tcp-0.88
  patch -p1 < /패치파일경로/ucspi-tcp-0.88.errno.patch.txt
  make
  make setup check
  2. daemontools 설치하기
  mkdir -p /package
  chmod 1755 /package
  cp daemontools-0.76.tar.gz /package
  cd /package
  tar -xvzf daemontools-0.76.tar.gz
  cd admin/daemontools-0.76
  patch -p1 < /패치파일경로/daemontools-0.76.errno.patch
  package/install
 
  3. qmail 설치하기
  mkdir /var/qmail
  tar -xvzf qmail-1.03.tar.gz
  vi qmailuser.txt
  groupadd nofiles
  useradd -g nofiles -d /var/qmail/alias alias
  useradd -g nofiles -d /var/qmail qmaild
  useradd -g nofiles -d /var/qmail qmaill
  useradd -g nofiles -d /var/qmail qmailp
  groupadd qmail
  useradd -g qmail -d /var/qmail qmailq
  useradd -g qmail -d /var/qmail qmailr
  useradd -g qmail -d /var/qmail qmails
  chmod 755 qmailuser.txt
  ./qmailuser.txt
  tar -xvzf qmail-ej-cocktail-14.tar.gz
  cp qmail-ej-cocktail-14/cocktail.patch ./qmail-1.03
  cd qmail-1.03
  patch -p1 < cocktail.patch
  vi conf-spawn (1000을 509로)
  make
  make setup check
  ./config-fast 도메인이름
 
  ** qmail 컴파일은 openssl 버전이 openssl-0.9.7b이하에서만 정상적으로 컴파일 된다.
    그러므로 qmail을 컴파일시 openssl 버전을 낮추고 컴파일 한후, 다시 버전을 올린다.
  ** openssl 소스 설치법.
     . tar xvfz openssl-0.9.7d.tar.gz
     . cd openssl-0.9.7d
     . ./config --prefix=/usr/local --openssldir=/usr/local/openssl
     . make
     . make test
     . make install
 
  4. qmail 시작 종료 스크립트를 작성한다.
 
  vi /var/qmail/rc
  ---------------------------------------------
  #!/bin/sh
  exec env - PATH="/var/qmail/bin:$PATH" \
  qmail-start ./Maildir/
  ---------------------------------------------
  chmod 755 /var/qmail/rc
  mkdir -p /var/qmail/supervise/qmail-send/log
  mkdir -p /var/qmail/supervise/qmail-smtpd/log
  chmod +t /var/qmail/supervise/qmail-send
  chmod +t /var/qmail/supervise/qmail-smtpd
  vi /var/qmail/supervise/qmail-send/run
  ----------------------
  #!/bin/sh
  exec /var/qmail/rc
  ----------------------
  vi /var/qmail/supervise/qmail-send/log/run
  -----------------------------------------
  #!/bin/sh
  exec /usr/local/bin/setuidgid qmaill \
  /usr/local/bin/multilog t /var/log/qmail
  -----------------------------------------
  vi /var/qmail/supervise/qmail-smtpd/run
  ----------------------------------------------------------
  #!/bin/sh
  Q_UID=`id -u vpopmail`
  Q_GID=`id -g vpopmail`
  exec /usr/local/bin/softlimit -m 7000000 \
  /usr/local/bin/tcpserver -vRHl 0 \
  -x /home/vpopmail/etc/tcp.smtp.cdb \
  -u $Q_UID -g $Q_GID 0 25 /var/qmail/bin/qmail-smtpd 2>&1
  ----------------------------------------------------------
  vi /var/qmail/supervise/qmail-smtpd/log/run
  -------------------------------------------------
  #!/bin/sh
  exec /usr/local/bin/setuidgid qmaill \
  /usr/local/bin/multilog t /var/log/qmail/smtpd
  -------------------------------------------------
  chmod 755 /var/qmail/supervise/qmail-send/run
  chmod 755 /var/qmail/supervise/qmail-send/log/run
  chmod 755 /var/qmail/supervise/qmail-smtpd/run
  chmod 755 /var/qmail/supervise/qmail-smtpd/log/run
  mkdir -p /var/log/qmail/smtpd
  chown qmaill /var/log/qmail /var/log/qmail/smtpd
  vi /etc/tcp.smtp
  ------------------------------------
  127.0.0.1:allow,RELAYCLIENT=""
  서버아이피:allow,RELAYCLIENT=""
  ------------------------------------
  tcprules /etc/tcp.smtp.cdb /etc/tcp.smtp.tmp < /etc/tcp.smtp
  echo root > /var/qmail/alias/.qmail-root
  echo root > /var/qmail/alias/.qmail-postmaster
  echo root > /var/qmail/alias/.qmail-mailer-daemon
  cd /var/qmail/alias/
  chmod 644 .qmail-root .qmail-postmaster .qmail-mailer-daemon

  vi /etc/rc.d/init.d/qmail
  ----------------------------------------------------------------------------------
  #!/bin/sh
  # For Red Hat chkconfig
  # chkconfig: - 80 30
  # description: the qmail MTA
  PATH=/var/qmail/bin:/bin:/usr/bin:/usr/local/bin:/usr/local/sbin
  export PATH
  case "$1" in
  start)
     echo "Starting qmail"
  if [ -e /service/qmail-send ] ; then
  if svok /service/qmail-send ; then
    svc -u /service/qmail-send
  else
    echo qmail-send supervise not running
  fi
  else
  ln -s /var/qmail/supervise/qmail-send /service/
  fi
  if [ -e /service/qmail-smtpd ] ; then
  if svok /service/qmail-smtpd ; then
    svc -u /service/qmail-smtpd
  else
    echo qmail-smtpd supervise not running
  fi
  else
  ln -s /var/qmail/supervise/qmail-smtpd /service/
  fi
 
     if [ -d /var/lock/subsys ]; then
       touch /var/lock/subsys/qmail
     fi
     ;;
  stop)
     echo "Stopping qmail..."
     echo "  qmail-smtpd"
     svc -dx /service/qmail-smtpd /service/qmail-smtpd/log
  rm -f /service/qmail-smtpd
     echo "  qmail-send"
     svc -dx /service/qmail-send /service/qmail-send/log
  rm -f /service/qmail-send
     if [ -f /var/lock/subsys/qmail ]; then
       rm /var/lock/subsys/qmail
     fi
     ;;
  stat)
     svstat /service/qmail-send
     svstat /service/qmail-send/log
     svstat /service/qmail-smtpd
     svstat /service/qmail-smtpd/log
     qmail-qstat
     ;;
  doqueue|alrm|flush)
     echo "Flushing timeout table and sending ALRM signal to qmail-send."
     /var/qmail/bin/qmail-tcpok
     svc -a /service/qmail-send
     ;;
  queue)
     qmail-qstat
     qmail-qread
     ;;
  reload|hup)
     echo "Sending HUP signal to qmail-send."
     svc -h /service/qmail-send
     ;;
  pause)
     echo "Pausing qmail-send"
     svc -p /service/qmail-send
     echo "Pausing qmail-smtpd"
     svc -p /service/qmail-smtpd
     ;;
  cont)
     echo "Continuing qmail-send"
     svc -c /service/qmail-send
     echo "Continuing qmail-smtpd"
     svc -c /service/qmail-smtpd
     ;;
  restart)
     echo "Restarting qmail:"
     echo "* Stopping qmail-smtpd."
     svc -d /service/qmail-smtpd
     echo "* Sending qmail-send SIGTERM and restarting."
     svc -t /service/qmail-send
     echo "* Restarting qmail-smtpd."
     svc -u /service/qmail-smtpd
     ;;
  cdb)
     tcprules /etc/tcp.smtp.cdb /etc/tcp.smtp.tmp < /etc/tcp.smtp
     chmod 644 /etc/tcp.smtp.cdb
     echo "Reloaded /etc/tcp.smtp."
     ;;
  help)
     cat <<HELP
    stop -- stops mail service (smtp connections refused, nothing goes out)
  start -- starts mail service (smtp connection accepted, mail can go out)
  pause -- temporarily stops mail service (connections accepted, nothing leaves)
    cont -- continues paused mail service
    stat -- displays status of mail service
     cdb -- rebuild the tcpserver cdb file for smtp
  restart -- stops and restarts smtp, sends qmail-send a TERM & restarts it
  doqueue -- schedules queued messages for immediate delivery
  reload -- sends qmail-send HUP, rereading locals and virtualdomains
  queue -- shows status of queue
    alrm -- same as doqueue
  flush -- same as doqueue
     hup -- same as reload
  HELP
     ;;
  *)
     echo "Usage: $0 {start|stop|restart|doqueue|flush|reload|stat|pause|cont|cdb|queue|help}"
     exit 1
     ;;
  esac
  exit 0
  ------------------------------------------------------------------------------------------------------
  chmod 755 /etc/rc.d/init.d/qmail
  ** service qmail start 를 실행하여 프로세스 및 포트를 정상적으로 BIND 하면 정상.

## vpopmail with mysql 연동 설치.
  - vpopmail 유저와 그룹을 생성한다.
  groupadd -g 89 vchkpw
  useradd -g vchkpw -u 89 vpopmail
 
  mkdir ~vpopmail/etc
  chown vpopmail.vchkpw ~vpopmail -R
  echo "localhost|0|vpopmailuser|vpoppasswd|vpopmail" > ~vpopmail/etc/vpopmail.mysql
  chown vpopmail.vchkpw ~vpopmail/etc/vpopmail.mysql
  chmod 640 ~vpopmail/etc/vpopmail.mysql
 
  - mysql root 접속후 아래 디비생성및 접근권한을 설정한다.

  CREATE DATABASE vpopmail;
  GRANT select,insert,update,delete,create,drop ON vpopmail.* TO vpopmailuser@localhost IDENTIFIED BY 'vpoppasswd';
  quit;
 
  tar xvfz vpopmail-5.4.17.tar.gz
 
  ./configure --enable-roaming-users --enable-tcprules-prog=/usr/local/bin/tcprules
  --enable-tcpserver-file=/etc/tcp.smtp --enable-relay-clear-minutes=15 --enable-logging=p
  --disable-ip-alias-domains --disable-passwd --enable-clear-passwd --enable-auth-module=mysql
  --enable-many-domains=y --enable-valias=y --enable-mysql-limits=y --enable-auth-module=mysql
  --enable-incdir=/usr/local/mysql/include/mysql --enable-libdir=/usr/local/mysql/lib/mysql
  --enable-domain-quotas=y
  --------------------------  설명 ----------------------------
  // roaming 옵션 목록
  --enable-roaming-users \          :enable roaming users functionality
  --enable-tcprules-prog=path \    :defaults to /usr/local/bin/tcprules
  --enable-tcpserver-file=path \    :defaults to /home/vpopmail/etc/tcp.smtp
  --enable-relay-clear-minutes=15  :defaults to 180
  //mysql 옵션 목록
  --enable-auth-module=mysql                     :mysql 사용하겠다
  --enable-incdir=/usr/local/mysql/include... :include 경로
  --enable-libdir=/usr/local/mysql/lib....       :lib 경로
  --enable-many-domains   :도메인별로 테이블을 생성관리 할것이라면 --enable-many-domains=n 옵션을 사용한다.
  --enable-mysql-limits      :mysql을 이용한 쿼터 설정
  --enable-logging=y : 모든 pop 로그인 기록과 오류 메시지를 남긴다.
  --enable-logging=n : 아무런 로그도 남기지 않는다.
  --enable-logging=e : 오류/ 치명적인 오류 메세지를 기록한다.
  --enable-logging=p : 오류 로그에 암호를 포함한다.
  --enable-logging=v : --enable-logging=y 와 같으며 사용자 암호를 로그에 포함한다.

  --enable-default-domain :주서버의 메일 계정도 모두 가상 도메인의 메일 계정과 동일하게 관리 할수 있다.
  --enable-domain-quotas: 도메인별 쿼터 설정 (--enable-mysql-limits 옵션과 같이 사용)
  --enable-many-domains : 도메인별로 테이블을 생성한다는 옵션
  --enable-mysql-limits : 쿼터 설정데 대한 세부 옵션 (README.vlimit 파일 참고)
  --------------------------  설명 ----------------------------
 
  make
  make install-strip
 
  ** /home/vpopmail 안에..디렉토리와 여러 파일들이 생성확인.
 
  . ln -s /usr/local/mysql/lib/mysql/libmysqlclient.so.12 /usr/lib/
  . /home/vpopmail/bin/clearopensmtp
  - 주기적으로 smtp허용 IP를 갱신해주도록 cron에 등록.
 
  . crontab -e
  . 40 * * * *  /home/vpopmail/bin/clearopenstmp
 
  - qmail smtp 수정
  . vi /var/qmail/supervise/qmail-smtpd/run
  ---------------------------------------------------------------------------
  #!/bin/sh
  Q_UID=`id -u vpopmail`
  Q_GID=`id -g vpopmail`
  exec /usr/local/bin/softlimit -m 7340032 \
        /usr/local/bin/tcpserver -vRHl 0 -x /home/vpopmail/etc/tcp.smtp.cdb \
        -u $Q_UID -g $Q_GID 0 25 /var/qmail/bin/qmail-smtpd 2>&1
  ---------------------------------------------------------------------------
  ※이 run파일은 나중에 smtp auth설정에서 한번 더 바뀌게 됩니다.
  - pop3시동 파일 작성
  . mkdir /var/qmail/supervise/vpop
  . vi /var/qmail/supervice/vpop/run
  ---------------------------------------------------------------------------
  #!/bin/sh
  VPOP_UID=`id -u vpopmail`
  VPOP_GID=`id -g vpopmail`
  exec /usr/local/bin/softlimit -m 6000000 \
        tcpserver -vRHl 0 -u $VPOP_UID -g $VPOP_GID 0 110 \
        /var/qmail/bin/qmail-popup ecstore.co.kr \
        /home/vpopmail/bin/vchkpw /var/qmail/bin/qmail-pop3d Maildir 2>&1
  ---------------------------------------------------------------------------
 
  . chmod a+x /var/qmail/supervise/vpop/run
 
  - Sendmail 데몬 중지 및 옮겨 놓는다.
 
  . /etc/init.d/sendmail stop
  . mv /usr/lib/sendmail /usr/lib/sendmail.org
  . mv /usr/sbin/sendmail /usr/sbin/sendmail.org
  . ln -s /var/qmail/bin/sendmail /usr/lib
  . ln -s /var/qmail/bin/sendmail /usr/sbin
  - 서비스 시작하기
 
  - qmail 데몬 시작 - daemontool이 자동으로 데몬을 시작한다.
  . ln -s /var/qmail/supervise/qmail-send /service/
  . ln -s /var/qmail/supervise/qmail-smtpd /service/
 
  - vpopmail 데몬 시작 - daemontool이 자동으로 데몬을 시작한다.
  . ln -s /var/qmail/supervise/vpop /service
  ** ps -aux 명령으로 해당 데몬이 정상적으로 떠 있는지 확인한다.
      
  ## qmailadmin 과 smtp auth 설정.
 
  - vpopmail을 웹에서 관리하는 도구.
 
  - ezmlm 설치
  . wget http://sylvestre.ledru.info/howto/qmail ··· 0.tar.gz
  . wget http://cr.yp.to/software/ezmlm-0.53.tar.gz
  . wget http://www.qmail.org/moni.csi.hu/pub/gl ··· 41.patch
 
  . tar -zxvf ezmlm-0.53.tar.gz
  . tar -zxvf ezmlm-idx-0.40.tar.gz
  . mv ezmlm-idx-0.40/* ezmlm-0.53/
  . cd ezmlm-0.53
  . patch < idx.patch
  . patch < ../ezmlm-idx-0.53.400.unified_41.patch
 
  . make 
  . make man
  . make setup
 
  - autorespond 설치
  . wget http://www.inter7.com/devel/autorespond-2.0.2.tar.gz
 
  . tar xvfz autorespond-2.0.2.tar.gz
  . cd autorespond-2.0.2
  . vi Makefile
  . INSTALL_DIR = /usr/bin 로 변경
  . make
  . make install
 
  - qmailadmin 설치
  . tar xvfz qmailadmin-1.2.9.tar.gz
  . cd qmailadmin-1.2.9
  .  ./configure --enable-htmldir=/usr/local/apache/htdocs --enable-cgibindir=/usr/local/apache/cgi-bin
     --enable-autoresponder-bin=/usr/bin --enable-vpopuser=vpopmail
     --enable-ezmlmdir=/usr/local/bin/ezmlm/
     --enable-ezmlmidx=y --enable-modify-quota --disable-ipauth --enable-help
     --enable-domain-autofill=y
  . make
  . make install-strip
 
  ** 이미지 경로는 도메인의 홈디렉토리임.
      기본적으로 설치후에 이미지 경로는 /usr/local/apache/htdoc 안에 images에 생성된다.
  - smtp_auth
   
  . vi /var/qmail/supervise/qmail-smtpd/run
  -----------------------------------------------------------------------------------------
  #!/bin/sh
  Q_UID=`id -u vpopmail`
  Q_GID=`id -g vpopmail`
  exec /usr/local/bin/softlimit -m 7340032 \
  /usr/local/bin/tcpserver -vRHl 0 -x /home/vpopmail/etc/tcp.smtp.cdb \
  -u $Q_UID -g $Q_GID 0 25 /var/qmail/bin/qmail-smtpd ecstore.co.kr \
  /home/vpopmail/bin/vchkpw /bin/true 2>&1
  -----------------------------------------------------------------------------------------
  . /etc/rc.d/init.d/qmail restart
  ** 도메인 추가
  . /home/vpopmail/bin/vadddomain ecstore.co.kr
  . 비번입력.
 
  ## 스팸 & 바이러스 차단 툴 설치 - qmail-scanner / spamassassin
 
  - maildrop 설치
    . tar xvfz pcre-7.2.tar.gz
    . cd pcre-7.2
    . ./configure
    . make && make install
    . tar jxpf maildrop-2.0.4.tar.tar -C /backup/app_source/spam/  
       --mandir=/usr/share/man --enable-sendmail=/var/qmail/bin/sendmail
       --enable-maildrop-uid=root --enable-maildrop-gid=vchkpw --enable-maildirquota
       --enable-restrict-trusted=1 --enable-trusted-users='root qmaild vpopmail'
    . make install-strip
    . make install-man
  - HTML-Parser 설치.
    . tar xvfz HTML-Tagset-3.10.tar.gz
    . cd HTML-Tagset-3.10
    . perl Makefile.PL
    . make
    . make install

    . tar zxfp HTML-Parser-3.56.tar.tar -C /backup/app_source/spam
    . cd HTML-Parser-3.56
    . perl Makefile.PL
    . make
    . make test
    . make install
  -Time-HiRes 설치.
    . tar xvfz Time-HiRes-1.9707.tar.gz
    . cd Time-HiRes-1.9707
    . perl Makefile.PL
    . make
    . make test
    . make install
  - spamAssassin 설치
    . wget http://search.cpan.org/cpan/authors/id/ ··· 1.tar.gz
    . tar xvfz Digest-SHA1-2.11.tar.gz
    . cd Digest-SHA1-2.11
    . perl Makefile.PL
    . make && make install
    . tar xvfz Net-IP-1.25.tar.gz
    . cd Net-IP-1.25
    . perl MakeFile.PL
    . make
    . make install
   
    . tar xvfz Digest-HMAC-1.01.tar.gz
    . cd Digest-HMAC-1.01
    . perl MakeFile.PL
    . make && make install
    . tar xvfz Net-DNS-0.60.tar.gz
    . cd Net-DNS-0.60
    . perl MakeFile.PL
    . make && make install
    . tar xvfz Mail-SpamAssassin-3.2.1.tar.gz
    . cd Mail-SpamAssassin-3.2.1
    . perl MakeFile.PL
    . make
    . make test
    . make install  
 
  - qmail-scanner 설치
    . tar xvfz qmail-scanner-1.16.gz
    . cd qmail-scanner-1.16
    . cp -r locale/en_GB locale/eucKR
    . ./configure --debug no --lang "eucKR" --log-details syslog --unzip yes
    . ./configure --debug no --lang "eucKR" --log-details syslog --install
    . cp -f quarantine-attachments.txt /var/spool/qmailscan/
    . chown qmailq.qmail /var/spool/qmailscan/quarantine-attachments.txt
    . chmod 660 /var/spool/qmailscan/quarantine-attachments.txt
    . chown qmailq.qmail /var/qmail/bin/qmail-scanner-queue.pl
    . chmod 4755 /var/qmail/bin/qmail-scanner-queue.pl
    . /var/qmail/bin/qmail-scanner-queue.pl -g
    . echo 'export QMAILQUEUE="/var/qmail/bin/qmail-scanner-queue.pl"' >> /etc/profile
    . export QMAILQUEUE="/var/qmail/bin/qmail-scanner-queue.pl"
    . /etc/profile
    . . /etc/profile
    . /etc/rc.d/init.d/qmail restart

  ** 설치중에 모듈이 없으면 http://search.cpan.org/ 에서 perl 모듈을 검색해서 설치한다.


위로

▒ 강좌에 앞서..


본 문서자료는 본인 최광민에 의해 작성된것이며 자유롭게 수정 및 배포가 가능하나 상업적용도로 사용할수 없습니다. 또한 수정 및 배포시는 원작성자(본인)의 이름과 자료의 출처를 반드시 명시하여야 하며 위사항들의 위반으로 인해 발생되는 모든 법적책임은 배포자에게 있음을 알려 드립니다.

본 강좌는 커널 2.6 기반의 코어리눅스 배포판 천마 RPM 패키지를 기준으로 하였으며 아울러 본자료는 초급 리눅서들을 대상으로한 자료임으로 중급자 이상의 리눅서 혹은 구루(Guru)들의 태클은 사양하겠습니다. 다만 강좌에 보탬이 되는 리플이나 댓글등은 환영합니다.

수정요청 및 문의메일 : xfeel@xfeelis.pe.kr


2004. 11. 09. - Linuxer광민 -



▷ Sendmail 이란?


메일서버의 구성을 놓고 얘기하자면 센드메일 서버만으로 이루어 지는것이 아니다.

정확히 말해 센드메일서버는 보내는 메일서버 즉 메일을 받기위함이 아닌 보내기위한 서버 SMTP(Simple Mail Transfer Protocol) 서버를 얘기 하는것이다.

메일서버에 대한 이해가 잡혀있지 않는 상태에서는 센드메일 서버를 논하기가 어렵다.

일반적인 메일서버의 구성을 보자면 메일을 메일을 보내기위한 SMTP 서버와 반대로 메일을 받기위해 존재하는 POP3서버나 IMAP 서버로 나뉜다.

이중 센드메일은 SMTP 서버에 속하며 받는 메일서버의 경우 위에서 언급한대로 따로 구성된다.

물론 클라이언트(사용자) 입장에서 보면 이들은 하나로 뭉처진 동일한 시스템으로 인식될수 있다.


예를 들어 인터넷이 보급되면서 이제는 너무도 일반화된 웹메일 서비스(다음메일 혹은 핫메일등) 또한 이 메일서버의 구성을 기본으로 웹상에서 메일의 송수신을 제어할수 있도록 PHP나 ASP등의 서버기반 프로그램 언어를 통해 이루어지는 서비스이다.

웹 메일의 관점에서 보자면 사용자들은 별도의 설정없이 메일의 보내기와 받기 서비스를 동시에 마치 하나의 시스템 처럼  생각하며 이용할수 있지만 실제의 구성은 앞에서 언급한대로 각각의 나누어진 서비스 들이다.


자 이제부터 센드메일 관련된 파일들을 알아보고 하나하나 세팅해나가 보자.


▶  센드메일 서버 주요 설정파일과 관련 파일 및 디렉토리의 쓰임세

/var/spool/mqueue                ------------------ ①
/var/spool/mail                      ------------------ ②
/etc/mail/access                   ------------------ ③
/etc/aliases                          ------------------ ④
/etc/mail/local-host-names    ------------------ ⑤

/etc/mail/sendmail.mc            ------------------ ⑥
/etc/mail/sendmail.cf             ------------------ ⑦
/etc/mail/virtusertable            ------------------ ⑧



mqueue 는 사용자가 메일을 보낼때 사용하는 SMTP 서버에서 메일을 발송하기전 임시적으로 사용자의 메일을 보관하는 곳이다.

mail은 다른사용자에 의해 전송된 메일이 내 내 SMTP 서버에 임시적으로 저장되는곳이며 POP3 서버에 의해 메일이 전달될때까지 보관하게 된다. 즉 어떻게 보면 SMTP서버는 우체통과 우체부의 역활을 모두 수행하면서 한편으로는 POP3라는 메일 전달자가 메일을 가져가기 전까지의 우편함의 역활도 수행하게 되는것이다.

access 파일은 SMTP 서버의 이용을 제한하는 설정파일로서 다음과 같은 설정형식을 보인다.

# Check the /usr/share/doc/sendmail/README.cf file for a description
# of the format of this file. (search for access_db in that file)
# The /usr/share/doc/sendmail/README.cf is part of the sendmail-doc
# package.
#
# by default we allow relaying from localhost...

localhost.localdomain           RELAY
localhost                             RELAY
127.0.0.1                              RELAY
mail.xfeelis.pe.kr                  RELAY
xfeelis.pe.kr                        RELAY
xfeel@xfeelis.pe.kr               RELAY
211.188.120.198                    RELAY
211.188.120.0                       RELAY

spam.pe.kr                         REJECT

admin@spam.pe.kr             REJECT
spamer@spam.pe.kr            DISCARD
xfeel@spam.pe.kr                OK


- 보기에서와 같이 RELAY 설정한 부분들은 메일의 수발신을 허용하는 설정이다. 다만 access 파일에서의 RELAY 설정은 우선순위를 정하자면 2순위로 생각해야 한다.


그 이유를 설명하자면 뒤에서 다시 언급할 부분인 sendmail.mc 파일과 sendmail.cf 파일의 설정 내역에 따라 외부 네트워크에서의 접근 즉 내부가 아닌 외부에서 smtp를 이용하고자 자신의 메일계정이나 IP를 RELAY 해두었다고 해도 인증 및 제한에 걸려 접근거부 처리가 되는 경우가 있다.


그 이유는 레드헷 계열 7.1 이상의 배포 버전에 설치된 센드메일의 경우 기본적인 설정이 localhost 127.0.0.1 즉 로컬 네트워크나 로컬서버를 통한 메일의 발신을 제외하고 모두 거부하도록 정하고 있다.

이유는 샌드메일서버가 외부 스패머에 의해 스팸메일이 뿌려지는 경유지가 되는것을 막고자 하는 스팸 거부/보안정책 때문이다.


이 제한을 풀어주기 위해서는 다음과 같이 sendmail.mc 파일의 'DAEMON_OPTIONS' 부분을 수정하거나 해당 지시자 자체를 삭제하여야 한다.


[root@xfeelis /]# vi /etc/mail/sendmail.mc

...

DAEMON_OPTIONS(`Port=smtp,Addr=127.0.0.1, Name=MTA')

...


센드메일의 설치 버전에 따라 약간의 기본 설정값이 다를수 있으나 레드헷 배포판에 포함되어 있는 샌드메일의 경우 위지시자 자체를 삭제하거나 Addr 부분의 IP를 0.0.0.0 으로 수정해주면 된다. 단 절대 #처리는 하지말라. 서버관리자 그룹 슈퍼유저코리아 센드메일 관련 문서를 보면 주석 #처리시 오류가 날수 있음을 알리고 삭제나 변경을 권장하고 있다.


이유는 sendmail.mc 파일의 경우 주석구문 앞에 dnl을 같이 표기하도록 하고 있지만 위의 옵션의 경우 기본값이 활성화인 이유로 행의 첫부분에 dnl 처리가 되지 않아있다. 그렇기에 해당 사항을 잘 모르는 관리자의 경우 그냥 주석처리만 해버리고 설정오류를 찾지못해 애를 먹는 경우가 있다.


이제 본 강좌에서 다루고 있는 Kore 리눅스 배포판에 설치된 센드메일의 sendmail.mc 파일의경우를 보자. 다음과 같은 기본값을 가지고 있을것이다.


DAEMON_OPTIONS(`Port=smtp,Addr=0.0.0.0, Name=MTA')dnl


이미 기본 설정값이 Addr 부분을 변경해주고 있음으로 당연히 뒷부분의 dnl 부분만 삭제해주면 되는것이다. 역시 릴리즈 버전인 국내 배포판이 좋기는 좋다. 알아서 이런 부분들을 염두해두어 수정해 주고있으니... >_<


자 이제 다시 access 파일의 설정으로 돌아가보자 자세한 sendmail.mc 파일의 설정에 관해서는 뒤에서 다시 다룰것이니 조급해 하지말자 ㅡㅡa


RELAY 설정에 해당하는 값은 위에서 보는바와 같이 해당 도메인, 해당 이메일, 해당 IP, 해당 네트워크 등으로 허용할수 있다. 위의 설정을 참조하여 자신만의 릴레이 설정을 해보도록 하자.


다음은 REJECT 설정이다. REJECT 설정은 RELAY 설정과 반대로 수/발신 거부 설정이다.

이역시 해당 도메인, 해당 이메일, 해당 IP, 해당 네트워크등으로 나누어 설정할수 있다.


다음은 DISCARD 설정이다. 이는 스팸에일을 받되 받은후 POP3 서버가 메일을 가져가지 않도록 바로 폐기해 버리며 메일을 발신한 스패머에게는 폐기통보를 하지않는다 즉 스패머는 메일이 정상적으로 발신된줄 알것이다.. 바보처럼... ㅡ_ㅡ;


다음 설정은 OK 값이다. OK는 특정 도메인 또는 특정 IP나 네트워크 그룹이 REJECT 처리 되어있다고 하더라고 지정한 이메일주소나 IP등에 관계된 메일은 예외적으로 허용처리를 한다는 뜻이다.


예를 들면 이런경우가 있다. 만약 필자가 악명높은 스패머라고 치자. ㅡㅡ;;

필자는 관련 스패머 그룹에서 관련 스팸기법등을 공유할것이다. 어떤 새로운 스패머가 필자의 스팸기법에 관련한 메일링 리스트에 가입하여 필자의 이메일을 받기위해서는 스패머 그룹의 도메인 자체는 거부되어 있겠지만 필자의 이메일 만은 예외로 처리해야 할것이다.

이럴때 쓰는것이 OK 설정 값이다.

물론 OK 설정값을 다른 용도로 활용할수도 있지만 통상적으로 예외처리에 관련된 설정을 주고자 할때 쓰이게 되는것이다.


aliases 파일은 말그대로 별칭 설정파일이다. 즉 root 에게로 온 메일을 다른 사용자 계정으로 돌리고 싶다던가 할때 쓰는 것이다.

이 기법을 잘 이용하면 소규모의 메일링 리스트도 운용할수 있다.

자 그 기법을 한번 둘러보자.


[root@xfeelis /]# vi /etc/aliases

...

# Basic system aliases -- these MUST be present.
mailer-daemon:  postmaster
postmaster:       root

root:                 xfeel

...


위 설정을 살펴 보자. 위 설정은 mailer-daemon 이라는 계정 즉 sendmail 데몬의 제어를 위해 만들어진 mailer-daemon 계정으로 오는 관련 로그메일을 최종적으로 xfeel 계정 사용자에게 보내주고 있는것이다.


즉 mailer-daemon 은 postmaster 로 별칭 설정 되었으며 다시 postmaster 는 root 로 또 다시 root 는 xfeel 사용자에게 별칭 설정 되어진것이다.


기본적인 설정값에 의한다면  root: xfeel 의 설정은 없기 때문에 sendmail 에 관련된 로그 메일은 root 계정으로 보내어 지겠지만 필자는 이를 다시 xfeel 계정으로 돌려주고 있는것이다.


뭐 굳이 이렇게 까지 설정할 필요가 있느냐고 반문하는 독자가 있다면 뭐라 할말은 없지만 보안적인 요소를 위해 필자는 이렇게 조치하고 있다.


메일을 확인하기 위해서라면 서버에 직접 원격접속 혹은 콘솔상에서 확인하지 않는이상 대부분의 사용자가 Outlook Express 등을 이용할것이다.


만약 root로 보내어진 메일을 Outlook Express등의 메일 확인 프로그램에서 보고자 한다면 해당 프로그램에 root 계정의 패스워드를 사용해야 할것이다.


일반적으로 root 패스워드의 경우 사전상의 단어나 연속적인 숫자등으로 이루어진 패스워드를 사용하지 않는것이 원칙이기에 매우 길고 복잡하게 설정되는것이 일반적이다.


때문에 대부분의 사용자의 경우 계정과 패스워드를 아웃룩에 저장하여 바로 사용하는 경우가 많다. 그럼 root 패스워드를 Outlook Express 따위의 프로그램에 저장하여 사용할것인가?


만약 이런 발상을 하고있는 리눅서가 있다면 당장에 버려라...


보안에 매우 취약하다.


Outlook Express 프로그램은 MS 에서도 인정한 보안 취약점을 가지고 있는 매우 귀여운 놈이다.. ㅡ_ㅡ


만약 크래커가 독자들이 사용하는 윈도우PC를 크래킹 하여 Outlook Express 에 저장된 root 계정의 패스워드를 습득한다면?


혹은 독자들이 사용하는 그밖에 메일확인 프로그램을 크랙킹하여 root 패스워드를 습득한다면?


생각하기 싫다.. 더설명할 이유가 없을것이라고 보며 다음으로 넘어가자 ㅡㅡa



자 이제 소규모 메일링 리스트 운용에 대해서 다뤄 보자.


독자들이 운영하는 리눅스 서버에 다음과 같은 계정들이 생성되어 있다고 가정해 보자.


[root@xfeelis /]# vi /etc/passwd

root

admin

adminuser1

adminuser2

adminuser3

user1

user2

user3


만약 메일을 보내고자 하는사람이 support@xfeelis.pe.kr 에 메일을 보낼때 각각 admin, amdinuser1,2,3 계정에 모두 메일이 가도록 설정하고 싶다면 어떻게 해야 할것인가?


물론 보는것과 같이 support 란 계정은 따로 생성되어 있지 않은 상황이다. (뭐 생성되어 있다고 해도 결과에는 차이가 없으나.. 일단 그렇다고 가정하자)


별칭기능을 활용한 소규모 메일링 리스트 기법이 이것이다.


[root@xfeelis /]# vi /etc/aliases

...

# Person who should get root's mail

support:              admin,adminuser1,adminuser2,adminuser3

...


어떤가 대단하지 않은가? 이렇게 간단한 설정으로 메일 그룹을 지정하고 운용할수 있다니..

잘활용하면 여러모로 쓰임세가 많다. 연구해 보자.


local-host-names 파일은 메일의 최종 수신지를 지정하는 곳이다. 즉 쉽게 얘기하자면 이런경우가 있다. 독자들의 샌드메일 서버를 거처가는 메일중 최종 수신지가 독자들의 서버인 메일이 서버에 저장되기 위해서 독자들의 도메인 목록을 등록하는것이다. 만약 독자들이 웹호스팅 을 위한 서버를 운영하고 있다고 가정하면 독자 자신의 도메인 뿐만 아니라 고객의 도메인까지 등록해두어야 메일이 정상적으로 전달되는 것이다.


설정은 다음과 같다.


[root@xfeelis /]# vi /etc/mail/local-host-names

# local-host-names - include all aliases for your machine here.
xfeelis.pe.kr
xfeelis.co.kr

xfeelis.or.kr

userdomain.pe.kr

userdomain.co.kr


그냥 위와 같이 도메인만 설정해 주면 된다.


sendmail.mc 파일은 샌드메일 서버의 주요 설정파일중 하나이며 /etc/mail/sendmail.mc 파일을 바탕으로 M4 유틸을 이용하여 /etc/mail/sendmail.cf 파일을 생성하게 된다.


sedmail.mc 파일중 가장 중요한 지시자는 역시 앞부분에서 언급한 외부네트워크에 대한 smtp 이용 제한을 풀어주는 부분과 지금부터 다뤄가고자 하는 SMTP 인증에 관한 부분이다.


앞에 access 부분에서 잠시 거론한대로 외부네트워크에 대한 smtp 이용을 풀어주었다면 샌드메일 서버가 가지고 있는 취약점을 이용하여 스팸메일의 경유지 혹은 스팸서버가 될수 있는 가능성이 존재하는것이다.


이부분을 그냥 넘겨버린다면 심각한 상황이 초래된다. 스팸메일에 의해 샌드메일서버는 과부하가 걸려 시스템의 자원을 모두 고갈시킬것이며 그것마저 다된다면 메일서버는 다운되고 말것이다.


이런것을 막기위한 방법중 하나가 바로 앞에서 언급한 access 파일 운영정책과 지금부터 거론할 SMTP 인증에 대한 부분이다.


사용자가 smtp 서버를 이용하여 외부 네트워크로 메일을 발신하고자 할때 인증절차를 거처서 이용하도록 하는것이다.


실제로 대부분의 메일 호스팅이나 웹호스팅 제공하는 업체에서 이 SMTP 인증 기법을 사용하며 해당 사용자들에게 Outlook Express 등의 메일 송수신 프로그램 옵션에서 SMTP 인증부분을 체크 할것을 공지하고 있다.


그럼 SMTP 인증부분을 활성화 해보자.


[root@xfeelis /]# vi /etc/mail/sendmail.mc

...

define(`confAUTH_OPTIONS', `A')dnl

...

define(`confAUTH_MECHANISMS', `EXTERNAL GSSAPI DIGEST-MD5 CRAM-MD5 LOGIN PLAIN')dnl <- dnl 부분 삭제

...

...


위 설정에서 define(`confAUTH_OPTIONS', `A') 부분은 dnl 처리를 해줘야 하며 define(`confAUTH_MECHANISMS' 부분은 맨뒤에 dnl을 삭제해야 SMTP 인증기능이 활성화 된다.


위와 같이 설정해 주었다면 이제 다음과 같이 m4 유틸명령어를 사용하여 sendmail.cf 파일을 생성해 보자.


[root@xfeelis /]# m4 /etc/mail/sendmail.mc > /etc/mail/sendmail.cf


sendmail.cf은 전자에 sendmail.mc 파일을 통하여 생성된 세부 설정파일 정도로 이해하면 될것이다.


sendmail.cf 파일에서 눈여겨 봐야할 지시자들은 다음과 같다.


FW 지시자 : FW 지시자는 메일의 최종수신지 설정파일에 경로를 지정하는 곳으로서 sendmail 8.9.x 버전까지는 sendmail.cw 의 값으로 되어있지만 8.10.x 이후 버전부터는 local-host-names 파일로 설정되어 있다. 독자들이 사용하는 배포판에 포함된 센드메일의 버전을 확인후 local-host-names 로 변경해주자.


# file containing names of hosts for which we receive email
Fw/etc/mail/local-host-names


MaxMessageSize : 첨부파일을 포함한 메일 메시지 최대크기 제한 설정 부분


# maximum message size
O MaxMessageSize=20000000


메일의 크기가 20M를 넘는다면 메일은 발신되지 못한다.


MinQueueAge : 임시보관 최소 시간 설정 부분

뒤에서 언급하게 될 Timeout 설정값 이전에 적용될 우선적인 옵션으로 발송에 실패한 메일이 다시 재발송을 시도하기까지의 대기 시간을 설정 한다.. 기본값은 30분이며 기본적으로 서버부하를 줄이기 위해 # 주석처리 되어있지만 필요로 한다면 사용하여도 무방하다.


# minimum time in queue before retry
O MinQueueAge=30m


LogLevel : sendmail 이 가동되면서 발생되는 로그의 기록에 관련한 레벨을 설정

# log level
O LogLevel=9


각종 TimeOut 값 : 센드메일 서버의 각종 Timeout 값을 설정.


# timeouts (many of these)
#O Timeout.initial=5m
O Timeout.connect=1m

- 사용자가 샌드메일 서버에 접속하여 작업하는 최대시간을 설정것으로 기본값은 1분이다.
#O Timeout.aconnect=0s
#O Timeout.iconnect=5m
#O Timeout.helo=5m
#O Timeout.mail=10m
#O Timeout.rcpt=1h
#O Timeout.datainit=5m
#O Timeout.datablock=1h
#O Timeout.datafinal=1h
#O Timeout.rset=5m
#O Timeout.quit=2m
#O Timeout.misc=2m
#O Timeout.command=1h
O Timeout.ident=0
#O Timeout.fileopen=60s
#O Timeout.control=2m
O Timeout.queuereturn=5d
- 특정한 사유로 인해 메일이 전달되지 못하고 mqueue 에보관되고 있을시 보관 기간을 지정하는것으로 기본값은 5일이다. 이기간을 넘길경우 메일은 자동적으로 최초 발신지로 되돌려져 반송처리가 된다.

#O Timeout.queuereturn.normal=5d
#O Timeout.queuereturn.urgent=2d
#O Timeout.queuereturn.non-urgent=7d
#O Timeout.queuereturn.dsn=5d
O Timeout.queuewarn=4h
- 역시 특정한 사유로 인해 메일이 전달되지 못할시 최초 발신자에게 메일이 전달되지 못하고 있음을 경고하는 경고메일이 발송 되기까지의 대기 시간을 지정하며 기본값은 4시간이다.

#O Timeout.queuewarn.normal=4h
#O Timeout.queuewarn.urgent=1h
#O Timeout.queuewarn.non-urgent=12h
#O Timeout.queuewarn.dsn=4h
#O Timeout.hoststatus=30m
#O Timeout.resolver.retrans=5s
#O Timeout.resolver.retrans.first=5s
#O Timeout.resolver.retrans.normal=5s
#O Timeout.resolver.retry=4
#O Timeout.resolver.retry.first=4
#O Timeout.resolver.retry.normal=4
#O Timeout.lhlo=2m
#O Timeout.auth=10m
#O Timeout.starttls=1h


기타 지시자들은 필자또한 사용하지 않으며 또 자세한 그 쓰임을 알고 있지 못하다. 좀더 자세한 사항은 sendmail.org 의 지시자 관련 문서를 참조바라며 실제로 위 3가지 정도의 옵션으로도 충분히 센드메일 서버에 운영에 있어 부하를 최소화 할수 있다.


virtusertable 파일은 가상메일 설정파일이라고 부르며 다음과 같은 상황에 사용된다.


만약 필자가 웹호스팅 서버를 운영하고 있다고 가정하자.

admin 이란 계정은 당연히 서버에 하나 밖에 존재 할수 없다.

하지만 필자의 서버에서 웹호스팅을 받고 있는 사용자들은 자신들의 도메인을 가지고 메일을 운영할때 실계정명은 user1 등이지만 admin@userdomain.pe.kr 이란 도메인으로 메일을 받고자 요청한다.


일반적인 생각이라면 admin 이란 계정은 단 하나만 존재하기 때문에 필자의 서버에 매칭된 도메인만이 admin@xfeelis.pe.kr 이란 메일을 사용할수 있다.


이를 해결하기 위한 파일이 바로 /etc/mail/virtusertable 파일인 것이다.


다음과 같이 /etc/mail/virtusertable 파일을 편집해 보자.


[root@xfeelis /]# vi /etc/mail/virtusertable

admin@xfeelis.pe.kr                xfeel

admin@userdomain1.pe.kr       user1

admin@userdomain2.pe.kr       user2

admin@userdomain3.pe.kr       user3

[root@xfeelis /]# makemap hash /etc/mail/virtusertable < /etc/mail/virtusertable


어떤까? 매우 쉽지 않은가? 알고 보면 매우 쉬우며 간단한 설정들이 이런 유용한 기능을 발휘하고 있다. 이것이 오픈소스 진영과 리눅스의 힘인것이다.


자 이제 모든 파일의 설정을 마쳤자. 이제 실제로 샌드메일의 가동여부를 테스트 해봐야 할것이다. 우선 샌드메일을 가동 시켜보자.


[root@xfeelis /]# /etc/rc.d/init.d/sendmail restart
Shutting down sendmail: [  OK  ]
Shutting down sm-client: [  OK  ]
Starting sendmail: [  OK  ]
Starting sm-client: [  OK  ]
[root@xfeelis /]#


이제 샌드메일이 정상적으로 가동하는지 확인해 봐야겠다.


[root@xfeelis /]# telnet 211.188.120.198 25
Trying 211.188.120.198...
Connected to 211.188.120.198.
Escape character is '^]'.
220 xfeelis.pe.kr ESMTP Sendmail 8.13.0/8.13.0; Tue, 9 Nov 2004 14:18:10 +0900
HELP  
214-2.0.0 This is sendmail version 8.13.0
214-2.0.0 Topics:
214-2.0.0       HELO    EHLO    MAIL    RCPT    DATA
214-2.0.0       RSET    NOOP    QUIT    HELP    VRFY
214-2.0.0       EXPN    VERB    ETRN    DSN     AUTH
214-2.0.0       STARTTLS
214-2.0.0 For more info use "HELP <topic>".
214-2.0.0 To report bugs in the implementation send email to
214-2.0.0      
sendmail-bugs@sendmail.org.
214-2.0.0 For local information send email to Postmaster at your site.
214 2.0.0 End of HELP info
QUIT
221 2.0.0 xfeelis.pe.kr closing connection
Connection closed by foreign host.
[root@xfeelis /]#


25번 포트 즉 SMTP 서버인 샌드메일 서버에 이상없이 접속하였음을 통해 샌드메일이 제대로 가동되고 있음을 확인할수 있다.



▒ 마치며...

이외에 몇몇의 지시자 혹은 응용부분이 더 있습니다만 운영상 큰 지장이 없으므로 생략하였으며 좀더 자세한 사항의 질문등은 메일을 통해 문의바라며 또한 위 내용들만 설정하셔도 메일서버는 무리없이 가동되는것을 실제 운영으로 확인 하였음을 알려드립니다.


필자 또한 아직은 한참을 탐구하고 연구하는 리눅서이며 부족함이 많은것이 사실이기에 강좌를 시작하면서 늘 고민되었던것이 있다면 역시 집필의 수준을 어디로 두어야 하는 것이였습니다.


너무 간단하게 주요 부분만 집고넘어간다면 처음 구축하시는 분들이 생소해 할것이며 또 너무 풀어서 하나 하나 집고 넘어가자니 그 막대한 분량과 함께 정작 실무위주의 기법을 보고자 하는 분들에겐 다소 거리감이 있을수 있기 때문입니다.


개인적으로는 인터넷상에 돌아다니는 하우투 문서에 대해 별로 좋지 않은 입장입니다.

물론 저 또한 리눅스를 처음 접했을 당시는 하우투 문서의 도움을 많이 봤었습니다.


개구리 올챙이적 생각 못한다는 격으로 좀 그렇게 보일수 있지만 하우투 문서의 폐해 또한 만만치 않다고 생각합니다.


이유는 처음 리눅스 시스템을 접하는 대다수의 리눅서들이 하우투 문서를  접하면서 그대로 설정만 따라했지 왜 그렇게 설정되어야 하는가에 대하여 생각을 해보지 않는다는 것입니다.


그 시스템의 구조를 이해하려 노력하고 어떠한 프로세스로 흘러가는지 파악을 하여야 왜 저런 설정이 필요하고 또 저런 운영이 되어야 하는지를 알게 되는데 말입니다...


그렇기 때문에 하우투 문서대로 따라하기식의 설정후 대부분의 리눅서들이 설치나 설정 에러메시지를 접하게 됩니다.


차라리 에러메시지를 접한후 왜 그런 에러가 나타나는지를 찾는 리눅서들은 나은 편입니다.


아얘 이유조차 찾지않고 바로 관련 커뮤니티에 하우투 문서대로 설정을 했는데 설치가 되지않는다 에러가 생긴다 식의 질문이다 답변요구 공세를 하기 시작합니다.


아마도 처음 그 하우투 문서를 작성한 사람은 그런 모습을 보려고 만든것은 아닐것 같다는 생각을 해봅니다.

진정한 리눅서는 스스로 탐구하고 질문을 던지며 답을 찾는 습관이 중요합니다. 여러분 또한 진정한 리눅서로 성장해 나갈것을 기대하며 이상으로 Sendmail을 이용한 메일서버에 대한 초급강좌를 마치겠습니다.



출처 :http://paper.cyworld.nate.com/paper/paper_item_read.asp?paper_id=1000032567&post_seq=100642&cpage=1&search_type=&search_keyword=


위로