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 소스를 받아 놓을 디렉토리 생성
mkdir qmail
ucspi-tcp를 설치합니다. 뭐하는 놈인지 궁금하다면 아래 링크 참고하시고...
http://ejlabs.net/txt/ucspi-tcp.html
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>를 추가
#ifndef ERROR_H
#define ERROR_H
...
...
굳이 패치를 따로 찾아 적용하는 수고를 덜 필요 없이 위와 같은 방법으로 gcc 상위 버전과의 충돌 문제가 해결 가능합니다.
이제 설치합니다.
make setup check
다음으로 daemontools를 설치합니다. daemontools는 xinetd보다 진보된 수퍼데몬이라고 각종 메뉴얼에서 소개하고 있습니다. 자세한 정보는 아래 링크 참고...
http://ejlabs.net/txt/daemontools.html
qmail의 실행 파일을 daemontools가 설치되는 /services 디렉토리에 링크를 걸어 두어 사용하는 방식을 취합니다. 그러면 daemontools가 알아서 프로세스를 감시하며 최적의 실행 상태를 유지해 줍니다. qmail이 느닷없이 죽으면 daemontools가 다시 살리기도 한다는군요.
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>를 추가합니다.
#include <errno.h>
#ifndef ERROR_H
#define ERROR_H
...
...
설치합니다. package라는 서브디렉토리 안의 install 파일을 실행합니다.
설치되었으면 /command 디렉토리가 생성되며 안에 관련 파일들이 위치하게 됩니다.
레드햇 계열의 경우 /etc/inittab 파일 최하단부에 아래와 같은 행이 추가됩니다.
우분투 7.x 이상 버전부터는 /etc/inittab 파일이 사라지고 /etc/event.d 디렉토리 안에 런레벨 차원에서 구동할 프로그램들을 등록하게 되어 있습니다. 그래서 아래와 같이 작업해 줍니다.
# 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만을 컴파일 설치합니다.
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
#ifndef ERROR_H
#define ERROR_H
qmail 구동에 필요한 qmail 전용 사용자/그룹을 생성합니다.
OS별로 조금씩 다릅니다. 리눅스의 경우는 아래와 같이 생성해 주면 됩니다. INSTALL.ids 파일에 명시되어 있습니다.
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 setup check
make setup check 시 아래와 같은 에러가 나는 경우가 있습니다.
/bin/sh: nroff: command not found
make: *** [qmail-local.0] 오류 127
groff 패키지를 설치하면 됩니다.
이제 각종 설정에 들어갑니다. 별다른 설명은 않겠습니다.
exec env - PATH="/var/qmail/bin:$PATH" \
qmail-start ./Maildir/
#!/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
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
exec /var/qmail/rc
exec /usr/local/bin/setuidgid qmaill \
/usr/local/bin/multilog t /var/log/qmail/qmail-send
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
smtp 인증 방식을 어떤 것으로 적용하느냐에 따라 /var/qmail/supervise/qmail-smtpd/run 파일 작성법이 조금씩 달라집니다. vpopmail과 연동해서 사용하려면 위 내용이 조금 달라지므로 뒤에 가서 다시 설명합니다.
따옴표 작성 시 '(apostrophe)가 아닌 `(grave accent)임에 유의합니다.
exec /usr/local/bin/setuidgid qmaill \
/usr/local/bin/multilog t /var/log/qmail/qmail-smtpd
실행 파일에 퍼미션을 아래와 같이 부여합니다.
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-smtpd
chown qmaill /var/log/qmail /var/log/qmail/qmail-send
chown qmaill /var/log/qmail /var/log/qmail/qmail-smtpd
릴레이 규칙을 설정하기 위한 /etc/tcp.smtp 파일을 만듭니다.
만들어진 /etc/tcp.smtp 파일을 cdb 형식의 파일로 변경합니다.
qmail은 기본적으로 root로는 메일 수신이 안되도록 설계되어 있기에 관리자 계정으로 수신되는 메일을 일반계정으로 포워딩하도록 alias를 설정해 줍니다. 여기서 server는 root, postmaster 등으로 오는 메일을 받을 일반 계정입니다.
물론 server 계정은 나중에 설명할 vpopmail 설치 과정까지 밟은 후 생성해 주어야 하겠죠.
alias용 계정은 아무거나 해도 상관 없습니다.
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/sbin/sendmail /usr/sbin/sendmail.orig
ln -s /var/qmail/bin/sendmail /usr/lib
ln -s /var/qmail/bin/sendmail /usr/sbin
오리지날 qmail 설치는 이것으로 끝났습니다. 실행을 위한 스크립트를 작성합니다.
레드햇 계열의 init 스크립트는 아래와 같이 작성합니다.
#!/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
chkconfig --add qmail
chkconfig --level 345 qmail on
우분투에서 사용할 init 스크립트입니다.
#!/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
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 설치에 필요한 시스템 계정을 생성합니다.
useradd -r -g vchkpw vpopmail
vpopmail 소스 받아 압축을 풉니다.
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 파일에 기록해서 쓰게 됩니다.
make
make install-strip
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> grant all privileges on vpopmail.* to vpopmail@localhost identified by '12345';
mysql> flush privileges;
vpopmail의 vchkpw를 통해 패스워드 인증을 거친 뒤 qmail의 smtp auth를 통과하도록 qmail 설치 시 작성했던 스크립트를 수정해 주어야 합니다. /var/qmail/supervise/qmail-smtpd/run 파일입니다.
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을 위한 디렉토리와 스크립트 생성
chmod 1755 /var/qmail/supervise/vpop
vi /var/qmail/supervise/vpop/run
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
mkdir /var/qmail/supervise/vpop/log
vi /var/qmail/supervise/vpop/log/run
exec /usr/local/bin/setuidgid qmaill \\
/usr/local/bin/multilog t /var/log/qmail/vpop
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/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을 컴파일할 시 아래와 같은 에러를 만날 수 있습니다.
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 이상일 경우 발생하는 에러입니다.
아래와 같이 수정하면 됩니다. 붉은색으로 표시한 부분입니다.
#include <fcntl.h>
#include "open.h"
int open_rw(fn) char *fn;
{ return open(fn,O_RDWR | O_CREAT,0644); }
이제 knetqmail 패치가 된 qmail + vpopmail 세트가 모두 설치되었습니다. 스크립트로 구동하면 됩니다.
프로세스 상태가 아래와 같이 출력되어야 정상입니다. 푸른색으로 강조한 부분입니다.
pstree, netstatr -ntlp, ps auxww 커맨드로 확인합니다.
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번 포트로 리슨 상태여야 합니다.
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 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번 포트로 아래와 같이 올바르게 응답이 돌아와야 정상적인 운영이 가능합니다.
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 리스타트하고 다시 테스트합니다.
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이로군요.
dovecot-1.0.7-7
[root@localhost ~]#
rpm 버전은 vpopmail과 연동되도록 패키징된 것이 아니라서 소스를 받아 with-vpopmail 옵션을 추가하여 컴파일 설치하거나 srpm을 받아 리빌드해서 사용해야 합니다. 여기선 dovecot srpm을 리빌드하는 방법을 설명합니다.
아래 링크 참고하여 dovecot srpm을 CentOS 미러서버에서 받습니다.
http://free4u.wo.tc/weblog/10440
srpm을 설치합니다.
SPEC 디렉토리로 이동하여 spec 파일을 vi 편집기로 열어 대략 100번째 줄부터 나와 있는 configure 옵션 부분에 --with-vpopmail 을 추가해 주면 됩니다.
[root@localhost SPEC]# vi dovecot.spec
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}
이제 리빌드합니다.
그러면 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 파일이 존재하게 됩니다. 설치하면 됩니다.
-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 환경설정 파일을 아래와 같이 설정합니다.
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]#