준비 운동하기

Q-mail은 요즘 들어 많은 인기를 얻고 있는 프로그램 중에 하나이다. 그 이유는 여러 가지가 있겠지만 기존의 메일 프로그램의 대명사로 불리었던 sendmail 보다 좀더 덩치가 작고, 보안적으로도 결고 뒤떨어지지 않는 다는 점이 크게 어필된 것이 었다. 개인적으로 Q-mail을 써본 필자의 느낌도 그러했다. 덩치가 크고 설정이 복잡했던 sendmail 에 비해서 Q-mail은 작지만 쉽고, 강력한 기능을 가지고 있었다. 그래서 sendmail 보다도 Q-mail을 권하고 싶다. 우선 설치를 하기 위해서는 다음과 같은 프로그램들이 필요하다.

설치하기

우선 다음 받은 프로그램 중에 ⑥번을 제외한 프로그램들의 압축을 풀어 준다.

# tar -zxf qmail-1.03.tar.gz
# tar -zxf rblsmtpd-0.70.tar.gz
# tar -zxf ucspi-tcp-0.88.tar.gz
# tar -zxf daemontools-0.70.tar.gz

qmail 설치 디렉토리를 만들어 주어야 한다. /var/qmail

# mkdir /var/qmail

qmail 실행을 위한 계정과 그룹을 만들어 주어야 준다.
'/압축을 푼 디렉토리/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 
 
#cd /root/temp/qmail-1.03
# sh INSTALL.ids 

해주면 필요한 유저와 그룹이 생성된다. 이제 본격적으로 설치해보자!!

# cd /압축푼 디렉토리/qmail-1.03/
# make
# make setup check

qmail을 위한 다른 프로그램들도 컴파일하고 설치한다. (ucspi-tcp , daemontools , rblsmtpd)

# cd /압축푼 디렉토리/ucspi-tcp-0.88/
# make
# make setup check
 
# cd /압축푼 디렉토리/daemontools-0.70/
# make
# make setup check
 
# cd /압축푼 디렉토리/rblsmtpd-0.70/
# make
# make setup check

설치를 모두 마쳤다면,

# cd /압축푼 디렉토리/qmail-1.03/
# ./config
Your hostname is chsd.
Your host's fully qualified name in DNS is chsd.chonnam.ac.kr.
Putting chsd.chonnam.ac.kr into control/me...
Putting chonnam.ac.kr into control/defaultdomain...
Putting ac.kr into control/plusdomain...

위와 같은 메시지가 떴다면, 아래와 같이

# 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
exec /usr/local/bin/softlimit -m 2000000 \
        /usr/local/bin/tcpserver -v -p -x/etc/tcp.smtp.cdb \
        -u 505 -g 506 0 25 /var/qmail/bin/qmail-smtpd 2>&1
--------------------------------------------------------

위의 “-u 505 -g 506” 에서 505는 alias 의 UID (user ID)이고, 506은 GID (group ID)이다. 컴퓨터마다 등록되는 alias 의 UID와 GID는 다르므로, /etc/패스워드 파일을 참조하라. 그리고, 위에서 보이는 “\”기호는 라인이 바뀌었음을 나타내는 기호이다. 원래 위의 파일을 한 줄로 만들어야 하지만, 그러면 보기가 어렵기 때문에 여러 줄로 만들기 위해서 추가된 것이다.

# 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

root 와 postmaster를 위한 alias 설정을 해준다.

관리자 계정으로 수신되는 메일을 일반계정으로 포워딩하도록, alias를 설정해 준다. 여기서 fat81 는 root, postmaster 등으로 오는 메일을 받을 일반 계정이다. (여러분이 원하는 계정을 만들어서 바꾸어주면 된다.)

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

qmail 부트파일 만들기

아래의 스크립트를 그대로 복사, 저장하거나 새로 받는다. http://kltp.kldp.org/tmp/qmail.txt 이 파일을 /etc/rc.d/init.d/ 에 qmail 이라는 이름으로 저장한 후, 실행 퍼미션을 준다.

# cp [다운로드받은 디렉토리]/qmail.txt /etc/rc.d/init.d/qmail
# chmod 755 qmail
 
----------------/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
--------------------------------------------------------------------------

액세스 컨트롤 파일 작성하기

qmail smtpd를 구동하기 전에, 액세스 컨트롤이 실행되도록 하여야 한다. 이 간단한 작업은 /etc/tcp.smtp 파일을 이용한다. /etc/tcp.smtp 에 다음 한 줄을 작성한다.

# vi /etc/tcp.smtp
--------------------------------
:allow
--------------------------------

로컬호스트이외에 어떠한 메일 릴레이도 허락하지 않는 기본적인 configuration이다.

로컬호스트와 당신의 로컬네트웍에게만 메일 릴레이를 허락하는 configuration은 다음과 같다.

-------------------------------------
127.0.0.1:allow,RELAYCLIENT=""
192.168.1.:allow,RELAYCLIENT=""
:allow
-------------------------------------

위와 같이 작성하였다면 다음을 실행시킨다.

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

또는,

# tcprules /etc/tcp.smtp.cdb /etc/tcp.smtp.tmp < /etc/tcp.smtp

sendmail 죽이기

우리는 이제 qmail로 모든 메일을 처리할 것이므로, 구형의 sendmail을 제거한다. 우선 당신의 sendmail 데몬을 찾아서 그것을 죽인다. 리눅스에서는

# ps ax | grep sendmail               <--- sendmail 데몬이 있는지를 확인한다.
# killall -TERM sendmail              <--- sendmail 데몬을 제거한다.
 
# ps ax | grep sendmail               <--- 다시 sendmail 데몬이 살아있는지를 확인한다.

/var/qmail/rc 생성하기

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

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

파일의 내용은 다음과 같다.

#!/bin/sh
# Using splogger to send the log through syslog. 
# Using dot-forward to support sendmail-style ~/.forward files. 
# Using procmail to deliver messages to /var/spool/mail/$USER by default.
 
exec env - PATH="/var/qmail/bin:$PATH" \
           qmail-start '|preline procmail' splogger qmail 

그리고나서, 약간의 수정을 한다. 다음 14. 에서도 나오지만, 우리가 메일 수신을 각자의 홈 디렉토리밑의 /Maildir/ 디렉토리로 하기 때문이다. 다음과 같이 수정한다.

# vi /var/qmail/rc
-------------------------------------------------------------------
#!/bin/sh
# Using splogger to send the log through syslog. 
# Using dot-forward to support sendmail-style ~/.forward files. 
# 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 
-------------------------------------------------------------------

./Maildir/ 이것만 추가한 것이다.

각 사용자별로 메일 송수신을 위한 디렉토리 만들기.

우리는 /Maildir 디렉토리에 모든 송수신 메일을 저장할 것이다. 사용자별로 디렉토리를 만들기 위해서는, 반드시 그 사용자가 되어야 한다. qmail 을 설치하기 전에 존재하는 모든 사용자에게 대해서,
그 사용자 로그인상태에서 다음의 명령을 내려야 한다. root는 일반계정으로 메일이 포워딩되므로, 해 줄 필요가 없다. 대신에 root계정의 메일을 받을 일반계정(앞에서 알리아스를 해 준 계정
“silver”)에는 반드시 해 주어야 한다.

# su silver
$ /var/qmail/bin/maildirmake $HOME/Maildir
$ echo ./Maildir/ > ~/.qmail
$ exit
 
# su hook
$ /var/qmail/bin/maildirmake $HOME/Maildir
$ echo ./Maildir/ > ~/.qmail
$ exit
# ................
....................등등...

앞으로 추가되는 사용자마다 일일이 이런 명령을 내린다면 엄청난 시간낭비일 것이다. 그러므로, 사용자가 추가될 때마다 자동으로 이런 과정이 되도록 다음과 같이 한다.

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

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

리부팅하고, qmail의 정상적인 동작을 확인하기

시스템을 리부팅시킨다.

리부팅되고나서, /var/log/maillog 파일내용을 살펴보면, 끝부분에서 다음과 같은 라인이 보여야 한다.

qmail: status: local 0/10 remote 0/20

그렇지 않다면, qmail 설정에 문제가 있는 것이므로, 앞의 과정들을 다시 한번 꼼꼼히 살펴보고, 설정파일들을 자세히 검토해야만 한다.

ps ax 명령을 내리고나서, 다음과 같은 라인들이 보이는 지를 확인하다.

#ps ax
 562 ? S 0:00 svscan
 563 ? S 0:00 supervise qmail-send
 564 ? S 0:00 supervise log
 565 ? S 0:00 supervise qmail-smtpd
 566 ? S 0:00 supervise log
 567 ? S 0:00 qmail-send
 568 ? S 0:00 /usr/local/bin/multilog t /var/log/qmail
 569 ? S 0:00 /usr/local/bin/multilog t /var/log/qmail/smtpd
 570 ? S 0:00 /usr/local/bin/tcpserver -v -p -x/etc/tcp.smtp.cdb
  -u 501 -g 501 0 25 /var/qmail/bin/qmail-smtpd
 576 ? S 0:00 splogger qmail
 577 ? S 0:00 qmail-lspawn |preline procmail
 578 ? S 0:00 qmail-rspawn
 579 ? S 0:00 qmail-clean

모양이나 숫자들이 약간씩 틀리더라도, 반드시 13개의 프로세서가 동작하고 있어야 한다. 위와 동일한 프로세서가 없다면, qmail 설정에 문제가 있는 것이다.

host 내부에서 사용자간의 메일 송수신을 확인해 본다.

silver는 호스트안에 계정이 있는 사용자이어야 한다.

% echo to: silver | /var/qmail/bin/qmail-inject

그러면, 내용은 없고 메일헤더만 있는 메일이 바로 silver에게 송신되어 있어야 하고, 새로이 도착되는 메일은 silver/Maildir/new/ 밑에 수신메일마다 개개의 파일로 저장된다. /var/log/maillog
파일안의 끝부분에는 다음과 같은 줄들이 보여야 한다.

qmail: new msg 53 
qmail: info msg 53: bytes 246 from <me@domain> qp 20345 uid 666
qmail: starting delivery 1: msg 53 to local me@domain 
qmail: status: local 1/10 remote 0/20
qmail: delivery 1: success: did_1+0+0/
qmail: status: local 0/10 remote 0/20
qmail: end msg 53 ( 53은 inode 숫자이고, 20345 는 프로세서 ID이다. 여러분한테는 이 번호들이 다를 것이다.

호스트의 root 또는 postmaster 에게 메일을 전송하기.

우리는 앞에서 root, postmaster, mailer-daemon의 alias 를 설정하였다. 그 alias가 정상적으로 동작하는지를 확인한다.

% echo to: POSTmaster | /var/qmail/bin/qmail-inject

POSTmaster의 alias 를 설정한 계정 (앞에서는 silver)으로 온 메일을 확인한다.

메일 수신 테스트하기

(제일 중요한 부분이다. 메일이 송신은 잘되어도, 수신이 안되는 경우가 허다하다.)
SMTP 서버가 정상적으로 동작하는지를 검사한다.
dude 는 호스트의 유효한 계정이어야 한다. me@domain 은 hook@hanmail.net 과 같은 유효한 메일주소이어야 한다.

       $ telnet 127.0.0.1 25
       Trying 127.0.0.1...
       Connected to 127.0.0.1.
       Escape character is '^]'.
       220 domain ESMTP
       helo dude
       250 domain
       mail <me@domain>
       250 ok
       rcpt <me@domain>
       250 ok
       data
       354 go ahead
       Subject: testing
 
       This is a test.
       .
       250 ok 812345679 qp 12345
       quit
       221 domain
       Connection closed by foreign host.
       $

메일이 정상적으로 도착했는지를 확인하다.

메일을 다른 호스트의 메일계정으로 포워딩하기

근래는 대부분의 사용자가 여러 개의 메일계정을 가지는 경우가 많다. 굳이 서버의 용량을 낭비하고, 서버의 성능에 부하를 주면서까지 메일을 직접 서버에 남겨둘 필요가 없는 경우가 많다. 그렇기
때문에, 도착하는 메일을 바로 다른 호스트의 메일계정으로 포워딩시키는 방법을 쓴다. qmail에서는 각 사용자가 아주 간단하게 메일 포워딩을 할 수 있는데, 자신의 계정 디렉토리의 .qmail 파일에
포워딩되어질 메일계정을 써주면 된다.

$ cd
$ vi .qmail
---------------------------------------------
@hanmail.net
---------------------------------------------

메일주소앞에 &기호는 넣어도 되고, 싫으면 넣지 않아도 무관하다.

pop3 설치하기

이제 pop3를 위한 설정을 해보자. 메일 서버에 있는 메일을 자신의 컴퓨터 메일 클라이언트로 가져오기 위해서는 반드시 메일서버가 pop3를 지원해야 한다. 이를 위한 설치와 설정은 다음과 같다.

먼저 checkpassword를 설치한다. 이것은 사용자명과 암호를 인증하는데 사용된다. 다른 소스도 /root/temp 디렉토리에 풀었으니 이것도 거기에다 풀어보자.

#cd /root/temp
#tar -zxvf checkpassword-0.81.tar.gz

checkpassword를 컴파일하고 설치한다.

#cd checkpassword-0.81
#make 
#make setup check

이제 checkpassword가 제대로 설치되었는지 확인해보자.

# /var/qmail/bin/qmail-popup chsd.chonnam.ac.kr /bin/checkpassword pwd
+ok <1311.955932232@hsd.chonnam.ac.kr>
user dakeshi
+ok
pass foryou
-ERR authorization failed

제대로 password를 입력하지 않는다면, 위와 같은 결과가 나타난다. 제대로 된 password를 입력하면,

# /var/qmail/bin/qmail-popup hsd.chonnam.ac.kr /bin/checkpassword pwd
+ok <1311.955932232@hsd.chonnam.ac.kr>
user dakeshi
+ok
pass forme
/home/dakeshi

라고 나올 것이다.

이제는 호스트가 부팅될 때마다 자동적으로 pop3가 동작하도록 /etc/rc.d/rc.local 파일의 마지막에 다음의 내용을 추가한다.

#start qmail POP3 server
/usr/local/bin/tcpserver 0 110 /var/qmail/bin/qmail-popup FQDN \
/bin/checkpassword /var/qmail/bin/qmail-pop3d Maildir &
( FQDN에는 호스트네임과 도메인 네임을 써준다. 여기서는 chsd.chonnam.ac.kr )

Q-mail에서 pop3 데몬 띠우기

모든 메일 프로그램이 그렇듯 메일을 보내고 받기 위해서는 SMTP 와 POP3 프로토콜을 이용한다. 그래서 리눅스 박스에서는 각각의 데몬을 띠워 주어야 한다. 하지만 필자는 POP3데몬이 띠워지지 않았다. 원래 Q-mail 에서는 /etc/rc.d/rc.local 파일에다가

---------------------/etc/rc.d/rc.local---------------------------------------
#start qmail POP3 server
/usr/local/bin/tcpserver 0 110 /var/qmail/bin/qmail-popup myfeel.hoseo.ac.kr \
/bin/checkpassword /var/qmail/bin/qmail-pop3d Maildir &
--------------------------------------------------------------------------

위와 같이 적어주었다. 하지만 부팅할 때 마다 다음과 같은 에러가 뜨면서 POP3 데몬이 뜨지 않았다.
tcpserver: fatal: unable to bind: address already used
필자는 위의 에러를 보고 첨에는 bind 때문인 줄 알았다. 하지만 관련 문서를 뒤지다가 우연히 전에 설치했었던 sendmail 과 qpopper 가 생각났다. 역시 문제는 여기에 있었다. /etc/inetd.conf 파일을 보니 qpopper 부분이 활성화 되어 있었다. 얼른 그 부분에 주석을 첨가하고 다시 inetd을 치고 나서, 다시 부팅을 하니 에러 없이 데몬이 실행 되었다. 그러니까 결과 적으로 한 포트에 2개의 POP3 프로그램을 띠우려다가 문제가 발생한 것이었다. 참고로 qpopper은 POP3 프로그램의 일종이다.

  • computer/networking/큐_메일_설치하기.txt
  • Last modified: 3 years ago
  • by likewind