Server&OS/Q-mail
qmail 설치
백룡화검
2008. 7. 2. 13:23
====== 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>