본문 바로가기
Server&OS/Q-mail

qmail 설치

by 백룡화검 2008. 7. 2.
====== qmail에 대해 ======

http://qmail.kldp.org
http://cr.yp.to/qmail.html

(유연성) sendmail < exim < postfix < qmail (퍼포먼스)

qmail 구조도: http://www.nrg4u.com/

==== 프로세스 구조 =====

<code>
svscan /service 
  +--supervise pop3d 
  |   `--tcpserver ... -x tcp.cdb ... 110 qmail-popup ... qmail-pop3d Maildir 
  +--supervise smtpd 
  |   `--tcpserver ... -x ~tcp.smtp.cdb ... 25 qmail-smtpd (qmaild)
  |       `-- qmail-smtpd (qmaild)
  +--supervise qmail 
  |   `--qmail-send (qmails)
  |       |--multilog, (qmaill)
  |       |--qmail-clean (qmailq)
  |       |--qmail-lspawn ./Maildir/
  |       `--qmail-rspawn (qmailr)
  |            `-- qmail-remote (qmailr) : 메일배달
</code>

프로세스 진행은 다음과 같다. (프로세스의 중심에 qmail-queue 와 qmail-send 가 위치한다. 참고: http://cr.yp.to/qmail/pictures.html)

== 원격에서 로컬로 메일을 받는 경우: ==
  - qmail-smtpd : 다른 서버의 SMTP에서 메시지를 받는다. 로컬로 받아들일 주소인지 (rcpthosts) 확인한다. 
  - qmail-queue : 디스크에 메시지를 저장하고 qmail-send 호출.
  - qmail-send : 겉봉에 쓰인 수신인 주소를 보고 로컬로 배달할 것인지 판단한다.
  - qmail-lspawn : 편지함 이름 및 해당 사용자의 설정을 파악하고, qmail-local을 실행한다.
  - qmail-local : 해당 편지함에 메시지를 기록한다.

== 로컬에서 원격으로 메일을 보내는 경우: ==
  - qmail-inject : 누가 누구에게 보내는 것인지 겉봉에 기록한다.
  - qmail-queue : 디스크에 메시지를 저장하고 qmail-send 호출.
  - qmail-send : 겉봉에 기록된 수신인이 누구인지 파악해 로컬로 전달할지 원격서버로 전달할지 결정한다
  - qmail-rspawn
  - qmail-remote : 원격서버를 DNS에서 찾아서 SMTP로 연결한다.


====== qmail 설치하기 ======


참고문서:

[[http://qmail.kldp.org/wiki/wiki.php/%BC%B3%C4%A1%B0%A1%C0%CC%B5%E5|qmail 설치 가이드]]

[[http://people.kldp.org/~eunjea/qmail/|큐메일 + vpopmail 하우투]]

===== 1. ucspi-tcp, daemontools 설치 =====

기본적으로 [[:daemontools|daemontools]], [[http://cr.yp.to/ucspi-tcp.html|ucspi-tcp]]가 필요하다. (이것은 djbdns 등의 패키지에도 필요한 것이므로 이미 설치했을 수도 있다.)

==Linux:==
컴파일 과정에서 collect2: ld returned 1 exit status 에러가 발생할 수 있다. 이것은 최근버전인 glibc-2.3.1 때문에 생기는 것이다.
그러므로 [[http://djbware.csi.hu/patches/|errno 관련 패치]]를 설치해야 한다. ([[http://qmail.org/moni.csi.hu/pub/glibc-2.3.1/|여기에서도 다운받을]] 수 있다.) 
여기서는 [[http://www.qmail.org/netqmail/|netqmail]] 안에 들어있는 패치를 이용하는 것으로 한다.
<code>
# cd /usr/local/src
# tar xzf ucspi-tcp-0.88.tar.gz
# cd ucspi-tcp-0.88
# patch -p1 < ../netqmail-1.05/other-patches/ucspi-tcp-0.88.a_record.patch
# patch -p1 < ../netqmail-1.05/other-patches/ucspi-tcp-0.88.nodefaultrbl.patch
# patch -p1 < ../netqmail-1.05/other-patches/ucspi-tcp-0.88.errno.patch
# make 
# make setup check
</code>
<code>
# mkdir -p /package
# chmod 1755 /package
# cd /package
# tar xzf daemontools-0.76.tar.gz
# rm daemontools-0.76.tar.gz
# cd admin/daemontools-0.76
# patch -p1 < /usr/local/src/netqmail-1.05/other-patches/daemontools-0.76.errno.patch
# package/install
</code>
설치가 끝나면 /service 와 /command 디렉토리가 추가로 만들어진다. 실제 실행파일들은 admin/daemontools/command 디렉토리 안에 생겨나고 /command 와 /usr/local/bin 에는 심볼릭 링크가 생긴다. 
또 /etc/inittab 에는 재부팅시 시동을 위해 /command/svscanboot 라는 내용이 추가되어있다.
(daemontools의 설치가 끝나면 svscanboot가 자동으로 시작된다.)

==FreeBSD:==
<code>
# cd /usr/ports/sysutils/ucspi-tcp
# make install clean
</code>
<code>
# cd /usr/ports/sysutils/daemontools
# make install clean
# mv /usr/local/etc/rc.d/svscan.sh.sample /usr/local/etc/rc.d/svscan.sh
# echo 'svscan_enable="YES"' >> /etc/rc.conf
</code>
(그냥 qmail을 포트로 설치해서 의존성이 걸린 것을 다 함께 설치할 수도 있다.)


===== 2. qmail 컴파일/설치 =====

qmail 유저와 그룹을 생성하고(qmail 소스 디렉토리 안의 INSTALL.ids 참조), qmail을 /var/qmail 디렉토리에 설치한다.

== Linux: ==
<code>
# 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
</code>

qmail 소스에 대한 [[http://qmail.org/top.html#patches|몇가지 패치]]가 필요하다.
여기서는 패치가 포함되어 있는 [[http://www.qmail.org/netqmail/|netqmail]]을 사용하기로 한다.
<code>
# cd netqmail-1.05
# ./collate.sh
# cd netqmail-1.05
# make
# make setup check
</code>

==FreeBSD:==
FreeBSD에서는 포트 설치에 따라 자동으로 그룹이 생성된다. (nofiles 대신 qnofiles라는 그룹명을 사용하고 있다.)

먼저 기본 패치를 적용한 다음, [[http://members.elysium.pl/brush/qmail-smtpd-auth/|smtp-auth]] 등 추가 패치를 해야 한다.
qmail-smtpd-auth+tls 포트 또는 qmail-spamcontrol 포트 설치만으로는 relay test를 100% 통과하지 못한다. qmail-smtpd-relay-reject 패치가 필요하다.
<code>
# cd /usr/ports/mail/qmail
# make patch WITH_QMAILQUEUE_PATCH=yes WITH_BIG_TODO_PATCH=yes
# cd ./work/qmail-1.03
# fetch http://www.bsdguides.org/downloads/freebsd/qmail-smtpd-auth.patch 
# patch < qmail-smtpd-auth.patch
# fetch http://qmail.org/qmail-smtpd-relay-reject
# patch < qmail-smtpd-relay-reject
# cd ../..
# make install WITH_QMAILQUEUE_PATCH=yes WITH_BIG_TODO_PATCH=yes
</code>

( /etc/rc.conf 파일에 sendmail_enable="NONE” 줄을 추가해준다.)
<code>
# make disable-sendmail
# make enable-qmail
</code>
만약 위에서 install 하지않고 install clean을 했다면 여기서 에러가 뜬다. 그러면 수동으로 /etc/mail/mailler.conf 파일을 수정해주면 된다. 내용은 다음과 같다.
<code>
sendmail /var/qmail/bin/sendmail
send-mail /var/qmail/bin/sendmail
mailq /var/qmail/bin/qmail-qread
newaliases /var/qmail/bin/newaliases
</code>

===== 3. qmail 기본 설정 =====

==== 기본 도메인 (config) ====
/var/qmail/control 디렉토리에 me, defaultdomain, plusdomain, locals, rcpthosts 파일을 생성한다.
== Linux: ==
소스 디렉토리에서 계속 작업한다.
<code>
# ./config-fast domain.com
</code>
== FreeBSD ==
<code>
# cd /var/qmail/configure
# ./config-fast domain.com
</code>

==== 기본 alias 계정  ====

postmaster, mailer-daemon, root 주소로 도착하는 메일을 받아볼 계정을 지정한다.
로컬 계정의 이름 대신 email 주소를 써도 된다.
내용을 기입하지 않으면 root@호스트 계정으로 메일이 발송된다.
(qmail 소스에 있는 INSTALL.alias를 참고하라.)
<code>
# cd ~alias;
# echo master@domain.com > .qmail-root
# echo master@domain.com > .qmail-postmaster
# echo master@domain.com > .qmail-mailer-daemon
# chmod 644 ~alias/.qmail-*
</code>

===== 4. 서비스 스크립트 만들기 =====

모두 3가지의 스크립트를 만들어야 한다.
  * qmail 배달 : /var/qmail/service/qmail 아래
  * SMTPd : /var/qmail/service/smtpd/ 아래
  * POP3d : /var/qmail/service/pop3d/ 아래
다른 문서를 보면 service 대신 supervise 라는 이름으로 디렉토리를 만들어서 쓰기도 한다.
또 어떤 문서에서는 /var/qmail 아래에 qmail-pop3d.sh, qmail-smtpd.sh 같은 스크립트를 만들어서 쓰기도 한다.
여기서는 daemontools로 qmail를 구동/관리할 것이다.
일단 [[http://www.din.or.jp/~ushijima/qmail-conf.html|qmail-conf]]를 설치하고, 이를 이용해 좀 더 쉽게 스크립트를 만들기로 한다.

==== 4-1. qmail-conf 설치 ====
[[http://www.din.or.jp/~ushijima/qmail-conf/install.html|qmail-conf]]를 설치하면 /var/qmail/bin 안에 qmail-*-conf 파일들이 생겨난다.

== Linux: ==
필요에 따라 conf-* 파일을 편집한다.
qmail-conf는 djbdns 소스를 필요로 한다. (이때 djbdns 역시 errno 패치가 다운받아서 적용하도록 한다.)
<code>
# tar xzf qmail-conf-0.60.tar.gz
# cd qmail-conf-0.60/
# tar xzf ../djbdns-1.05.tar.gz
# cd djbdns-1.05/
#  patch -p1 < ../../djbdns-1.05.errno.patch
# cd ..
# make -f Makefile.ini djbdns=./djbdns-1.05
# make
# make setup check
</code>

== FreeBSD: ==
<code>
# cd /usr/ports/mail/qmail-conf
# make install clean
</code>

==== 4-2. qmail 배달 스크립트 ====

<code>
# /var/qmail/bin/qmail-delivery-conf qmaill /var/qmail/service/qmail
</code>
이렇게 해서 만들어진 /var/qmail/service/qmail/run 파일은 /var/qmail/rc 를 실행하게 되어있다.
(여기서 하는 역할은 qmail-start ./Maildir/ 를 실행하는 것이다.)

기본적으로 로그기록은 /var/log/qmail 에 남기도록 되어있다.
<code>
# mkdir /var/log/qmail
# chmod 750 /var/log/qmail (750이 아니라 1755인가?)
# chown qmaill /var/log/qmail
</code>

이것을 다른 서비스(pop3d, smtpd)와 통일시킨답시고, 다음처럼 옮겼을 경우, 문제가 생기는 것 같다.
<code>
# rmdir /var/log/qmail
# ln -s /var/qmail/service/qmail/log/main /var/log/qmail
</code>
다른 서비스(pop3d,smtpd)는 log/run에서만 multilog를 불러서 쓰지만, qmail은 log/run 뿐만 아니라 자체 run에서도 multilog를 불러내서 쓴다. (log/run이 제 역할을 하는지가 의문이긴 하다.)

== qmail-start ==
(아래 5. /var/qmail/rc 참조)

==== 4-3. SMTPd 스크립트 ====

<code>
# /var/qmail/bin/qmail-smtpd-conf qmaild qmaill /var/qmail/service/smtpd
</code>

각종 설정: CONCURRENCY는 기본값이 아마 30일 것이다. 대형서비스는 200까지 늘려준다. DATALIMIT는 qmail-queue가 사용할 수 있는 허용 메모리를 증가시키는 것이다. QMAILQUEUE는 기본값으로 /var/qmail/bin/qmail-queue 로 설정되어 있다.
<code>
# cd /var/qmail/service/smtpd/
# echo '127.0.0.1:allow,RELAYCLIENT=""' > tcp
# echo ":allow" >> tcp
# echo "100" > env/CONCURRENCY
# echo "5000000" > env/DATALIMIT 
# make
</code>

/var/qmail/service/smtpd/run 스크립트를 필요에 따라 수정한다.

** SMTP_AUTH 패치 사용시: **
qmail-smtpd 뒤에다 도메인명 /bin/cmd5checkpw 를 붙여준다. (FreeBSD에서 /usr/ports/security/cmd5checkpw 포트 설치 필요.)

** vpopmail open-smtp 사용시: ** 방금 만든 tcp.cdb 대신 vpopmail의 POP3 인증을 이용할 것이므로 tcp.cdb 를 ~vpopmail/etc/tcp.smtp.cdb 로 바꾸면 된다. ([[vpopmail]] 참조.)

** SMTP_AUTH 패치 + vpopmail 사용시: **
qmail-smtpd 뒤에다 "도메인명 ~vpopmail/bin/vchkpw" 를 붙여준다. (이때는 vpopmail쪽의 tcp.smtp.cdb를 사용하지 않아도 된다.)
여기서 vchkpw를 사용한다는 것은 vpasswd.cdb 파일을 읽는다는 의미다. 그러므로 vpopmail의 권한이 필요하다.

QMAILDUID=`id -u vpopmail`
NOFILESGID=`id -g vchkpw`
이렇게 하고 tcpserver 의 옵션에 -u QMAILDUID -g NOFILESGID 를 붙여주어야 할 것이다.

qmail-conf 로 자동생성한 스크립트라면 envuidgid qmaild 를 envuidgid vpopmail로 바꿔주면 된다.
그리고 끝부분에 /usr/local/vpopmail/bin/vchkpw /usr/bin/true 를 붙여준다

참조: http://qmail.kldp.org/wiki/wiki.php/QmailRelay%BE%CF%C8%A3%C0%CE%C1%F5STARTTLS

** 문제점: **
보낼때 인증을 하는 것은 성공했다. 그런데 서버에서 서버로 보내는 과정에서 SMTP 접속이 안되는 문제가 발생한다.
deferral: Sorry,_I_wasn't_able_to_establish_an_SMTP_connection._(#4.4.1)


== qmail-smtpd ==
http://cr.yp.to/ucspi-tcp/tcpserver.html
http://www.qmail.org/qmail-manual-html/man8/qmail-smtpd.html

==== 4-4. POP3d 스크립트 ====

** vpopmail을 사용하지 않는 경우: **
[[http://cr.yp.to/checkpwd.html|checkpassword]]를 이용해 암호 인증을 한다.
<code>
# cd /usr/local/src
# tar xzf checkpassword-0.90.tar.gz
# cd checkpassword-0.90
# patch -p1 < ../checkpassword-0.90.errno.patch
# make
# make setup check
</code>
<code>
# /var/qmail/bin/qmail-pop3d-conf /bin/checkpassword qmaill /var/qmail/service/pop3d
</code>

** vpopmail을 사용하는 경우: **
<code>
# /var/qmail/bin/qmail-pop3d-conf ~vpopmail/bin/vchkpw qmaill /var/qmail/service/pop3d
</code>

** 세부 설정: **
tcp는 기본으로 :deny로 잡혀있으므로 변경해야 한다.
CONCURRENCY 기본값은 30 정도인데, 대형서비스라면 200 정도로 설정한다.
<code>
# cd /var/qmail/service/pop3d/
# echo ":allow" > tcp
# echo "100" > env/CONCURRENCY
# make
</code>

== qmail-popup ==

== qmail-pop3d ==

===== 5. /var/qmail/rc 편집, 메일함 설정 =====

위에서 만든 qmail 배달 스크립트가 /var/qmail/rc 를 실행하게끔 되어있는 상태다.

== Linux: ==
/var/qmail/rc가 자동설치되지 않았으므로 /var/qmail/boot/에 있는 파일을 복사해서 쓴다. 
<code>
# cp /var/qmail/boot/home /var/qmail/rc.
</code>
== FreeBSD: ==
tcpserver를 이용해 qmail을 구동할 것이므로, 시스템 시작시의 스크립트는 필요없다. (/var/qmail/rc 로 심볼링링크되어있다.)
<code>
# rm /usr/local/etc/rc.d/qmail.sh 
</code>

==== ====
/var/qmail/rc 의 내용은 이렇다.
<code>
#!/bin/sh
exec env - PATH="/var/qmail/bin:$PATH" \
qmail-start ./Mailbox splogger qmail
</code>

=== 편지함을 Maildir 형태로 변경 ===
/var/qmail/rc 내용 중에서 './Mailbox'를 './Maildir/' 로 바꾼다.
(qmail 소스에 있는 INSTALL.mbox, INSTALL.vsm, INSTALL.maildir 을 참고할 것.)
기존 계정사용자는 maildirmake 를 이용해 Maildir 로 바꿔준다.

=== 로그 기록 프로그램 변경 ===
/var/qmail/rc 내용 중에서 'splogger qmail'를 'multilog t /var/log/qmail' 로 바꾼다.

결과물: (물론 이 파일에는 실행 퍼미션이 주어져 있어야 한다.)
<code>
\!/bin/sh
exec env - PATH="/var/qmail/bin:$PATH"
qmail-start ./Maildir/ /usr/local/bin/multilog t /var/log/qmail qmaill
</code>

 /var/qmail/control/rcpthosts 가상 도메인을 사용하신다면 따로 적어주셔야 합니다

===== 6. 서비스 시작 =====

==== sendmail 대체 ===

== Linux: ==
# ln -s /var/qmail/bin/sendmail /usr/lib
# ln -s /var/qmail/bin/sendmail /usr/sbin
== FreeBSD: ==

==== 서비스 시작 ====

daemontools 서비스 디렉토리에 링크를 걸어주면 5초 이내에 서비스가 시작된다.
<code>
# mkdir /service 
# ln -s /var/qmail/service/* /service/
</code>
* FreeBSD의 경우 /service 대신 /var/service 를 사용한다.

** 삽질 주의: **
  * Linux에서 설정에 별 문제가 없는데도 unable to open supervise/ok: file does not exist 이라는 에러가 나오고 서비스가 작동하지 않는다면, 이미 서비스가 구동된 상태에서 또 구동시키는 것일 수 있다. killall svscanboot 를 해보자.
  * 마찬가지로 pop3d 쪽의 tcp.cdb를 변경했는데 제대로 반영이 되지 않는다면, svc -t /service/pop3d 를 해보자.



===== 7. 각종 설정 =====

일부 문서에서는 smtp 릴레이를 위해 /etc/tcp.smtp를 편집하는데, 여기서는 위의 SMTPd 스크립트를 만들면서 해결했다.

=== 메일을 받을 도메인 ===
메일을 받을 로컬 호스트 도메인을 /var/qmail/control/rcpthosts 에적어준다.
가상도메인 목록은 /var/qmail/control/virtualdomains 에 기록한다.
vpopmail을 사용할 경우 가상도메인은 자동으로 기록된다.
  
=== 더블바운스되는 메일 삭제하기 ===
<code>
# echo "#" > ~alias/.qmail-doublebounce
# echo "doublebounce" > /var/qmail/control/doublebounceto 
</code>

=== qmail 서버 속도 향상 ===
기본적으로 tcpserver는 모든 ip 주소의 DNS 와 ident 를 체크한다. -H -R 옵션을 사용하면 이를 체크하지 않으므로 속도 향상을 볼수 있다.

====== 그외 ======
[[vpopmail]], [[qmailadmin]], [[spam]]을 참고하라.

==== 이메일 작동 여부 점검하기 ====

== qmail 인증체크 테스트 ==
<code>
# mail -v -s 'test' xxx@xxx.co.kr < /dev/null
Null message body; hope that's ok
xxx@xxx.co.kr... Connecting to zzz.zzz.co.kr. via relay...
220 zzz.zzz.co.kr ESMTP
>>> EHLO localhost.localdomain
250-zzz.zzz.co.kr
250-STARTTLS
250-AUTH LOGIN CRAM-MD5 PLAIN
250-AUTH=LOGIN CRAM-MD5 PLAIN
250-PIPELINING
250 8BITMIME
>>> STARTTLS
454 TLS missing certificate: error:02001002:system library:fopen:No such file or directory (#4.3.0)
>>> MAIL From:<root@localhost.localdomain> AUTH=root@localhost.localdomain
250 ok
>>> RCPT To:<xxx@xxx.co.kr>
>>> DATA
250 ok
354 go ahead
>>> .
250 ok 1086753464 qp 32406
xxx@xxx.co.kr... Sent (ok 1086753464 qp 32406)
Closing connection to zzz.zzz.co.kr.
>>> QUIT
221 zzz.zzz.co.kr 
</code>

== SMTP Relay 테스트 ==
<code>
# telnet relay-test.mail-abuse.org
</code>

'Server&OS > Q-mail' 카테고리의 다른 글

qmail 설치시 에러  (0) 2008.07.11
qmail 설치 따라하기  (0) 2008.07.10
qmail 설치 가이드  (0) 2008.07.10
qmail 설치  (0) 2008.07.02
Qmail 설치  (0) 2008.07.02