DigiMoon 맘대로 닦고 조이고 기름치는 재미가 있는 DigiMoon만의 기억 저장소

Posted
Filed under 컴퓨터 탐구/리눅스
참고링크:
http://coffeenix.net/board_view.php?bd_code=123



 드디어 큐메일 설치에 성공해서 메뉴얼로 정리할 수 있게 되었네요.
 큐메일은 설치 방법이 무척이나 다양합니다. 처음 설치 도전하려는 사람들은 어떻게 시작해야될 지 막막하죠.
 가장 무난한 방법이 각종 메뉴얼에 자주 등장하는 버전이자 표준(?)과도 같이 되어 버린 qmail-1.03에 임은재님의 칵테일 패치를 적용하는 방법입니다.
 큐메일 설치 방법이 다양하게 존재하는 가장 큰 이유는 SMTP 인증 방식을 다양하게 지원하기 때문이 아닌가 싶습니다. vpopmail을 연동하여 시스템 계정과는 별도로 관리되는 메일 전용 계정들을 생성하여 관리할 수도 있고 checkpassword를 연동하면 시스템 계정과 동일하게(sendmail + saslauthd 조합과 비슷한 방식) 메일 계정을 관리할 수 있습니다. 게다가 이 2가지 방식 모두 메일 계정을 mysql db에 적재하여 관리하는 방법까지 지원합니다.

 나열하면 할수록 더 복잡해지기에... 개인적으로 무난하다고 생각되는 조합인 qmail + vpopmail (with mysql) 로 설치 메뉴얼을 작성해 보았습니다. 사실 큐메일 설치법이라고 하면 거의 대부분의 문서에서 vpopmail과 연동하는 것을 '표준'과도 같이 다루고 있는데 이 방식이 가장 각광을 받을 수 밖에 없는 이유가 qmailadmin과 함께 사용하면 웹상에서 간편하게 메일 계정을 관리할 수 있다는 장점 때문이죠.


qmail 소스를 받아 놓을 디렉토리 생성
cd /usr/local/src
mkdir qmail


ucspi-tcp를 설치합니다. 뭐하는 놈인지 궁금하다면 아래 링크 참고하시고...
http://ejlabs.net/txt/ucspi-tcp.html
cd qmail
wget http://cr.yp.to/ucspi-tcp/ucspi-tcp-0.88.tar.gz
tar xvfz ucspi-tcp-0.88.tar.gz
cd ucspi-tcp-0.88

gcc버전이 3.4.5 이므로 파일의 최상단에 #include <errno.h>를 추가
vi error.h
#include <errno.h>
#ifndef ERROR_H
#define ERROR_H
...
...
ucspi-tcp-0.88.errno.patch 등의 이름으로 배포되고 있는 패치가 많이 나도는데 결국 같은 겁니다.
굳이 패치를 따로 찾아 적용하는 수고를 덜 필요 없이 위와 같은 방법으로 gcc 상위 버전과의 충돌 문제가 해결 가능합니다.

이제 설치합니다.
make
make setup check


 다음으로 daemontools를 설치합니다. daemontools는 xinetd보다 진보된 수퍼데몬이라고 각종 메뉴얼에서 소개하고 있습니다. 자세한 정보는 아래 링크 참고...
http://ejlabs.net/txt/daemontools.html
 qmail의 실행 파일을 daemontools가 설치되는 /services 디렉토리에 링크를 걸어 두어 사용하는 방식을 취합니다. 그러면 daemontools가 알아서 프로세스를 감시하며 최적의 실행 상태를 유지해 줍니다. qmail이 느닷없이 죽으면 daemontools가 다시 살리기도 한다는군요.
wget http://cr.yp.to/daemontools/daemontools-0.76.tar.gz
mkdir /package
chmod 1755 /package
tar xfz daemontools-0.76.tar.gz -C /package
cd /package/admin/daemontools-0.76

gcc버전이 3.4.5라면 파일의 최상단에 #include <errno.h>를 추가합니다.
vi src/error.h
/* Public domain. */
#include <errno.h>
#ifndef ERROR_H
#define ERROR_H
...
...

설치합니다. package라는 서브디렉토리 안의 install 파일을 실행합니다.
package/install

설치되었으면 /command 디렉토리가 생성되며 안에 관련 파일들이 위치하게 됩니다.
레드햇 계열의 경우 /etc/inittab 파일 최하단부에 아래와 같은 행이 추가됩니다.
tail -n 1 /etc/inittab
SV:123456:respawn:/command/svscanboot

우분투 7.x 이상 버전부터는 /etc/inittab 파일이 사라지고 /etc/event.d 디렉토리 안에 런레벨 차원에서 구동할 프로그램들을 등록하게 되어 있습니다. 그래서 아래와 같이 작업해 줍니다.
vi /etc/event.d/svscanboot
# svscanboot
# start on runlevel 2

start on runlevel 3
start on runlevel 4
start on runlevel 5
stop on runlevel 0
stop on runlevel 1
stop on runlevel 6

respawn
exec /command/svscanboot

※ 참고 링크: http://fxp0.org.ua/2007/apr/21/svscanboot-and-upstart-ubuntu-feisty

 
 이제 qmail 1.0.3 설치 순서입니다.
 본 문서에서는 전통적인 방법(?)인 오리지날 qmail-1.03에 칵테일패치를 적용하는 방법을 쓰지 않고 knetqmail-1.06을 적용하는 방법을 설명합니다. 이 방법을 적용하려는 이유가 중요한데 칵테일 패치에는 chkuser 패치가 포함되어 있지 않기 때문입니다. qmail의 chkuser 패치는 메일서버에 존재하지 않는 메일 계정으로 메일이 도착할 경우 바로 반송처리하는 기능을 수행하는데 큐메일의 특성상 한 번 메일이 도착하게 되면 수신자 주소가 존재하지 않는 메일 계정일지라도 일단 받아 처리를 시도하게 되며 이렇게 될 경우 'double bounce' 현상을 초래하여 메일서버에 부하를 증가시켜 성능 저하를 유발하기 때문에 chkuser는 없어서는 안 될 아주 중요한 기능 중의 하나입니다. 특히 대다수 스패머들이 존재하지 않는 메일 계정으로 무작위 발송을 시도하기 때문에 더더욱 그렇죠. 그 외에도 knetqmail에는 칵테일 패치에 포함되지 않은 유용한 패치들이 여럿 되기 때문에 통합패키지인 knetqmail을 이용할 것을 적극 추천합니다.

 아, 참고로 중요한 점이 knetqmail-1.06을 사용하려면 반드시 vpopmail이 설치되어 있어야 한다는 점입니다.
 qmail + checkpassword 조합으로 쓰시려는 분들은 본 문서의 방법을 적용할 수 없다는 점에 유의하시기 바랍니다.

 이미 칵테일 패치를 적용한 qmail + vpopmail 조합으로 메일서버를 운영중이신 분들은 그 위에 knetqmail을 그대로 덮어씌우면 됩니다.

 knetqmail-1.06에 포함된 패치 정보는 아래 링크 참고 바랍니다.
http://qmail.kldp.org/phpbb/viewtopic.php?t=7694&start=0&postdays=0&postorder=asc&highlight


큐메일 소스를 받아 압축을 풀고 gcc 버전과의 호환 문제 해결을 위해 error.h 파일 최상단에 #include <errno.h> 구문을 삽입하고 설치 들어갑니다.
knetqmail-1.06은 vpopmail까지 설치한 뒤에 적용 가능합니다. qmail 설치 단계에서는 아무런 패치를 가하지 않은 오리지날 qmail만을 컴파일 설치합니다.

cd /usr/local/src/qmail
wget ftp://ftp.eu.uu.net/pub/unix/mail/qmail/qmail-1.03.tar.gz
tar xvfpz qmail-1.03.tar.gz
cd qmail-1.03
vi error.h
#include <errno.h>
#ifndef ERROR_H
#define ERROR_H

 qmail 구동에 필요한 qmail 전용 사용자/그룹을 생성합니다.
 OS별로 조금씩 다릅니다. 리눅스의 경우는 아래와 같이 생성해 주면 됩니다. INSTALL.ids 파일에 명시되어 있습니다.
groupadd -r nofiles
useradd -r -g nofiles -d /var/qmail/alias alias
useradd -r -g nofiles -d /var/qmail qmaild
useradd -r -g nofiles -d /var/qmail qmaill
useradd -r -g nofiles -d /var/qmail qmailp
groupadd -r qmail
useradd -r -g qmail -d /var/qmail qmailq
useradd -r -g qmail -d /var/qmail qmailr
useradd -r -g qmail -d /var/qmail qmails

 이제 설치합니다.
make
make setup check

 make setup check 시 아래와 같은 에러가 나는 경우가 있습니다.
nroff -man qmail-local.8 > qmail-local.0
/bin/sh: nroff: command not found
make: *** [qmail-local.0] 오류 127

 groff 패키지를 설치하면 됩니다.
yum -y install groff
 


이제 각종 설정에 들어갑니다. 별다른 설명은 않겠습니다.
./config-fast mail.foobar.com

vi /var/qmail/rc
#!/bin/sh
exec env - PATH="/var/qmail/bin:$PATH" \
qmail-start ./Maildir/
※ 몇몇 문서들 중엔 qmail-start ./Maildir/ 부분 뒤에 아래와 같이 splogger qmail 옵션이 추가된 설정파일을 소개하고 있습니다.

#!/bin/sh
exec env - PATH="/var/qmail/bin:$PATH" \
qmail-start ./Maildir/ splogger qmail

그러나 위 설정은 큐메일을 daemontools를 이용해 구동하지 않을 시 syslod에 로그를 기록하기 위한 옵션이므로 본 문서처럼 daemontools와 연동해서 큐메일을 구동할 때엔 불필요합니다.
http://qmail.kldp.org/phpbb/viewtopic.php?t=7023


chmod 755 /var/qmail/rc
mkdir -p /var/qmail/supervise/qmail-send/log
mkdir -p /var/qmail/supervise/qmail-smtpd/log
chmod 1755 /var/qmail/supervise/qmail-send
chmod 1755 /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/qmail-send

vi /var/qmail/supervise/qmail-smtpd/run
#!/bin/sh
Q_UID=`id -u qmaild`
Q_GID=`id -g qmaild`
exec /usr/local/bin/softlimit -m 2000000 \
/usr/local/bin/tcpserver -vRHl 0 \
-x /etc/tcp.smtp.cdb \
-u $Q_UID -g $Q_GID 0 25 /var/qmail/bin/qmail-smtpd 2>&1
위 내용은 vpopmail 연동 없이 qmail 단독으로 실행할 경우 사용할 수 있는 스크립트입니다.
smtp 인증 방식을 어떤 것으로 적용하느냐에 따라 /var/qmail/supervise/qmail-smtpd/run 파일 작성법이 조금씩 달라집니다. vpopmail과 연동해서 사용하려면 위 내용이 조금 달라지므로 뒤에 가서 다시 설명합니다.
따옴표 작성 시 '(apostrophe)가 아닌 `(grave accent)임에 유의합니다.

vi /var/qmail/supervise/qmail-smtpd/log/run
#!/bin/sh
exec /usr/local/bin/setuidgid qmaill \
/usr/local/bin/multilog t /var/log/qmail/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

smtp 로그 파일 기록을 위한 작업
mkdir -p /var/log/qmail/qmail-send
mkdir -p /var/log/qmail/qmail-smtpd
chown qmaill /var/log/qmail /var/log/qmail/qmail-send
chown qmaill /var/log/qmail /var/log/qmail/qmail-smtpd

릴레이 규칙을 설정하기 위한 /etc/tcp.smtp 파일을 만듭니다.
vi /etc/tcp.smtp
127.0.0.1:allow,RELAYCLIENT=""

만들어진 /etc/tcp.smtp 파일을  cdb 형식의 파일로 변경합니다.
/usr/local/bin/tcprules /etc/tcp.smtp.cdb /etc/tcp.smtp.tmp < /etc/tcp.smtp


 qmail은 기본적으로 root로는 메일 수신이 안되도록 설계되어 있기에 관리자 계정으로 수신되는 메일을 일반계정으로 포워딩하도록 alias를 설정해 줍니다. 여기서 server는 root, postmaster 등으로 오는 메일을 받을 일반 계정입니다.
 물론 server 계정은 나중에 설명할 vpopmail 설치 과정까지 밟은 후 생성해 주어야 하겠죠.
 alias용 계정은 아무거나 해도 상관 없습니다.
echo server@foobar.com > /var/qmail/alias/.qmail-root
echo server@foobar.com > /var/qmail/alias/.qmail-postmaster
echo server@foobar.com > /var/qmail/alias/.qmail-mailer-daemon
chmod 644 /var/qmail/alias/.qmail-*


 여러 응용 프로그램들 중에서는 아직까지도 sendmail를 사용하는 경우가 많기 때문에 qmail 바이너리를 기존 sendmail 바이너리가 있던 경로에 링크를 시켜 주는 것이 좋습니다. 대표적인 예로 제로보드를 들 수 있습니다. php 함수로 메일을 발송하려 할 때 제로보드 기본 소스로는 /usr/bin/sendmail을 찾기 때문이죠.
 본 게시물에서는 sendmail을 삭제하지 않고 qmail을 설치하는 법을 다루고 있습니다. 그러므로 기존 sendmail 바이너리는 sendmail.orig로 이름만 바꾸어 백업해 놓고 qmail 바이너리를 그 자리에 링크해 놓는 것이 추후 sendmail로 원복해야 할 상황이 발생할 때를 대비할 수 있어서 좋습니다.
 센드메일이 실행되어 있다면 센드메일을 먼저 내린 뒤 아래와 같이 작업해 줍니다.
mv /usr/lib/sendmail /usr/lib/sendmail.orig
mv /usr/sbin/sendmail /usr/sbin/sendmail.orig
ln -s /var/qmail/bin/sendmail /usr/lib
ln -s /var/qmail/bin/sendmail /usr/sbin


오리지날 qmail 설치는 이것으로 끝났습니다. 실행을 위한 스크립트를 작성합니다.
레드햇 계열의 init 스크립트는 아래와 같이 작성합니다.
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 [ -e /service/vpop ] ; then
                if svok /service/vpop ; then
                        svc -u /service/vpop
                else
                        echo vpop supervise not running
                fi
         else
                ln -s /var/qmail/supervise/vpop /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
    echo "  vpop"
    svc -dx /service/vpop
         rm -f /service/vpop
    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
    svstat /service/vpop
    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
    echo "Pausing vpop"
    svc -p /service/vpop
    ;;
  cont)
    echo "Continuing qmail-send"
    svc -c /service/qmail-send
    echo "Continuing qmail-smtpd"
    svc -c /service/qmail-smtpd
    echo "Continuing vpop"
    svc -c /service/vpop
    ;;
  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 700 /etc/rc.d/init.d/qmail
chkconfig --add qmail
chkconfig --level 345 qmail on

우분투에서 사용할 init 스크립트입니다.
vi /etc/init.d/qmail

#!/bin/sh

set -e

. /lib/lsb/init-functions

PATH=/var/qmail/bin:/bin:/usr/bin:/usr/local/bin:/usr/local/sbin
export PATH

case "$1" in
  start)
    log_daemon_msg "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 [ -e /service/vpop ] ; then
                if svok /service/vpop ; then
                        svc -u /service/vpop
                else
                        echo vpop supervise not running
                fi
         else
                ln -s /var/qmail/supervise/vpop /service/
         fi

    if [ -d /var/lock/subsys ]; then
      touch /var/lock/subsys/qmail
    fi
    log_end_msg 0
    ;;
  stop)
    log_daemon_msg "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
    echo "  vpop"
    svc -dx /service/vpop
         rm -f /service/vpop
    if [ -f /var/lock/subsys/qmail ]; then
      rm /var/lock/subsys/qmail
    fi
    log_end_msg 0
    ;;
  stat)
    svstat /service/qmail-send
    svstat /service/qmail-send/log
    svstat /service/qmail-smtpd
    svstat /service/qmail-smtpd/log
    svstat /service/vpop
    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
    echo "Pausing vpop"
    svc -p /service/vpop
    ;;
  cont)
    echo "Continuing qmail-send"
    svc -c /service/qmail-send
    echo "Continuing qmail-smtpd"
    svc -c /service/qmail-smtpd
    echo "Continuing vpop"
    svc -c /service/vpop
    ;;
  restart)
  log_daemon_msg "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
    log_end_msg 0
    ;;
  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 700 /etc/init.d/qmail
update-rc qmail defaults
 
 
 이제 vpopmail을 설치할 차례입니다. vpopmail은 센드메일로 메일서버를 운영할 경우 시스템 계정과 동일하게 메일 계정을 운영하던 방식에서 벗어나 메일 전용의 가상 계정을 운영할 수 있도록 해 줍니다. 메일 계정 패스워드를 유출 당하는 것이 곧 시스템 계정 정보를 유출당하는 것과 다름없어지는 보안상 헛점을 커버할 수 있기에 vpopmail은 qmail 서버 운영에 있어서 좋은 선택입니다.
 이 가상 메일 계정 데이터는 cdb 파일로 관리하거나 mysql db에 적재하여 관리할 수 있습니다. 이 문서에서는 mysql을 사용하는 방법을 다룹니다.
 그리고 vpopomail은 smtp 인증을 위해 로밍(roaming)이란 기능을 지원합니다. 본래 오리지날 qmail은 유동IP 사용자들에게 relay를 허용하지 않도록 설계되었습니다. 릴레이를 허용하기 위해서는 /etc/tcp.smtp 파일에 메일 사용자 PC의 IP를 일일이 추가해 주어야 사용이 가능했죠. 그래서 뜻있는 개발자들이 유동 IP 사용자들을 위해 qmail에 smtp-auth 패치을 추가해 주어 문제점을 극복할 수 있게 되었습니다.
 vpopmail의 roaming은 pop3 인증을 통과한 사용자에 한해 일정 시간 동안 해당 사용자의 IP를 릴레이가 가능토록 허용해 주는 기능입니다. 그러므로 smtp 인증은 qmail의 smtp-auth와 vpopmail의 roaming 중 아무거나 취사선택하여 적용하면 됩니다.
 본 문서에서는 로밍을 이용하지 않고 qmail에 직접 패치된 smtp-auth를 이용하는 방법을 설명합니다.

vpopmail 설치에 필요한 시스템 계정을 생성합니다.
groupadd -r vchkpw
useradd -r -g vchkpw vpopmail

vpopmail 소스 받아 압축을 풉니다.
wget http://nchc.dl.sourceforge.net/sourceforge/vpopmail/vpopmail-5.4.25.tar.gz
tar xfz vpopmail-5.4.25.tar.gz
cd vpopmail-5.4.25

vpopmail은 컴파일 옵션에 prefix를 주지 않으면 기본적으로 /home/vpopmail 경로에 설치됩니다.
vpopmail 가상계정 정보를 mysql db에 저장하는 방식으로 설치하기 위해 --enable-auth-module=mysql 옵션을 주고 설치합니다. 옵션을 주지 않으면 계정정보를 cdb 파일에 기록해서 쓰게 됩니다.
./configure --enable-tcprules-prog=/usr/local/bin/tcprules --enable-tcpserver-file=/etc/tcp.smtp --enable-auth-module=mysql
make
make install-strip


chmod 755 /home/vpopmail/etc
chown vpopmail.vchkpw /home/vpopmail/etc
echo "foobar.com" > /home/vpopmail/etc/defaultdomain
chown vpopmail.vchkpw /home/vpopmail/etc/defaultdomain
chmod 640 /home/vpopmail/etc/defaultdomain


로그인 할 때마다 vpopmail db에서 vpopmail 가상계정 정보를 참고하기 위한 설정을 합니다.
물론 vpopmail db를 생성해 주어야 합니다. 패스워드는 12345로 설정해 보겠습니다.
mysql> create database vpopmail;
mysql> grant all privileges on vpopmail.* to vpopmail@localhost identified by '12345';
mysql> flush privileges;


vi /home/vpopmail/etc/vpopmail.mysql
localhost|0|vpopmail|12345|vpopmail
chmod 640 /home/vpopmail/etc/vpopmail.mysql

vpopmail의 vchkpw를 통해 패스워드 인증을 거친 뒤 qmail의 smtp auth를 통과하도록 qmail 설치 시 작성했던 스크립트를 수정해 주어야 합니다. /var/qmail/supervise/qmail-smtpd/run 파일입니다.
#!/bin/sh
Q_UID=`id -u vpopmail`
Q_GID=`id -g vpopmail`
exec /usr/local/bin/softlimit -m 20000000 \
/usr/local/bin/tcpserver -vRHl 0 -x /etc/tcp.smtp.cdb \
-u $Q_UID -g $Q_GID 0 25 \
/var/qmail/bin/qmail-smtpd /home/vpopmail/bin/vchkpw /bin/true 2>&1


vpopmail을 위한 디렉토리와 스크립트 생성
mkdir /var/qmail/supervise/vpop
chmod 1755 /var/qmail/supervise/vpop
vi /var/qmail/supervise/vpop/run
#!/bin/sh
VPOP_UID=`id -u vpopmail`
VPOP_GID=`id -g vpopmail`
exec /usr/local/bin/softlimit -m 20000000 \
tcpserver -vRHl 0 -u $VPOP_UID -g $VPOP_GID 0 110 \
/var/qmail/bin/qmail-popup foobar.com \
/home/vpopmail/bin/vchkpw /var/qmail/bin/qmail-pop3d Maildir 2>&1
chmod 755 /var/qmail/supervise/vpop/run
mkdir /var/qmail/supervise/vpop/log
vi /var/qmail/supervise/vpop/log/run
#!/bin/sh
exec /usr/local/bin/setuidgid qmaill \\
/usr/local/bin/multilog t /var/log/qmail/vpop
chmod 755 /var/qmail/supervise/vpop/log/run
mkdir /var/log/qmail/vpop
chown qmaill /var/log/qmail/vpop


이제 knetqmail 패치를 합니다. 자세한 정보는 아래 링크에서 얻으시기 바랍니다.
http://qmail.kldp.net/phpbb/viewtopic.php?t=7681

참고로 openssl과 openssl-devel 이 먼저 설치되어 있어야 설치 시 에러가 나지 않습니다.
wget http://shupp.org/software/libdomainkeys-0.68.tar.gz
wget http://shupp.org/patches/libdomainkeys.diff
wget http://mail.linuxstudy.pe.kr/download/knetqmail-1.06-20090303.tar.bz2
tar xfz libdomainkeys-0.68.tar.gz
cd libdomainkeys-0.68
patch -p0 < ../libdomainkeys.diff
make
cd ..
mkdir tmp
cd tmp
tar xfj ../knetqmail-1.06-20090303.tar.bz2
cd knetqmail-1.06-20090303
make
make setup check

우분투 9.04에서 knetqmail을 컴파일할 시 아래와 같은 에러를 만날 수 있습니다.
./compile open_rw.c
In function ‘open’,
inlined from ‘open_rw’ at open_rw.c:6:
/usr/include/bits/fcntl2.h:51: error: call to ‘__open_missing_mode’ declared with attribute error: open with O_CREAT in second argument needs 3 arguments
make: *** [open_rw.o] 오류 1

gcc 버전이 4.3.2 이상일 경우 발생하는 에러입니다.
아래와 같이 수정하면 됩니다. 붉은색으로 표시한 부분입니다.
vi opne_rw.c
#include <sys/types.h>
#include <fcntl.h>
#include "open.h"

int open_rw(fn) char *fn;
{ return open(fn,O_RDWR | O_CREAT,0644); }



이제 knetqmail 패치가 된 qmail + vpopmail 세트가 모두 설치되었습니다. 스크립트로 구동하면 됩니다.
/etc/init.d/qmail start


프로세스 상태가 아래와 같이 출력되어야 정상입니다. 푸른색으로 강조한 부분입니다.
pstree, netstatr -ntlp, ps auxww 커맨드로 확인합니다.
[root@localhost:~]# pstree
init-+-bnetd
     |-clamd---{clamd}
     |-crond
( 중 략 )
    |-svscanboot-+-readproctitle
     |            `-svscan-+-2*[supervise---tcpserver]
     |                     |-3*[supervise---multilog]
     |                     `-supervise---qmail-send-+-qmail-clean
     |                                              |-qmail-lspawn
     |                                              `-qmail-rspawn

     |-syslogd
     |-udevd
     |-3*[vsftpd---2*[vsftpd]]
     `-xinetd

netstat 커맨드로 검사 시 tcpserver 라는 데몬이 tcp 25, 110번 포트로 리슨 상태여야 합니다.
[root@localhost:~]# netstat -ntlp
tcp        0      0 0.0.0.0:110                 0.0.0.0:*                   LISTEN      2535/tcpserver
tcp        0      0 0.0.0.0:25                  0.0.0.0:*                   LISTEN      13342/tcpserver


필자의 경우 ps aux 커맨드로 검사 시 정상 구동 상태엔 아래와 같이 출력되고 있습니다.
스팸필터링을 위한 clam antivirus와 스팸어쌔신을 함께 구동 중이라 순수하게 qmail과 vpopmail 조합으로만 구동 시의 프로세스 상태와는 조금 차이가 있다는 점 유의하시기 바랍니다.
[root@localhost:~]# ps auxww | grep mail
root      2471  0.0  0.0   2452  1052 ?        Ss   Jun17   0:00 /bin/sh /command/svscanboot
root      2510  0.0  0.0   1684   368 ?        S    Jun17   1:08 svscan /service
root      2513  0.0  0.0   1512   256 ?        S    Jun17   0:00 readproctitle service errors: ..............................................................................................................................
vpopmail  2198  0.0  0.0   5732  1868 ?        S    18:05   0:00 dovecot-auth
root      2525  0.0  0.0   1520   316 ?        S    Jun17   0:00 supervise vpop
root      2526  0.0  0.0   1520   316 ?        S    Jun17   0:00 supervise log
root      2527  0.0  0.0   1520   316 ?        S    Jun17   0:00 supervise qmail-smtpd
root      2528  0.0  0.0   1520   312 ?        S    Jun17   0:00 supervise log
root      2529  0.0  0.0   1520   316 ?        S    Jun17   0:00 supervise qmail-send
root      2530  0.0  0.0   1520   316 ?        S    Jun17   0:00 supervise log
qmaill    2532  0.0  0.0   1664   380 ?        S    Jun17   0:00 /usr/local/bin/multilog t /var/log/qmail/vpop
qmaill    2534  0.0  0.0   1664   380 ?        S    Jun17   0:00 /usr/local/bin/multilog t /var/log/qmail/smtpd
vpopmail  2535  0.0  0.0   1544   336 ?        S    Jun17   0:00 tcpserver -vRHl 0 -u 107 -g 403 0 110 /var/qmail/bin/qmail-popup foobar.com /home/vpopmail/bin/vchkpw /var/qmail/bin/qmail-pop3d Maildir
qmaill    2536  0.0  0.0   1532   308 ?        S    Jun17   0:00 /usr/local/bin/multilog t n 10 s20000000 /var/log/qmail
qmails   13337  0.0  0.0   1700   480 ?        S    Jun30   0:00 qmail-send
root     13338  0.0  0.0   1676   368 ?        S    Jun30   0:00 qmail-lspawn ./Maildir/
qmailr   13339  0.0  0.0   1672   368 ?        S    Jun30   0:00 qmail-rspawn
qmailq   13340  0.0  0.0   1652   356 ?        S    Jun30   0:00 qmail-clean
vpopmail 13342  0.0  0.0   1544   336 ?        S    Jun30   0:00 /usr/local/bin/tcpserver -vRHl 0 -x /etc/tcp.smtp.cdb -u 107 -g 403 0 25 /usr/local/bin/rblsmtpd -b -r bl.spamcop.net -r rbl.linuxstudy.pe.kr /var/qmail/bin/qmail-smtpd /home/vpopmail/bin/vchkpw /usr/bin/relay_log.pl
root     18037  0.0  1.3  33676 28032 ?        Ss   Jul28   0:58 /usr/bin/spamd -d -v -m10 -x -u vpopmail -r /var/run/spamd.pid
vpopmail 18041  0.0  1.6  38972 33304 ?        S    Jul28   0:23 spamd child
vpopmail 18042  0.0  1.2  33676 26500 ?        S    Jul28   0:00 spamd child
[root@localhost:~]#


telnet 커맨드로 tcp 25, 110번 포트로 아래와 같이 올바르게 응답이 돌아와야 정상적인 운영이 가능합니다.
[root@dilocalhost:~]# telnet localhost 25
Trying 127.0.0.1...
Connected to localhost.localdomain (127.0.0.1).
Escape character is '^]'.
220 digimoon.net ESMTP
.
502 unimplemented (#5.5.1)
quit
221 digimoon.net
Connection closed by foreign host.
[root@localhost:~]# telnet localhost 110
Trying 127.0.0.1...
Connected to localhost.localdomain (127.0.0.1).
Escape character is '^]'.
+OK <26548.1249138818@digimoon.net>
.
-ERR authorization first
quit
+OK
Connection closed by foreign host.
[root@localhost:~]#


아래와 같으면 비정상입니다. 이런 경우 /var/qmail/supervise/qmail-smtpd/run 과 같은 qmail 구동 스크립트 안의 softlimit 값을 늘리고 qmail 리스타트하고 다시 테스트합니다.
[root@localhost]# telnet localhost 25
Trying 127.0.0.1...
Connected to mail.foobar.com (127.0.0.1).
Escape character is '^]'.
Connection closed by foreign host.

110번 포트도 같은 방법으로 테스트하고 문제를 해결합니다.
그래도 telnet 검사를 실패하는 경우라면 qmail 설치 과정에서 무언가가 빠졌을 가능성이 큽니다.
qmail은 상당히 정밀하게 만들어진 시스템이라 파일이나 디렉토리 단 하나라도 없거나 스크립트 내용에 오타가 있거나 소유권/허가권이 잘못 설정되었을 경우 구동 자체가 안되므로 주의를 요합니다.


이제 IMAP 데몬을 설치해 보도록 하겠습니다. courier imap, imap2000 등등 여러가지가 있는데 CentOS가 imap 데몬으로 레파지토리에서 dovecot을 기본으로 지원하고 있는지라 본 문서에서는 dovecot 설치에 대해 다루어 보겠습니다.

CentOS 5.x 32bit에 기본 포함된 dovecot은 1.0.7-7이로군요.
[root@localhost ~]# rpm -qa | grep dovecot
dovecot-1.0.7-7
[root@localhost ~]#


rpm 버전은 vpopmail과 연동되도록 패키징된 것이 아니라서 소스를 받아 with-vpopmail 옵션을 추가하여 컴파일 설치하거나 srpm을 받아 리빌드해서 사용해야 합니다. 여기선 dovecot srpm을 리빌드하는 방법을 설명합니다.

아래 링크 참고하여 dovecot srpm을 CentOS 미러서버에서 받습니다.
http://free4u.wo.tc/weblog/10440
[root@localhost ~]# yumdownloader --source dovecot


srpm을 설치합니다.
[root@localhost ~]# rpm -ivh dovecot-1.0.7-7.el5.src.rpm


SPEC 디렉토리로 이동하여 spec 파일을 vi 편집기로 열어 대략 100번째 줄부터 나와 있는 configure 옵션 부분에 --with-vpopmail 을 추가해 주면 됩니다.
[root@localhost ~]# cd /usr/src/redhat/SPEC
[root@localhost SPEC]# vi dovecot.spec
100 autoreconf
101 %configure                           \
102     INSTALL_DATA="install -c -p -m644" \
103     --with-doc                 \
104 %if %{build_postgres}
105     --with-pgsql                 \
106 %endif
107 %if %{build_mysql}
108     --with-mysql                 \
109 %endif
110     --with-ssl=openssl           \
111     --with-ssldir=%{ssldir}      \
112     --with-ldap                  \
113     --with-inotify               \
114     --with-gssapi                \
115     --with-vpopmail  <----- 추가한 부분         
116
117 make %{?_smp_mflags}


이제 리빌드합니다.
[root@localhost SPEC]# rpmbuild -ba dovecot.spec


그러면 openldap-devel gettext-devel postgresql-devel mysql-devel 패키지들과의 의존성 에러를 뿜으며 빌드가 안 될 것입니다. 여기서 yum의 융통성 없는 한계가 드러나는군요. 어쩔 수 없이 yum으로 해당 패키지들을 설치해 주거나 아예 dovecot.spec 파일에서 관련 패키지 컴파일옵션을 삭제해서 진행하면 됩니다. 제 경우는 그냥 yum으로 설치해 주고 나중에 rpm -e --nodeps로 삭제해 주었습니다.
특히 중요한 것이 CentOS의 dovecot rpm은 mysql rpm과 의존성을 갖는 지라(dovecot rpm 자체가 기본적으로 mysql과 연동되도록 바이너리 패키징화되어 있기 때문) 기존부터 /usr/local/mysql 등의 경로에 소스컴파일 설치된 mysql을 운영하고 있는 경우 빌드가 끝나고 dovecot rpm까지 설치한 뒤에 yum이 아닌 rpm -e --nodeps로 mysql rpm을 삭제해야 한다는 겁니다. 그냥 yum으로 삭제하면 dovecot까지 세트로 삭제하기 때문이죠.
그리고 mysql을 삭제하고 나면 mysql 환경설정 파일인 /etc/my.cnf 파일이 /etc/my.cnf.rpmsave 등의 이름으로 백업되고 사라지기에 /etc/my.cnf로 다시 복원해 주고 mysql을 재가동해 주어야 합니다.
물론 소스컴파일 버전의 mysql을 운영하고 있었다면 소스 버전의 my.cnf 파일로 복원해 주어야 합니다.

암튼 리빌드가 에러 없이 끝나면 CentOS 5.x 32bit의 경우 /usr/src/redhat/RPMS/i386 경로에 rpm 파일이 존재하게 됩니다. 설치하면 됩니다.
[root@localhost i386]# ls -l /usr/src/redhat/RPMS/i386 | grep dovecot
-rw-r--r-- 1 root root 1754076 11월  2 19:36 dovecot-1.0.7-7.i386.rpm
-rw-r--r-- 1 root root 3913489 11월  2 19:36 dovecot-debuginfo-1.0.7-7.i386.rpm
[root@storage i386]# rpm -Uvh /usr/src/redhat/RPMS/i386/dovecot-*


dovecot 환경설정 파일을 아래와 같이 설정합니다.
[root@localhost i386]# cat /etc/dovecot.conf
protocols = imap
ssl_disable = yes
disable_plaintext_auth = no
login_process_per_connection = no
login_greeting = Ready
mail_debug = yes
first_valid_uid = 408 <- vpopmail 계정 UID를 입력
protocol imap {
}
auth_verbose = yes
auth_debug = yes
auth default {
 mechanisms = plain
 passdb vpopmail {
 }
 userdb vpopmail {
 }
 user = vpopmail
}
[root@localhost i386]#



















Creative Commons License
2009/02/03 10:03 2009/02/03 10:03