먼저, 이 문서은 개인적인 기록의 목적으로 작성한 것이며, 모든 내용은 http://kldp.org, http://chaosclub.net 그리고  기타 여러문서에서 종합해 일부 수정을 했음을 밝혀둔다.


1. 설치파일 준비


qmail을 설치하는 필요한 패키지는 다음과 같다. 아래의 대부분의 파일은 http://www.qmail.org 에서 받을 수 있거나 링크를 찾을 수 있다.


qmail (http://cr.yp.to/software/qmail-1.03.tar.gz)
ucspi-tcp (
http://cr.yp.to/ucspi-tcp/ucspi-tcp-0.88.tar.gz)
daemontools (
http://cr.yp.to/daemontools/daemontools-0.76.tar.gz)

checkpasswd (http://cr.yp.to/checkpwd/checkpassword-0.90.tar.gz)

SMTP 인증 패치 (Mrs. Brisby의 http://www.nimh.org/dl/qmail-smtpd.c)

qmail-103.patch  : Christopher K. Davis의 oversize DNS packets patch
                          (
http://www.ckdhr.com/ckd/qmail-103.patch)


qmail-queue 패치 (http://www.qmail.org/qmailqueue-patch)
Maildrop 1.4.0 (
http://download.sourceforge.net/courier/)
qmail-scanner (
http://qmail-scanner.sourceforge.net/)


참고로 rblsmtpd 패키지는 설치할 필요가 없다. 현재 rblsmtpd는 ucspi-tcp에 포함되어 있다. 예전에 작성된 문서에는 rblsmtpd도 설치하라고 나오는 경우가 있는데, 현재에는 신경 쓸 필요 없다. 그리고 아랫 부분에 있는 3개의 파일(qmail-queue 패치, Maildrop, qmail-scanner)은 바이러스 메일 차단 기능을 원하는 경우에 필요한 파일들이다. 해당 링크가 깨졌거나 파일을 찾을 수 없으면, http://filewatcher.org 에서 찾아보길 바란다.




2. 압축풀기


모든 설치 작업은 root 권한에서 한다. 필요한 파일들을 임시 디렉토리(필자의 경우는 /root/temp/)로 복사한후 압축을 해제한다.


[/root/temp]# tar xzvf qmail-1.03.tar.gz
[/root/temp]# tar xzvf ucspi-tcp-0.88.tar.gz

[/root/temp]# tar xzvf daemontools-0.76.tar.gz


checkpasswd 는 qmail 설치가 성공해야 pop3를 설치할 수 있으므로, qmail 설치후에 다루겠다.




3. 설치 및 설정


qmail이 설치 될 디렉토리를 만들어준다. 기본적으로 /var/qmail/ 디렉토리에 설치하도록 되어있다.


[/root/temp]# mkdir /var/qmail


그 다음엔 qmail 운영에 사용될 계정들을 만들어 주어야 하는데, /root/temp/qmail-1.03/INSTALL.ids 파일을 이용하면 된다. 그 파일을 편집하여 자신의 운영 체제와 맞는 부분만 남기고 주석을 풀어준다. 필자는 리눅스에 설치하고 있으므로 다음과 같은 부분만 남기고 모두 삭제하였다.


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


그리고는 다음과 같이 이 파일의 내용을 실행해준다.

[/root/temp/qmail-1.03]# sh INSTALL.ids


groupadd useradd 라는 명령어가 없다고 나오는 경우가 있는데, 그 경우에는 다음과 같이 PATH 변수를 갱신해 주면 된다.


[/root/temp/qmail-1.03]# PATH=/usr/sbin:$PATH

[/root/temp/qmail-1.03]# export PATH


이번에는 oversize DNS 패치를 적용한다. 이 패치는 RFC의 권고안을 무시하고 512바이트보다 큰 UDP DNS 응답을 되돌려주는 일부 ISP업체들(AOL, hanmail.net 등) 때문에 필요한 것이다. qmail의 DNS resolve 라이브러리는 RFC와 호환되도록 되어 있으므로 RFC와 호환되지 않게 전달되는 메시지에는 응답하지 못한다. 다음의 패치는 qmail이 그러한 불법적인 DNS의 응답에 정확하게 수행하도록 한다. 패치는 qmail소스 디렉토리에서 다음과 같이 한다.


[/root/temp/qmail-1.03]# patch -p1 < ../qmail-103.patch
patching file dns.c


그 다음엔 SMTP 인증 기능을 위해 패치할 차례이다. 이것은 아웃룩 익스프레스 등으로 편지를 보낼 때에도 인증을 필요하도록 하는 것인데, 스팸 메일 서버로 이용당하는 것을 원치 않는다면 꼭 필요한 기능이다. 최신 버전의 sendmail에서도 이런 기능을 기본적으로 지원한다. 이 패치는 qmail의 소스 파일 중 qmail-smtpd.c 파일을 덮어 쓰면 된다. 이 기능을 원치 않으면 안 해도 상관은 없다.

[/root/temp/qmail-1.03]# cp ../qmail-smtpd.c ./
cp: overwrite `./qmail-smtpd.c'? y

사실 최근에는 CRAM-MD5라는 방식도 지원되는 좀더 좋은 SMTP 인증 패치도 있다. 그러나 설치 방법도 좀 더 복잡하고 해서 간단한 것(설치 방법과 성능 모두 간단한)을 택했다.

그리고 바이러스 메일 차단을 넣고 싶다면 다음 패치도 해야 한다. 이 기능이 필요없다면 그냥 넘어가도 된다. 그러나 이 기능 없이 메일 서버를 운영해보면 바이러스 메일이 엄청나게 올 것이다.


[/root/temp/qmail-1.03]# patch -p1 < ../qmailqueue-patch
(Stripping trailing CRs from patch.)
patching file Makefile
(Stripping trailing CRs from patch.)
patching file qmail.c


qmail과 다른 다른 프로그램들도 컴파일하고 설치한다.


[/root/temp/qmail-1.03]# make

[/root/temp/qmail-1.03]# make setup check


[/root/temp/qmail-1.03]# cd /root/temp/ucspi-tcp-0.88/

[/root/temp/ucspi-tcp-0.88]# make

[/root/temp/ucspi-tcp-0.88]# make setup check


[/root/temp/ucspi-tcp-0.88]# cd /root/temp/daemontools-0.76/

[/root/temp/daemontools-0.76]# ./package/install


daemontools를 설치할 때에는 install이라는 스크립트를 실행하면 저절로 컴파일 및 설치가 된다. 주의할 점은 위에서처럼 admin/daemontools-0.76 디렉토리에서 ./package/install과 같이 실행해야 된다는 것이다. package 디렉토리 안에서 install을 실행하면 안된다.

그리고 daemontools를 설치하면 /command 디렉토리가 만들어지고, 그 안에 여러 심볼릭 링크 파일들이 daemonstools의 소스 디렉토리 안을 가리키게 된다. 그래서 qmail 설치가 끝나고 daemontools 소스 디렉토리를 지워버리면 qmail이 작동되지 않게 된다. qmail 설치가 끝난 다음에 daemontools 소스 디렉토리를 지워버리고 싶다면 다음과 같이 한다.

[/command]# rm -f /command/*
[/command]# cp /root/temp/admin/daemontools/command/* /command/

다음에는 qmail의 소스 디렉토리에서 config를 실행시켜, 설정을 해 준다.

[/command]# cd /root/temp/qmail-1.03
[/root/temp/qmail-1.03]# ./config


그러나 만약 여기서 "Sorry, I couldn't find your host's canonical name in DNS." 이런 메시지를 내면서 에러가 난다면 Network 설정 및 DNS 설정에 문제가 있는 경우이다. DNS 서버에 이름이 정상적으로 등록되어 있다면, Network 설정을 잘 살펴보아야 한다. 아래와 같이 파일을 확인 및 수정한다.


/etc/resolv.conf

..............................................................

search yourdomain.com

nameserver 168.126.63.1
nameserver 168.126.63.2


/etc/hosts

..............................................................

127.0.0.1 localhost.localdomain localhost
123.234.123.234 oracle.yourdomain.com oracle

123.234.123.231 other.yourdomain.com other

 

/etc/sysconfig/network

..............................................................

HOSTNAME=yourhostname

DOMAINNAME=yourdomain.com


만약에 그래도 안된다면 "./config-fast hostname.domain.com"과 같이 해준다. 여기서 뒷부분의 hostname.domain.com은 FQDN으로 호스트 이름과 도메인 이름으로 구성된 주소를 써주면 된다.

다음에는 qmail 데몬을 위한 디렉토리와 파일들을 생성해준다.

# 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

그리고 몇가지 파일들을 만들고 각각 다음 내용을 써 준다.

/var/qmail/supervise/qmail-send/run

..............................................................
#!/bin/sh
exec /var/qmail/rc

/var/qmail/supervise/qmail-send/log/run
..............................................................
#!/bin/sh
exec /usr/local/bin/setuidgid qmaill /usr/local/bin/multilog t /var/log/qmail

/var/qmail/supervise/qmail-smtpd/run
..............................................................
#!/bin/sh
export QMAILQUEUE="/var/qmail/bin/qmail-scanner-queue.pl"
ALIASUID=`id -u alias`
ALIASGID=`id -g alias`
exec /usr/local/bin/softlimit -m 10000000 \
/usr/local/bin/tcpserver -v -p -x/etc/tcp.smtp.cdb \
-u $ALIASUID -g $ALIASGID 0 25 /var/qmail/bin/qmail-smtpd 2>&1

위에서 export QMAILQUEUE=... 부분은 바이러스 메일 차단 기능을 사용할 때에만 넣고, 그 기능을 사용하지 않으려면 뺀다.

softlimit -m 10000000 부분은 조절 가능하다. 바이러스 메일 필터링 기능을 사용하지 않을 것이라면 2000000으로 해도 작동할 것이다. 그러나 바이러스 메일 필터링 기능을 사용한다면 그것으로는 부족할 수 있다. 만약 이 수치가 부족하면 아웃룩 등으로 메일을 보낼때 451 qq temporary problem (#4.3.0)와 같은 메시지가 나올 것이다. 다른 문서에는 6000000으로 나오기도 하는데, 필자의 경우엔 그렇게 하니 에러가 나서 아예 10000000으로 해 주었더니 잘 작동했다.

/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


qmail의 로그 파일이 저장될 디렉토리를 만들어 준다.

# mkdir -p /var/log/qmail/smtpd
# chown qmaill /var/log/qmail /var/log/qmail/smtpd


root, postmaster 등 관리자 계정으로 수신되는 메일을 특정 일반계정으로 forward 하도록 설정한다. 만약 여러분이 root로 수신되는 메일을 chaos라는 계정으로 받기를 원한다면 다음과 같이 설정한다.


# cd ~alias
# echo chaos > .qmail-mailer-daemon
# echo chaos > .qmail-postmaster
# echo chaos > .qmail-root

그리고 /var/qmail/control/locals 파일과 /var/qmail/control/rcpthosts 파일에 여러분이 사용하기 원하는 도메인 주소를 모두 써 주어야 한다. 두 파일의 내용은 같게 하면 된다. 예를들어

email@domain.com, email@www.domain.com, email@email.domain.com 과 같은 형식의 메일 주소로 편지를 받기를 원한다면 이 파일들에 다음과 같이 써주면 된다. 물론, 여기서는 이미 www.domain.com 이나 email.domain.com과 같은 주소의 DNS 설정이 되어 있다고 가정했을 경우이다.

domain.com
www.domain.com
email.domain.com

설사 chaos.domain.com과 같은 주소가 여러분의 호스트에 할당되어 있다고 하더라도 이 파일에 주소를 써주지 않으면 email@chaos.domain.com과 같은 주소로 온 편지는 받아들이지 않는다.

그리고 qmail 기동 스크립트를 준비한다. /etc/rc.d/init.d/qmail 이라는 파일을 만들고, 그 안에 아래의 스크립트를 복사해 넣으면 된다.


# vi /etc/rc.d/init.d/qmail
..............................................................

#!/bin/sh
# Comments to support chkconfig on RedHat Linux
# chkconfig: 2345 80 80
# description: 빠르며, 안정적이고, 유연한 MTA

# Source function library.
. /etc/rc.d/init.d/functions

# Source networking configuration.
. /etc/sysconfig/network

# Check that networking is up.
[ ${NETWORKING} = "no" ] && exit 0

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

case "$1" in
  start)
    echo -n "Starting qmail: svscan"
    cd /var/qmail/supervise
    env - PATH="$PATH" svscan &
    echo $! > /var/run/svscan.pid
    echo "."
    ;;
  stop)
    echo -n "Stopping qmail: svscan"
    kill `cat /var/run/svscan.pid`
    echo -n " qmail"
    svc -dx /var/qmail/supervise/*
    echo -n " logging"
    svc -dx /var/qmail/supervise/*/log
    echo "."
    ;;
  stat)
    cd /var/qmail/supervise
    svstat * */log
    ;;
  doqueue|alrm)
    echo "Sending ALRM signal to qmail-send."
    svc -a /var/qmail/supervise/qmail-send
    ;;
  queue)
    qmail-qstat
    qmail-qread
    ;;
  reload|hup)
    echo "Sending HUP signal to qmail-send."
    svc -h /var/qmail/supervise/qmail-send
    ;;
  pause)
    echo "Pausing qmail-send"
    svc -p /var/qmail/supervise/qmail-send
    echo "Pausing qmail-smtpd"
    svc -p /var/qmail/supervise/qmail-smtpd
    ;;
  cont)
    echo "Continuing qmail-send"
    svc -c /var/qmail/supervise/qmail-send
    echo "Continuing qmail-smtpd"
    svc -c /var/qmail/supervise/qmail-smtpd
    ;;
  restart)
    echo "Restarting qmail:"
    echo "* Stopping qmail-smtpd."
    svc -d /var/qmail/supervise/qmail-smtpd
    echo "* Sending qmail-send SIGTERM and restarting."
    svc -t /var/qmail/supervise/qmail-send
    echo "* Restarting qmail-smtpd."
    svc -u /var/qmail/supervise/qmail-smtpd
    ;;
  cdb)
    tcprules /etc/tcp.smtp.cdb /etc/tcp.smtp.tmp < /etc/tcp.smtp
    chmod 644 /etc/tcp.smtp*
    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 -- sends qmail-send ALRM, scheduling queued messages for delivery
reload -- sends qmail-send HUP, rereading locals and virtualdomains
  queue -- shows status of queue
   alrm -- same as doqueue
    hup -- same as reload
HELP
    ;;
  *)
    echo "Usage: $0 {start|stop|restart|doqueue|reload|stat|pause|cont|cdb|queue|help}"
    exit 1
    ;;
esac

exit 0

..............................................................

 

그리고 다음과 같이 실행될 수 있도록 퍼미션 조정을 해준다.


# chmod 755 /etc/rc.d/init.d/qmail

 

레드햇 리눅스의 경우 ntsysv를 실행시켜 sendmail의 체크를 제거하고 리부팅시 qmail 데몬이 실행되도록 qmail에 체크를 해준다. 만약, 여기에 qmail 항목이 나타나지 않는다면 다음과 같이 한다.

# chkconfig --add qmail

이것도 안 되면 그냥 /etc/rc.d/rc.local 파일 맨 끝에 /etc/rc.d/init.d/qmail start 라고 한줄 써주면 된다. 목적은 부팅될때 자동으로 실행하는 것이니까, 어떻게 하든 상관없다.


그리고 설치가 모두 끝난 다음에는 압축을 풀어놓았던 소스 파일 디렉토리들은 모두 삭제해도 된다.(단, daemontools 관련 파일들을 /command 디렉토리로 모두 복사했다는 가정하에)



 

4. 바이러스 메일 차단 기능

 

 

1) Perl module Time::HiRes 설치


이 부분은 바이러스 메일 차단 기능을 원하는 사람만 필요한 부분이다. 필요하지 않다면 그냥 넘어가면 된다.

# perl -e 'use CPAN; install Time::HiRes'

이렇게 하면 자동 설치를 할 것이냐, 수동 설치를 할 것이냐를 묻는데, 처음에 yes라고 대답하여 수동 설치를 하기를 권한다. 물론 거의 100%의 질문에 그냥 엔터만 치면 된다. 다만 중간에 대륙과 국가를 고르는 부분이 나오는데, 그 부분에서 한국으로 골라야 인터넷에서 필요한 파일을 다운로드받아서 설치할 때 빠르게 진행된다. 이것을 설치할때 중간에 필요한 파일을 자동으로 다운로드하는 단계가 있다. 인터넷 접속 속도에 따라 다르겠지만 2~3분이면 설치가 완료된다.


2) Maildrop 설치

[/root/temp]# tar xzvf maildrop-1.4.0.tar.gz
[/root/temp]# cd maildrop-1.4.0
[/root/temp/maildrop-1.4.0]# ./configure
[/root/temp/maildrop-1.4.0]# make
[/root/temp/maildrop-1.4.0]# make install-strip
[/root/temp/maildrop-1.4.0]# make install-man


3) qmail-scanner 설치

[/root/temp]# tar xzvf qmail-scanner-1.14.tgz
[/root/temp]# cd qmail-scanner-1.14
[/root/temp/qmail-scanner-1.14]# ./configure
[/root/temp/qmail-scanner-1.14]# ./configure --install

위와 같이 하면 qmail-scanner-queue.pl 파일이 생성되고 기본적으로 /var/qmail/bin/에 설치가 될 것이다.




6. 기타 설정


1) 릴레이 설정

기본적인 릴레이 설정을 해준다.

# vi /etc/tcp.smtp

127.0.0.1:allow,RELAYCLIENT=""
:allow


설치를 할 때에 SMTP 인증 기능을 패치했기 때문에 localhost에서 보내는 편지만 relay하도록 설정해 놓으면 충분하다. 만약 다른 ip 주소도 무조건 relay를 허가해주고 싶다면 127.0.0.1:allow,RELAYCLIENT="" 다음 줄에 원하는 ip 주소나 대역을 추가해 주면 된다. 자세한 사항은 다른 문서를 참고하기 바란다. SMTP 인증 패치를 한 이상, 위의 설정만으로도 충분하다. 이 파일에 기록된 ip 주소에서 릴레이를 요청할 때에는 인증 없이 무조건 relay를 허가해 주고, 만약 이 파일에 ip 주소가 등록되어 있지 않다면 그때는 SMTP 인증을 해야만 relay 허가가 된다.

그리고 /etc/tcp.smtp 파일을 수정하였다면 다음 명령을 수행하여 데이터베이스를 갱신할 필요가 있다.

# /etc/rc.d/init.d/qmail cdb
Reloaded /etc/tcp.smtp.


2) /var/qmail/rc 생성하기

/var/qmail/rc 파일은 qmail 파일중에서 가장 중요한 파일중의 하나이다. 이것은 qmail을 책임지고 시작하게 한다. 보다 중요한 것은 qmail이 항상 메일을 수신할 수 있도록 한다. rc 의 내용은 qmail을 위한 기본적인 전송 명령으로 되어 있다. /var/qmail/boot 디렉토리에 가면, 여러 경우에 대한 rc 파일의 예제가 파일별로 준비되어 있다. procmail을 이용하여 메일을 처리할 것이기 때문에, 다음과 같이 한다.

# cp /var/qmail/boot/proc /var/qmail/rc

그리고 /var/qmail/rc 파일을 열어서 다음과 같이 수정한다. 맨 아랫 줄에 ./Maildir/ 만 추가되었다. 이것은 Maildir 형태로 메일이 저장되도록 한다.

/var/qmail/rc

..............................................................
#!/bin/sh

# Using splogger to send the log through syslog.
# Using procmail to deliver messages to /var/spool/mail/$USER by default.

exec env - PATH="/var/qmail/bin:$PATH" \
qmail-start '|preline procmail ./Maildir/' splogger qmail



3) Maildir 디렉토리 만들기

이제 이 서버로 도착하는 메일은 각 사용자의 홈 디렉토리 아래에 Maildir이라는 디렉토리 안에 저장되게 된다. 따라서 모든 사용자의 홈 디렉토리 아래에 이 디렉토리가 실제로 있어야 한다. qmail은 이 디렉토리 및 서브 디렉토리를 자동으로 만들어주는 스크립트를 제공하며, 다음이 그 사용 예이다.

# su - chaos
$ /var/qmail/bin/maildirmake $HOME/Maildir
$ echo ./Maildir/ > ~/.qmail

기존 모든 계정에 대해 위와 같은 일을 해주어야 한다. 그러나, 다음과 같이 /etc/skel 디렉토리를 수정해 주면, 앞으로 생성할 사용자에 대해서는 이런 작업을 해주지 않아도 된다.

# cd /etc/skel
# /var/qmail/bin/maildirmake Maildir
# echo ./Maildir/ > .qmail

이제부터는 추가되는 모든 사용자에게 자동으로 Maildir 디렉토리와 .qmail 파일이 생기게 될 것이다.

,