목차 (INDEX)
개요
이번에는 무료로 사용할 수 있는 MTA인 Qmail을 사용하여 메일서버를 구축해 보겠습니다.
Qmail은 1998년 6월에 현재의 1.03 버전이 출시되었는데, 그때부터 푹 빠져버린 멋진 MTA죠;
당시 시큐리티 홀이 엄청나게 많았던 Sendmail과는 달리, 고속이면서 매우 심플하고 견고한 구조를 지향하면서 개발되었습니다.
시큐리티 홀을 발견하면 500달러의 상금을 주겠다고 해서 화제가 되기도 했었습니다.
vpopmail과 연동하면 1개의 서버(1개의 IP)에서 여러 개의 도메인 관리가 웹으로 가능합니다.
dnscache + ezmlm 과 연동하면 엄청난 속도로 대량의 메일을 발송할 수 있고, 역시 웹에서 관리하기 편합니다.
Courier-Authlib + Courier-IMAP을 붙이면 POP3 SSL / IMAP SSL 구현이 가능하며, ucspi-tcp에 ssl패치를 적용하여 SMTP SSL 구현 역시 가능합니다 (글쓴이의 환경은 smtps / imaps 적용 중)
이처럼 다양한 패키지와 연동함으로써 자신의 용도에 맞게 메일서버를 구축해서 운용할 수 있습니다.
목표
이미 구축해서 사용 중인 Qmail + VPopmail + qmailadmin + Courier-Authlib + Courier-IMAP (IMAP SSL, SMPT SSL 적용) 구성을 기록해 둡니다.
다음 목표는 Courier-Authlib + Courier-IMAP 구성을 Dovecot으로 전환(검토)이 될 듯합니다.
구축 환경 요약
- 가상 도메인 관리가 가능하므로 하나의 MTA로 여러 개의 도메인을 관리 가능
- self-signed X.509 key를 생성하여 IMAP over SSL과 SMTP over SSL을 구현
- dnscache를 적용 (메일 발송의 고속화) ← 대량의 메일링 리스트 발송 시 효과적
- Mailing List기능 적용 (ezmlm)
- 웹 관리 인터페이스 적용 (qmailadmin,
vqadmin) - daemontools를 이용하여 qmail관련 모든 프로세스와 디렉터리를 실시간 자동 감시 & 자동 리로드 실행 (supervise, svscan, multilog)
구축 완료 후의 프로세스 실행 내역
Qmail이 시작되고 나면 아래와 같은 메시지가 syslog에 나타나야 합니다 (default)
qmail: status: local 0/10 remote 0/20
ps 명령으로 qmail daemon을 찾아봅니다 ( ps -fg |grep qmail )
최소 4개의 데몬이 실행중이어야 하며 모두 idle상태이어야 합니다. qmail-send, running as qmails / qmail-lspawn, running as root / qmail-rspawn, running as qmailr / qmail-clean, running as qmailq
구축이 완료된 후, 아래와 같은 프로세스가 실행되는 환경이 될 것입니다. (svscan.service)
[root@centos7 ~]# systemctl status svscan.service
● svscan.service - Daemontools svscan
Loaded: loaded (/usr/lib/systemd/system/svscan.service; enabled; vendor preset: disabled)
Active: active (running) since Sat 2019-05-25 01:43:11 JST; 9h ago
Main PID: 4606 (svscanboot)
CGroup: /system.slice/svscan.service
├─ 2431 tcpserver-ssl -v -s -x /home/vpopmail/etc/tcp.smtp.cdb -n /var/qmail/control/clientcert.pem -R -H -l0 -u 1009 -g 1004 0 smtps q...
├─ 3863 tcpserver-ssl -v -s -x /home/vpopmail/etc/tcp.smtp.cdb -n /var/qmail/control/clientcert.pem -R -H -l0 -u 1009 -g 1004 0 smtps q...
├─ 4606 /bin/sh /command/svscanboot
├─ 4667 svscan /service
├─ 4668 readproctitle service errors: ....................................................................................................
├─ 4673 supervise qmail
├─ 4674 supervise log
├─ 4675 supervise smtpd
├─ 4676 supervise log
├─ 4677 supervise smtps
├─ 4678 supervise log
├─ 4679 supervise dnscache
├─ 4680 supervise log
├─ 4681 tcpserver -vHRl0 -x /home/vpopmail/etc/tcp.smtp.cdb -u 1009 -g 1004 0 smtp qmail-smtpd example.com /home/vpopmail/bin/vchkpw ...
├─ 4682 multilog t s1000000 n20 /var/log/qmail/smtps
├─ 4683 qmail-send
├─ 4684 tcpserver-ssl -v -s -x /home/vpopmail/etc/tcp.smtp.cdb -n /var/qmail/control/clientcert.pem -R -H -l0 -u 1009 -g 1004 0 smtps q...
├─ 4686 /usr/local/bin/dnscache
├─ 4687 multilog t s1000000 n20 /var/log/qmail
├─ 4691 multilog t s1000000 n20 * +* stats * * * ./dnsstatus +* ./main
├─ 4695 qmail-lspawn ./Maildir/
├─ 4696 qmail-rspawn
├─ 4697 qmail-clean
├─ 4703 multilog t s1000000 n20 /var/log/qmail/smtpd
├─28755 tcpserver-ssl -v -s -x /home/vpopmail/etc/tcp.smtp.cdb -n /var/qmail/control/clientcert.pem -R -H -l0 -u 1009 -g 1004 0 smtps q...
└─32161 tcpserver-ssl -v -s -x /home/vpopmail/etc/tcp.smtp.cdb -n /var/qmail/control/clientcert.pem -R -H -l0 -u 1009 -g 1004 0 smtps q...
환경 정보
CentOS Linux release 7.6.1810 (Core)
Apache/2.4.39 (Unix)
OpenSSL 1.1.1b 26 Feb 2019
nghttp nghttp2/1.38.0
mysql Ver 8.0.16 for Linux on x86_64 (MySQL Community Server - GPL) << vpopmail, ezmlm 연동
메일서버 : mail.naruhodo.cf / 123.123.123.10 / CentOS7
Client : 10.1.1.30 / MacBook
Source Directory : /usr/local/src << 이곳에서 필요한 소스를 보관하고 컴파일합니다. (처음이라면 생성해줍니다.)
사전 준비 / 고려사항
■ 유효한 도메인이 최소 1개 필요합니다
- naruhodo.cf를 다시 이용합니다
- 아직 도메인을 취득하지 않았다면 CentOS7 - 무료도메인 취득/설정하기 (freenom) (3/10) 글을 참고하세요
■ SELinux는 비활성화해 둡니다.
- CentOS7 - OS설치하기 (1/10) 글의 SELinux무효화 부분을 참고하세요.
■ 메일 서버용 공인 IP를 확인합니다.
# 유동IP환경에서 1개의 공인IP를 받아서 사용하는 환경의 예입니다.
[root@centos7 ~]# ip r
default dev ppp0 scope link
default via 11.0.0.254 dev p1p1 proto dhcp metric 100
10.1.0.0/16 dev p1p1 proto kernel scope link src 10.1.1.30 metric 100
123.123.123.1 dev ppp0 proto kernel scope link src 123.123.123.10 # << 퍼블릭 고정 IP
203.123.123.180 via 10.1.0.254 dev p1p1 src 10.1.1.30
■ Name Server에서 메일서버(mail.naruhodo.cf)의 MX 레코드를 포함한 적절한 설정이 완료되어 있어야 합니다.
■ DNS Resolver 설정이 올바르게 설정되어 있는지 확인합니다. (표시되는 네임서버의 주소는 환경에 따라 다릅니다)
[root@centos7 ~]# cat /etc/resolv.conf
nameserver 8.8.8.8
■ nslookup / dig 등의 명령으로 외부 도메인을 쿼리 하는데 문제가 없어야 합니다.
[root@centos7 ~]# nslookup google.com
Server: 127.0.0.1
Address: 127.0.0.1#53
Non-authoritative answer:
Name: google.com
Address: 172.217.26.46
[root@centos7 ~]#
■ 간단한 설정으로 Qmail의 Sendmail Wrapper를 MUA가 이용할 수 있습니다
■ Anti-virus, Anti-spam 등의 컴포넌트를 연동하지는 않습니다.
■ 유저의 메일이 보관되는 곳이 /home 아래입니다. 실제 메일서버로 사용할 예정이라면 /home파티션의 용량을 충분히 확보한 후 진행하는 것이 좋습니다.
※ 각각의 패키지는 설정 파일을 수정하거나 컴파일하면서 진행되므로 컴파일 경험과 디버깅 경험이 있으면 도움이 될 겁니다.
Qmail Components
아래의 컴포넌트를 설치할 예정입니다.
설치할 Component | 설명 |
qmail-1.03 | 높은 보안성과 신뢰성, 그리고 효과적이고 간단한 MTA |
ucspi-tcp-0.88 | INETD데몬을 대체하는 빠른 성능의 SMTP서버. tcpserver, tcprules, rblsmtpd, tcpclient등이 포함됨 |
daemontools-0.76 | UNIX서비스를 관리하기 위한 툴 모음 (supervise, multilog, svc, svstat, svscan 등) |
autorespond-2.0.5 |
Autoresponder (자동응답 기능) |
vpopmail-5.4.33 | 가상도메인 및 가상유저관리, APOP인증과 POP Before SMTP대응 대규모서비스를 전개하는 경우, 가상유저를 SQL데이터베이스에 저장할 수 있음 |
qmailadmin-1.2.16 qmailadmin-help-1.0.8 |
가상도메인을 위한 Web-based관리자 인터페이스 |
vqadmin-2.3.7 | Web based control panel |
djbdns-1.05 | DNS Cache 및 DNS Server |
ezmlm-0.53 ezmlm-idx-5.1.2 |
사용하기 쉽고, 빠른 스피드의 Mailing List Manager |
courier-imap-4.1.1 | POP/IMAP서버, 경량이며 LDAP대응도 가능하므로 다수의 유저를 취급하는 경우에 적합 |
courier-authlib-0.58 |
Courier authentication library |
SMTP SSL과 IMAP SSL 적용하기
Qmail + Vpopmail + Courier-IMAP / Courier-Authlib 구성하기
❶ 준비
MTA로 Qmail을 사용할 것이므로 Postfix를 제거해 줍니다.
yum list installed |grep postfix
# 설치되어 있다면 제거합니다
yum -y remove postfix
userdel postfix
❷ Qmail 사용자 및 그룹 생성
/usr/local/src/qmail-1.03/INSTALL.ids을 참고해서 큐메일 사용자와 그룹을 생성해 줍니다.
mkdir /var/qmail
groupadd nofiles
useradd -g nofiles -d /var/qmail/alias -s /sbin/nologin -M alias
useradd -g nofiles -d /var/qmail -s /sbin/nologin -M qmaild
useradd -g nofiles -d /var/qmail -s /sbin/nologin -M qmaill
useradd -g nofiles -d /var/qmail -s /sbin/nologin -M qmailp
groupadd qmail
useradd -g qmail -d /var/qmail -s /sbin/nologin -M qmailq
useradd -g qmail -d /var/qmail -s /sbin/nologin -M qmailr
useradd -g qmail -d /var/qmail -s /sbin/nologin -M qmails
❸ Qmail설치
cd /usr/local/src
wget http://cr.yp.to/software/qmail-1.03.tar.gz
wget http://tomclegg.ca/qmail/qmail-smtpd-auth-0.31.tar.gz
wget http://qmail.jms1.net/patches/qmail-date-localtime.patch
wget http://qmail.org/qmail-smtpd-relay-reject
wget http://www.ckdhr.com/ckd/qmail-103.patch
tar zxvf qmail-1.03.tar.gz
tar zxvf qmail-smtpd-auth-0.31.tar.gz
cd qmail-1.03
mv ../qmail-date-localtime.patch ./
mv ../qmail-smtpd-relay-reject ./
mv ../qmail-smtpd-auth-0.31/*.* ./
mv ../qmail-103.patch ./
patch < qmail-date-localtime.patch
patch < qmail-smtpd-relay-reject
patch < auth.patch
patch < qmail-103.patch
vi error.h
extern int errno;
↓
#include<errno.h> # << redhat계열에서 편집 필요
vi conf-spawn
125 # << 125 - 255이하로 변경한다 (성능튜닝)
vi tls.c
char *strerror(int); # << 12 line : const char *strerror(int); 을 왼쪽과 같이 변경한다.
make
make setup check
./config-fast mail.naruhodo.cf # << 각자의 메일서버의 FQDN
config-fast를 실행하면 아래와 같은 동작을 자동으로 처리해 줍니다.
만약, 제대로 동작하지 않는다면 서버의 DNS 설정(MX 레코드)에 문제가 있을 수 있습니다.
echo mail.naruhodo.cf > /var/qmail/control/me
echo mail.naruhodo.cf > /var/qmail/control/defaultdomain
echo mail.naruhodo.cf > /var/qmail/control/plusdomain
echo mail.naruhodo.cf > /var/qmail/control/locals
echo mail.naruhodo.cf > /var/qmail/control/rcpthosts
[root@centos7 qmail-1.03]# ./config-fast mail.naruhodo.cf
Your fully qualified host name is mail.naruhodo.cf.
Putting mail.naruhodo.cf into control/me...
Putting naruhodo.cf into control/defaultdomain...
Putting co.jp into control/plusdomain...
Putting mail.naruhodo.cf into control/locals...
Putting mail.naruhodo.cf into control/rcpthosts...
Now qmail will refuse to accept SMTP messages except to mail.naruhodo.cf.
Make sure to change rcpthosts if you add hosts to locals or virtualdomains!
다운로드한 파일을 제거합니다
cd /usr/local/src
rm -f /usr/local/src/qmail-1.03.tar.gz
rm -f /usr/local/src/qmail-smtpd-auth-0.31.tar.gz
rm -fr /usr/local/src/qmail-smtpd-auth-0.31
Qmail recommended patches : http://qmail.org/top.html#patches
Qmail 기본 설정
echo 'MANPATH /var/qmail/man' >> /etc/man.config
echo ‘20971520’ > /var/qmail/control/databytes # << 수신메일사이즈의 상한을 지정 (20MB)
touch /var/qmail/control/doublebounceto # << 존재하지 않는 메일을 파기
Alias를 설정
관리자 계정이 admin@naruhodo.cf 인 경우
echo admin@naruhodo.cf > /var/qmail/alias/.qmail-mailer-daemon
echo admin@naruhodo.cf > /var/qmail/alias/.qmail-postmaster
echo admin@naruhodo.cf > /var/qmail/alias/.qmail-root
chmod 644 /var/qmail/alias/.qmail*
❹ ucspi-tcp (tcp server) 설치
d /usr/local/src
wget http://cr.yp.to/ucspi-tcp/ucspi-tcp-0.88.tar.gz
# smtp-ssl 대응
wget http://www.nrg4u.com/qmail/ucspi-tcp-ssl-20050405.patch.gz
tar zxvf ucspi-tcp-0.88.tar.gz
cd ucspi-tcp-0.88
zcat ../ucspi-tcp-ssl-20050405.patch.gz | patch # << error.h 패치를 포함
make
make setup check
cp /usr/local/src/ucspi-tcp-0.88/tcpserver /usr/local/bin/tcpserver-ssl
❺ daemontools 설치
daemontools 홈: http://cr.yp.to/daemontools.html
daemontools는 유닉스 서비스를 관리하기 위한 툴 모음입니다. (서비스의 기동, 종료, 상태감시, 로그 취득 등)
- supervise : 서비스를 감시합니다. 서비스를 시작하고, 죽으면 서비스를 재시작시킵니다.
- multilog : 하나 이상의 로그에 오류 메시지를 저장합니다.
- svscan : 서비스군을 시작하고 모니터링합니다.
- svc : supervise에 의한 감시되는 서비스들을 관리합니다.
- svstat: supervise에 의해 감시되는 서비스들의 상태를 출력합니다
※ 용어 정의 :
유닉스 서비스 (또는 서비스) : daemontools설치 시 자동 생성되는 /service디렉터리 아래에 등록된 dnscache, qmail, smtpd, smtps입니다.
# 아직은 /service디렉토리가 없음 (서비스 등록한 후의 리스트입니다.)
[root@centos7 service]# ll /service/
total 0
lrwxrwxrwx 1 root root 20 Dec 20 2016 dnscache -> /var/djbdns/dnscache
lrwxrwxrwx 1 root root 24 Dec 19 2016 qmail -> /var/qmail/service/qmail
lrwxrwxrwx 1 root root 24 Dec 19 2016 smtpd -> /var/qmail/service/smtpd
lrwxrwxrwx 1 root root 24 Dec 19 2016 smtps -> /var/qmail/service/smtps
[root@centos7 service]#
daemontools-0.76을 설치합니다.
cd /usr/local/src
wget http://cr.yp.to/daemontools/daemontools-0.76.tar.gz
mkdir -p /package
chmod 1755 /package/
cd /package/
cp /usr/local/src/daemontools-0.76.* ./
tar -xzf daemontools-0.76.tar.gz
cd admin
cd daemontools-0.76/
patch -p1 < /package/daemontools-0.76.errno.patch
./package/install
# << 이 시점에서 /command, /service 디렉토리가 생성됩니다.
daemontools까지 설치했으니 이제 sendmail wrapper를 설정합니다.
Qmail의 Sendmail Wrapper설정
MUA(Mail User Agent)가 Qmail을 이용할 수 있습니다.
mv /usr/lib/sendmail /usr/lib/sendmail.old
mv /usr/sbin/sendmail /usr/sbin/sendmail.old
ln -s /var/qmail/bin/sendmail /usr/lib
ln -s /var/qmail/bin/sendmail /usr/sbin
Qmail을 daemontools의 서비스로 등록하기
qmail, qmail-smtp, qmail-smtps 등록 흐름:
- Qmail홈 디렉터리(/var/qmail) 아래에 service디렉터리를 추가한 후 그 아래에 필요한 서비스를 추가합니다.
- 추가한 서비스는 소프트 링크를 걸어서 daemontools의 서비스로 등록하는 형태로 진행됩니다.
Qmail 홈 디렉터리(/var/qmail) 아래에 service디렉터리를 추가
mkdir /var/qmail/service
그 아래에 필요한 서비스를 추가 : qmail
mkdir /var/qmail/service/qmail
mkdir /var/qmail/service/qmail/log
chmod +t /var/qmail/service/qmail
vi /var/qmail/service/qmail/run
#!/bin/sh
exec env - PATH="/var/qmail/bin:$PATH" \
qmail-start ./Maildir/
chmod a+x /var/qmail/service/qmail/run
vi /var/qmail/service/qmail/log/run
#!/bin/sh
exec env - PATH="/var/qmail/bin:$PATH" \
setuidgid qmaill multilog t s1000000 n20 /var/log/qmail
mkdir /var/log/qmail
chown qmaill:nofiles /var/log/qmail
chmod 777 /var/log/qmail
추가한 서비스는 소프트 링크를 걸어서 daemontools의 서비스로 등록합니다.
ln -s /var/qmail/service/qmail /service/qmail
이번에는 smtpd를 동일한 순서로 설정해 줍니다.
mkdir /var/qmail/service/smtpd
mkdir /var/qmail/service/smtpd/log
chmod +t /var/qmail/service/smtpd
vi /var/qmail/service/smtpd/run
#!/bin/sh
exec env - PATH="/var/qmail/bin:$PATH" \
tcpserver -vHRl0 -x /home/vpopmail/etc/tcp.smtp.cdb \
-u `id -u vpopmail` -g `id -g vpopmail` 0 smtp \
qmail-smtpd naruhodo.cf /home/vpopmail/bin/vchkpw /bin/true 2>&1
vi /var/qmail/service/smtpd/log/run
#!/bin/sh
exec env - PATH="/var/qmail/bin:$PATH" \
setuidgid qmails multilog t s1000000 n20 /var/log/qmail/smtpd
chmod +x /var/qmail/service/smtpd/run
chmod +x /var/qmail/service/smtpd/log/run
mkdir /var/log/qmail/smtpd
chown qmails:nofiles /var/log/qmail/smtpd
chmod 777 /var/log/qmail/smtpd
ln -s /var/qmail/service/smtpd /service/smtpd
smtps를 daemontools에 등록하기 전에, SMTP over SSL을 적용할 예정이므로 X.509 키를 생성해 줍니다.
CN(Common Name )은 이 글 맨 아랫부분의 IMAP over SSL설정(mail.naruhodo.cf)과 겹치지 않도록 smtp.naruhodo.cf로 설정합니다.
# 유효기간을 10년(선택) (-days 3650), 저장위치를 /var/qmail/control/servercert.pem 로 지정
[root@centos7 ~]# openssl req -newkey rsa:2048 -x509 -nodes -days 3650 -out /var/qmail/control/servercert.pem -keyout /var/qmail/control/servercert.pem
# 자신에게 맞는 정보를 기입해줍니다.
Country Name (2 letter code) [XX]:JP
State or Province Name (full name) []:TOKYO
Locality Name (eg, city) [Default City]:Shinagawa
Organization Name (eg, company) [Default Company Ltd]:NARUHODO
Organizational Unit Name (eg, section) []:
Common Name (eg, your name or your server's hostname) []:smtp.naruhodo.cf
Email Address []:admin@naruhodo.cf
[root@centos7 ~]#
chmod 640 /var/qmail/control/servercert.pem
# 소유권한을 vpopmail로 설정해야 메일클라이언트에서 smtp.naruhodo.cf 인증서를 갱신해서 설치 가능함
chown vpopmail.vchkpw /var/qmail/control/servercert.pem
ln -s /var/qmail/control/servercert.pem /var/qmail/control/clientcert.pem
openssl ciphers > /var/qmail/control/tlsclientciphers
openssl ciphers > /var/qmail/control/tlsserverciphers
확인해 봅니다.
openssl s_client -connect smtp.naruhodo.cf:465 # << 자신의 PC에서 접속
openssl x509 -text -noout -in /var/qmail/control/servercert.pem
이제 smtp-auth용 키도 생성했으니, smtps를 daemontools의 서비스로 등록해 봅니다.
mkdir /var/qmail/service/smtps
mkdir /var/qmail/service/smtps/log
chmod +t /var/qmail/service/smtps
vi /var/qmail/service/smtps/run
#!/bin/sh
exec env - PATH="/var/qmail/bin:$PATH" \
tcpserver-ssl -v -s -x /home/vpopmail/etc/tcp.smtp.cdb \
-n /var/qmail/control/clientcert.pem \
-R -H -l0 -u `id -u vpopmail` -g `id -g vpopmail` 0 smtps \
qmail-smtpd naruhodo.cf /home/vpopmail/bin/vchkpw /bin/true 2>&1
vi /var/qmail/service/smtps/log/run
#!/bin/sh
exec env - PATH="/var/qmail/bin:$PATH" \
setuidgid qmails multilog t s1000000 n20 /var/log/qmail/smtps
chmod +x /var/qmail/service/smtps/run
chmod +x /var/qmail/service/smtps/log/run
mkdir /var/log/qmail/smtps
chown qmails:nofiles /var/log/qmail/smtps
chmod 777 /var/log/qmail/smtps
ln -s /var/qmail/service/smtps /service/smtps
Qmail 세부 설정
# 성능 튜닝 : 어디까지나 참고치이며 각자 모니터링하면서 적절한 값을 찾아야 합니다.
echo 86400 > /var/qmail/control/queuelifetime
echo 200 > /var/qmail/control/concurrencylocal
echo 500 > /var/qmail/control/concurrencyremote
echo 30 > /var/qmail/control/timeoutconnect
# 큐메일에서 허용할 도메인을 지정합니다.
vi /var/qmail/control/rcpthosts
mail.naruhodo.cf
example1.com
example2.com
# SMTP route 설정하여 불법으로 relay되는 것을 방지합니다.
vi /var/qmail/control/smtproutes
# domain.com:mail-server.com
mail.naruhodo.cf:localhost
example1.com:[123.123.123.10]
example2.com:[123.123.123.10]
# 만약 example3.com을 다른 메일서버(124.124.124.10)로 릴레이하고자 한다면 아래와 같이 기입
# domain.com:some-other-mail-server.com
# example3.com:[124.124.124.10] # << 이렇게
※ 사용 가능한 Qmail의 제어 파일(Control File)
각 제어 파일은 필요할 때 각각 생성하고 설정하고자 하는 값을 입력해 두면 됩니다.
Control File | Default | 사용되는 프로세스 | 용도 |
badmailfrom | N/A | qmail-smtpd | from 어드레스의 블랙리스트 |
bouncefrom | MAILER-DAEMON | qmail-send | bounce sender의 유저명 |
bouncehost | me 와 동일 | qmail-send | bounce sender의 호스트명 |
concurrencylocal | 10 | qmail-send | local에 동시배달 가능한 수 |
concurrencyremote | 20 | qmail-send | 동시배달가능한 remote수 |
defultdomain | me 와 동일 | qmail-inject | default domain 명 |
defaulthost | me 와 동일 | qmail-inject | default host 명 |
databytes | 0 | qmail-smtpd | 메시지의 최대 바이스수 (0 = 무제한) |
doublebouncehost | me 와 동일 | qmail-send | 이중바운스의 호스트명 |
doublebounceto | postmaster | qmail-send | 이중바운스를 수령할 유저 |
envnoathost | me 와 동일 | qmail-send | @ 마크가 없는 주소일 경우 디폴트도메인명 |
helohost | me 와 동일 | qmail-remote | SMTP HELO로 사용할 호스트명 |
idhost | me 와 동일 | qmail-inject | Message-ID에 부여할 호스트명 |
localiphost | me 와 동일 | qmail-smtpd | 로컬 IP 주소로 변환되는 호스트명 |
locals | me 와 동일 | qmail-send | local 도메인명 |
me | 시스템의 FQDN | 다수 | 많은 제어파일에의 디폴트 도메인의 정식명 |
morercpthosts | N/A | qmail-smtpd | 두번째 rcpthosts database |
percenthack | N/A | qmail-send | %스타일의 relay가능한 도메인 |
plusdomain | me 와 동일 | qmail-inject | + 로 대신 사용되는 도메인명 |
qmqpservers | N/A | qmail-qmqpc | QMQP서버의 IP주소 |
queuelifetime | 604800 | qmail-send | 메시지가 큐에 보관되는 시간(초) |
rcpthosts | N/A | qmail-smtpd | 메일 수신을 허가하는 도메인명 |
smtpgreeting | me 와 동일 | qmail-smtpd | SMTP의 인사 메시지 |
smtproutes | N/A | qmail-remote | SMTP의 전송처, 큐메일에 도착한 메일을 지정한 곳으로 전송가능해짐 |
timeoutconnect | 60 | qmail-remote | SMTP의 접속을 기다리는 시간(초) |
timeoutremote | 1200 | qmail-remote | 리모트서버를 기다리는 시간(초) |
timeoutsmtpd | 1200 | qmail-smtpd | SMTP클라이언트를 기다리는 시간(초) |
virtualdomains | N/A | qmail-send | 가상도메인과 유저명 |
주의
Qmail 처리 순서 : locals ⇒ virturaldomains
따라서, locals에 기재된 도메인은 virtualdomains에 기재해서는 안된다.
TIP
만약 자신의 qmail smtp 서버가 느리다고 생각된다면 다음과 같이 할 수 있다.
기본적으로 tcpserver는 사용되는 모든 ip 주소의 DNS와 ident를 체크하게 되어있다.(그래서 느려진다)
tcpserver -H -R를 사용하면 체크하지 않게 되므로 속도 향상을 볼 수 있다.
❻ Vpopmail 설치
※ vpopmail을 재설치할 경우, qmailadmin도 재설치해야 합니다.
groupadd vchkpw
useradd -g vchkpw -s /sbin/nologin -M vpopmail
mkdir /home/vpopmail
chown vpopmail:vchkpw /home/vpopmail
mkdir /home/vpopmail/etc
chown vpopmail:vchkpw /home/vpopmail/etc
cd /usr/local/src
wget https://sourceforge.net/projects/vpopmail/files/vpopmail-stable/5.4.33/vpopmail-5.4.33.tar.gz
tar xvzf vpopmail-5.4.33.tar.gz
cd vpopmail-5.4.33
# SMTP-AUTH에서 cram-md5지원을 위한 패치
# http://www.marronkun.net/linux/mail/qmail_000032.html
vi vchkpw.c
# 747 line 변경
hmac_md5( (unsigned char *) challenge, strlen(challenge), (unsigned char *) password, strlen(password), digest);
↓
hmac_md5( (unsigned char *) response, strlen(response), (unsigned char *) password, strlen(password), digest);
# 760 line 변경
return(strcmp(digascii,response));
↓
return(strcmp(digascii,challenge));
Vpopmail의 컴파일 방법은 DB 사용 여부에 따라서 옵션이 약간 달라집니다.
둘 중에 하나를 선택하세요.
MySQL옵션을 선택할 경우, 당연하지만 이미 MySQL이 설치되어 있어야 합니다.
# ——————————Not Use MySQL-----------------------------------
cd /usr/local/src//vpopmail-5.4.33
./configure \
--enable-roaming-users=y \
--enable-tcprules-prog=/usr/local/bin/tcprules \
--enable-qmail-ext=n \
--enable-relay-clear-minutes=15 \
--enable-ip-alias-domains=y \
--disable-rebuild-tcpserver-file \
--disable-clear-passwd \
--enable-logging=y
# ——————————Use MySQL-----------------------------------
cd /usr/local/src//vpopmail-5.4.33
./configure \
--enable-roaming-users=y \
--enable-tcprules-prog=/usr/local/bin/tcprules \
--enable-relay-clear-minutes=15 \
--enable-ip-alias-domains=y \
--enable-auth-module=mysql \
--enable-many-domains=n \
--enable-qmail-ext=n \ # Enable qmail email address extension support
--disable-clear-passwd \
--enable-sql-logging=y \
--enable-valias=y \
--enable-libdir=/usr/lib64/mysql \
--enable-logging=y
나중에 Mailing List도 설정할 예정이므로, MySQL과 연동하여 Vpopmail을 설치하겠습니다.
make
make install-strip
MySQL설치는 다른 글에서 다루도록 하겠습니다.
vpopmail 5.4.33 설치가 완료되면 아래와 같이 현재 설정 내역이 표시됩니다 (환경에 따라 내용은 다를 수 있습니다.)
vpopmail 5.4.33
Current settings
---------------------------------------
vpopmail directory = /home/vpopmail
domains directory = /home/vpopmail/domains
uid = 1012
gid = 1007
roaming users = ON --enable-roaming-users
tcpserver file = /home/vpopmail/etc/tcp.smtp
open_smtp file = /home/vpopmail/etc/open-smtp
rebuild tcpserver file = ON --enable-rebuild-tcpserver-file (default)
password learning = OFF --disable-learn-passwords (default)
md5 passwords = ON --enable-md5-passwords (default)
file locking = ON --enable-file-locking (default)
vdelivermail fsync = OFF --disable-file-sync (default)
make seekable = ON --enable-make-seekable (default)
clear passwd = OFF --disable-clear-passwd
user dir hashing = ON --enable-users-big-dir (default)
address extensions = OFF --disable-qmail-ext (default)
ip alias = ON --enable-ip-alias-domains
onchange script = OFF --disable-onchange-script (default)
domain quotas = OFF --disable-domainquotas (default)
auth module = mysql --enable-auth-module=mysql
mysql replication = OFF --disable-mysql-replication (default)
sql logging = ON --enable-sql-logging
mysql limits = OFF --disable-mysql-limits (default)
SQL valias table = ON --enable-valias
auth inc = -I/usr/include/mysql
auth lib = -Xlinker -R -Xlinker /usr/lib/mysql -L/usr/lib/mysql -lmysqlclient -lz -lm
system passwords = OFF --disable-passwd (default)
pop syslog = show successful and failed login attempts --enable-logging=y
auth logging = ON --enable-auth-logging (default)
one domain per SQL table = --disable-many-domains
spamassassin = OFF --disable-spamassassin (default)
maildrop = OFF --disable-maildrop (default)
mail.naruhodo.cf 를 기본 도메인으로 설정하고 추가 설정을 해보도록 하겠습니다.
echo "mail.naruhodo.cf" > /home/vpopmail/etc/defaultdomain
Vpopmail - MySQL연동 설정
① Vpopmail을 위한 DB를 생성합니다.
mysql -uroot -p
CREATE DATABASE vpopmail;
CREATE USER vpopadmin@localhost IDENTIFIED BY ‘vpopadmin-passwd';
GRANT ALL ON vpopmail.* TO vpopadmin@localhost;
\q
② Vpopmail의 MySQL설정 파일을 다음과 같이 편집합니다
vi /home/vpopmail/etc/vpopmail.mysql
# host|port|user|password|database # << 여기를 참고 하여
localhost|0|vpopadmin|vpopadmin-passwd|vpopmail # << 좀전에 MySQL에서 생성한 DB와 계정정보를 입력
chown vpopmail.vchkpw ~vpopmail/etc/vpopmail.mysql
chmod 640 ~vpopmail/etc/vpopmail.mysql
③ tcpserver의 rule을 컴파일합니다.
tcpserver는 선택적으로 TCP 연결이 허용 가능한지 여부를 결정하는 규칙(Rule)을 따르는데 이 규칙 파일(tcp.smtp.cdb)을 아래와 같이 작성합니다
vi /home/vpopmail/etc/tcp.smtp
127.:allow,RELAYCLIENT="" # << 로컬 네트워크만으로도 동작에는 문제없음
123.123.123.:allow,RELAYCLIENT="" # << 자신의 실제 네트워크 대역을 지정
# tcp.smtp.cdb 파일을 생성합니다.
tcprules /home/vpopmail/etc/tcp.smtp.cdb /home/vpopmail/etc/tcp.smtp.tmp < /home/vpopmail/etc/tcp.smtp
Vpopmail - 가상 도메인/유저 생성
이제 admin@naruhodo.cf 라는 메일 계정을 사용할 수 있도록 설정해보겠습니다.
① naruhodo.cf 도메인과 admin유저를 생성합니다.
참고로, qmailadmin을 설치하면 도메인 생성 이외의 작업을 웹에서 할 수 있습니다. (조금 뒤에 설치 예정)
/home/vpopmail/bin/vadddomain naruhodo.cf
/home/vpopmail/bin/vadduser admin@naruhodo.cf
② 생성한 가상 도메인 naruhodo.cf의 기본 설정 변경
vi /home/vpopmail/domains/naruhodo.cf/.qmail-default
| /home/vpopmail/bin/vdelivermail '' bounce-no-mailbox
↓
| /home/vpopmail/bin/vdelivermail '' delete # << 바운스메일 삭제로 수정
③ 새로 생성되는 유저에게 적용되는 기본 QUATA설정 (선택) : 모든 도메인에 global 적용됩니다.
vi /home/vpopmail/etc/vlimits.default
# default quota for newly created users (in bytes)
# example shows a user with a 10MB quota and a limit of 1000 messages
#default_quota 10485760 # << 맨 앞의 코멘트제거 (필요시)
#default_maxmsgcount 1000 # << 맨 앞의 코멘트제거 (필요시)
④ alilas추가 : mailer-daemon, postmaster, root 등의 유저의 alias를 좀 전에 생성한 admin 계정으로 설정합니다.
(qmailadmin에서도 설정 가능)
[root@centos7 ~]# /home/vpopmail/bin/valias -i admin mailer-daemon@naruhodo.cf.com
[root@centos7 ~]# /home/vpopmail/bin/valias -i admin postmaster@naruhodo.cf.com
[root@centos7 ~]# /home/vpopmail/bin/valias -i admin root@naruhodo.cf.com
아직 갈 길이 더 남았으니 잠시 여기까지의 설치내역을 정리하고 가겠습니다.
처음에 MTA인 큐메일(ucspi-tcp, daemontools포함)을 설치했는데, 멀티도메인을 지원하기 위해서 Vpopmail도 설치했습니다.
이제 큐메일은 ucspi-tcp 즉 tcpserver를 시켜서 SMTP/25번 포트를 상시 리슨 하면서 들어오는 메일 발송 요청에 대해서 자신이 가지고 있는 규칙 파일(tcp.smtp.cdb)의 내용을 바탕으로 허락/거부 판정을 24x7 쉬지 않고 수행토록 할 겁니다.( = 데몬을 시작시켜서..)
vpopmail로 생성되는 도메인과 유저들을 저장하기 위해서 MySQL설정도 했고, admin@naruhodo.cf라는 naruhodo.cf도메인의 유저를 생성시킴으로써 이제 메일서버는 naudhodo.cf의 메일서버 역할을 하기 시작했습니다.
만약 admin@abc.com라는 유저를 추가 생성한다면 메일서버는 abc.com의 메일서버 역할도 동시에 하게 되는 거죠
결국, 메일의 송수신이라는 측면에서 보면, 지금까지는 메일 송신을 위한 SMTP 관련 구성을 했던 것이고,
이제부터 메일 수신 = 메일 보관을 위한 IMAP4 구성을 해나가면서 마지막에는 SSL 인증서를 직접 작성해서 적용함으로써 SMTP SSL과 IMAP SSL까지 구현하도록 하겠습니다.
❼ Qmailadmin 설치
Vpopmail의 웹 인터페이스인 qmailadmin을 설치해보겠습니다.
설치 전에 httpd 데몬이 실행되고 있어야 합니다. 글쓴이의 경우 http/2 가 적용된 Apache/2.4.39 버전이 실행 중입니다.
[root@centos7 ~]# /usr/local/apache2/bin/httpd -v
Server version: Apache/2.4.39 (Unix)
Server built: May 26 2019 16:03:35
[root@centos7 ~]# systemctl status httpd2
● httpd2.service - The Apache HTTP/2 Server
Loaded: loaded (/etc/systemd/system/httpd2.service; enabled; vendor preset: disabled)
Active: active (running) since Sun 2019-05-26 23:38:45 JST; 1 day 21h ago
Docs: man:httpd(8)
man:apachectl(8)
Process: 8682 ExecStop=/usr/local/apache2/bin/apachectl stop (code=exited, status=0/SUCCESS)
Process: 26787 ExecReload=/usr/local/apache2/bin/apachectl graceful (code=exited, status=0/SUCCESS)
Process: 8691 ExecStart=/usr/local/apache2/bin/apachectl start (code=exited, status=0/SUCCESS)
Main PID: 8699 (httpd)
CGroup: /system.slice/httpd2.service
├─ 8699 /usr/local/apache2/bin/httpd -k start
├─26801 /usr/local/apache2/bin/httpd -k start
├─26802 /usr/local/apache2/bin/httpd -k start
├─26803 /usr/local/apache2/bin/httpd -k start
├─26804 /usr/local/apache2/bin/httpd -k start
└─27067 /usr/local/apache2/bin/httpd -k start
May 26 23:38:45 centos7 systemd[1]: Starting The Apache HTTP/2 Server...
① qmailadmin-1.2.16 버전을 컴파일합니다.
TIP
만일 자신의 웹서버가 apache 2.4.39 이상의 버전이고 qmailadmin이 브라우저에서 제대로 동작하지 않는다면
--enable-cgid를 추가해서 컴파일해보세요
이때, 웹서버는 cgid_module이 설치되어있고 httpd.conf 주설 정 파일에서 활성화되어 있어야 합니다.
like) LoadModule cgid_module modules/mod_cgid.so
cd /usr/local/src
wget https://sourceforge.net/projects/qmailadmin/files/latest/download/qmailadmin-1.2.16.tar.gz
tar xzvf qmailadmin-1.2.16.tar.gz
cd qmailadmin-1.2.16
./configure --enable-domain-autofill --enable-help
# apache2 라면
./configure
--enable-htmldir=/usr/local/apache2/htdocs
--enable-cgibindir=/usr/local/apache2/cgi-bin
--enable-domain-autofill
--enable-help
make
make install-strip
② qmailadmin-help-1.0.8을 설치합니다 (선택)
cd /usr/local/src
wget https://sourceforge.net/projects/qmailadmin/files/qmailadmin-help/1.0.8/qmailadmin-help-1.0.8.tar.gz
tar xzvf qmailadmin-help-1.0.8.tar.gz
cd qmailadmin-help-1.0.8
mkdir /var/www/html/images/qmailadmin/help
cp -rp * /var/www/html/images/qmailadmin/help
# apache2 라면
mkdir /usr/local/apache2/htdocs/images/qmailadmin/help
cp -rp * /usr/local/apache2/htdocs/images/qmailadmin/help
③ 브라우저로 접속해서 확인해 봅니다.
http://localhost/cgi-bin/qmailadmin
http://localhost/images/qmailadmin/help
문제가 없다면 다음과 같은 로그인 창이 표시됩니다.
Postmaster로만 접속이 가능하므로 미리 패스워드를 생성한 후에 접속합니다.
# postmaster 생성
/home/vpopmail/bin/vadduser postmaster@naruhodo.cf
# 유저 패스워드 변경
/home/vpopmail/bin/vchangepw
❽ Courier-Authlib / Courier-IMAP 설치
각각의 역할을 보면, Courier-imap은 메일을 보관하기 위한 프로토콜(imapd, imapd-ssl, pop3d, pop3d-ssl )을 관리하고, courier-authlib이 Courier-imap에서 설정한 프로토콜(e.g. imapd)을 바탕으로 해당 포트를 리슨 하면서 클라이언트로부터의 연결 요청에 대한 인증을 담당하게 됩니다.
제약조건 :
courier-authlib-0.58과 courier-imap-4.1.1.tar.bz2 으로 한정해서 구성함 (타 버전은 에러 발생)
imap/imap-ssl 등을 사용할 경우, daemontools의 서비스에 등록되어있는 pop3관련 링크가 있다면 제거해 준 다음, courier-imap과 courier-authlib 서비스를 기동시 켜야 합니다.
Courier사용자 생성
groupadd courier
useradd -g courier -s /sbin/nologin -M courier
컴파일에 필요한 툴을 설치합니다
yum -y install libtool-ltdl-devel
yum -y install gdbm-devel
yum -y install pam-devel
yum -y install openssl-devel
yum -y install mysql-devel
yum -y install zlib-devel
yum -y install libtool
yum -y install openldap-devel
yum -y install gcc-c++
yum -y install expect
yum -y install postgresql-devel
Courier-Authlib-0.58 설치
cd /usr/local/src
wget http://shupp.org/software/courier-authlib-0.58.tar.bz2
bunzip2 courier-authlib-0.58.tar.bz2
tar xf courier-authlib-0.58.tar
chown -R root.root courier-authlib-0.58
cd courier-authlib-0.58
./configure \
--prefix=/usr/local/courier-authlib \
--without-authpam \
--without-authldap \
--without-authpwd \
--without-authpgsql \
--without-authmysql \
--without-authshadow \
--without-authuserdb \
--without-authcustom \
--without-authcram \
--without-authpipe \
--without-authdaemon \
--with-authvchkpw \
--with-redhat \
--with-ssl
#--------------------------#
# 만일 아래와 같은 에러가 난다면
ERROR conftest2.out: not found
./configure: line 25703: .: conftest2.out: file not found
# courierauthconfig을 제거해 줍니다.
rm -f /usr/local/bin/courierauthconfig
#--------------------------#
make
make install
make install-configure
① authdaemonrc 파일의 설정을 수정 (또는 확인)
vi /usr/local/courier-authlib/etc/authlib/authdaemonrc
# --with-authvchkpw로 컴파일할 경우, 이미 반영됨
authmodulelist="authpam"
↓
authmodulelist="authvchkpw"
authmodulelistorig="authpam"
↓
authmodulelistorig="authvchkpw"
② Courier-Authlib을 systemd에 등록
courier-authlib의 서비스 파일을 작성합니다.
vi /usr/lib/systemd/system/courier-authlib.service
[Unit]
Description=Courier Authentication Library
[Service]
Type=forking
RemainAfterExit=true
ExecStart=/usr/local/share/courier-authlib.sysvinit start
ExecStop=/usr/local/share/courier-authlib.sysvinit stop
[Install]
WantedBy=multi-user.target
③ courier-authlib 서비스를 시작하고 부팅 시 자동으로 시작되도록 설정합니다.
cp /usr/local/src/courier-authlib-0.58/courier-authlib.sysvinit /usr/local/share/
chmod 700 /usr/local/share/courier-authlib.sysvinit
systemctl start courier-authlib
systemctl enable courier-authlib
④ .bash_profile에 courier-authlib 경로를 추가해 줍니다
[root@centos7 ~]# cd
[root@centos7 ~]# cat .bash_profile
# .bash_profile
# Get the aliases and functions
if [ -f ~/.bashrc ]; then
. ~/.bashrc
fi
# User specific environment and startup programs
PATH=$PATH:$HOME/bin:/usr/local/courier-authlib/bin
export PATH
[root@centos7 ~]#
[root@centos7 ~]# source .bash_profile
⑤ courier-authlib 상태를 확인해 봅니다
[root@centos7 ~]# systemctl status courier-authlib.service
● courier-authlib.service - Courier Authentication Library
Loaded: loaded (/usr/lib/systemd/system/courier-authlib.service; enabled; vendor preset: disabled)
Active: active (running) since Sun 2019-05-26 23:22:34 JST; 2 days ago
Process: 4632 ExecStart=/usr/local/share/courier-authlib.sysvinit start (code=exited, status=0/SUCCESS)
Main PID: 4637 (courierlogger)
CGroup: /system.slice/courier-authlib.service
├─4637 /usr/local/courier-authlib/sbin/courierlogger -pid=/usr/local/courier-authlib/var/spool/authdaemon/pid -start /usr/local/courier-authlib/libex...
├─4638 /usr/local/courier-authlib/libexec/courier-authlib/authdaemond
├─4722 /usr/local/courier-authlib/libexec/courier-authlib/authdaemond
├─4723 /usr/local/courier-authlib/libexec/courier-authlib/authdaemond
├─4724 /usr/local/courier-authlib/libexec/courier-authlib/authdaemond
├─4725 /usr/local/courier-authlib/libexec/courier-authlib/authdaemond
└─4726 /usr/local/courier-authlib/libexec/courier-authlib/authdaemond
May 26 23:22:33 centos7 systemd[1]: Starting Courier Authentication Library...
May 26 23:22:34 centos7 authdaemond[4637]: modules="authvchkpw", daemons=5
May 26 23:22:34 centos7 courier-authlib.sysvinit[4632]: Starting Courier authentication services: authdaemond
May 26 23:22:34 centos7 authdaemond[4637]: Installing libauthvchkpw
May 26 23:22:34 centos7 systemd[1]: Started Courier Authentication Library.
May 26 23:22:34 centos7 authdaemond[4637]: Installation complete: authvchkpw
Courier-imap-4.1.1 설치
cd /usr/local/src
wget http://shupp.org/software/courier-imap-4.1.1.tar.bz2
tar -jxvf courier-imap-4.1.1.tar.bz2
cd courier-imap-4.1.1
export CFLAGS="-DHAVE_OPEN_SMTP_RELAY -DHAVE_VLOGAUTH"
export CPPFLAGS=-I/usr/local/courier-authlib/include
export COURIERAUTHCONFIG=/usr/local/courier-authlib/bin/courierauthconfig
export LIBS="-L/usr/lib64/mysql -lmysqlclient -lz"
/******************** IMAP before SMTP/SMTPs ********************/
./configure \
--prefix=/usr/local/courier-imap \
--enable-workarounds-for-imap-client-bugs \
--enable-unicodes=iso-2022-jp,iso-8859-1,utf-8 \
--disable-root-check \
--without-authdeamon \
--without-authmysql \
--without-authldap \
--without-authpgsql \
--with-authvchkpw \
--with-vpopmail=yes \
--with-cram=yes \
--with-redhat \
--with-ssl
/*****************************************************************/
--with-mysql=yes # vpopmail과 연동되면 mysql은 불필요
make
make install
make install-configure
① courier-imap 설정
설치가 완료되면 /usr/local/courier-imap/etc 아래로 imapd, imapd-ssl, pop3d, pop3d-ssl 등의 설정 파일이 생성됩니다.
사용할 서비스의 파일을 열어서 IMAPDSTART=YES 로 변경합니다.
(imapd을 기동 한다면 나머지(imapd-ssl, pop3d, pop3d-ssl)는 IMAPDSTART=NO로 설정)
e.g.) imapd를 기동 할 경우
vi /usr/local/courier-imap/etc/imapd
MAXDAEMONS=40
MAXPERIP=40
IMAP_EMPTYTRASH=Trash:7,Sent:30
IMAPDSTART=YES
② courier-imap을 systemd에 등록
courier-imap의 서비스 파일을 작성합니다.
vi /usr/lib/systemd/system/courier-imap.service
[Unit]
Description=Courier-IMAP service
Wants=network-online.target
Wants=courier-authlib.service
After=network-online.target
After=courier-authlib.service
[Install]
WantedBy=mail-transfer-agent.target
WantedBy=multi-user.target
[Service]
Type=forking
RemainAfterExit=true
ExecStart=/usr/local/share/courier-imap.sysvinit start
ExecStop=/usr/local/share/courier-imap.sysvinit stop
③ courier-imap 서비스를 시작하고 부팅 시 자동으로 시작되도록 설정합니다.
cp /usr/local/src/courier-imap-4.1.1/courier-imap.sysvinit /usr/local/share
chmod 700 /usr/local/share/courier-imap.sysvinit
systemctl start courier-imap
systemctl enable courier-imap
④ courier-imap 상태를 확인합니다
[root@centos7 ~]# systemctl status courier-imap
● courier-imap.service - Courier-IMAP service
Loaded: loaded (/usr/lib/systemd/system/courier-imap.service; enabled; vendor preset: disabled)
Active: active (running) since Sun 2019-05-26 23:22:41 JST; 2 days ago
Process: 5330 ExecStart=/usr/local/share/courier-imap.sysvinit start (code=exited, status=0/SUCCESS)
Main PID: 5375 (courierlogger)
CGroup: /system.slice/courier-imap.service
├─ 5375 /usr/local/courier-authlib/sbin/courierlogger -pid=/var/run/imapd-ssl.pid -start -name=imapd-ssl /usr/local/courier-imap/libexec/couriertcpd ...
├─ 5383 /usr/local/courier-imap/libexec/couriertcpd -address=0 -maxprocs=40 -maxperip=40 -nodnslookup -noidentlookup 993 /usr/local/courier-imap/bin/...
├─21621 /usr/local/courier-imap/bin/couriertls -server -tcpd /usr/local/courier-imap/sbin/imaplogin /usr/local/courier-imap/bin/imapd Maildir
├─21623 /usr/local/courier-imap/bin/imapd Maildir
├─21627 /usr/local/courier-imap/bin/couriertls -server -tcpd /usr/local/courier-imap/sbin/imaplogin /usr/local/courier-imap/bin/imapd Maildir
├─21628 /usr/local/courier-imap/bin/imapd Maildir
├─22405 /usr/local/courier-imap/bin/couriertls -server -tcpd /usr/local/courier-imap/sbin/imaplogin /usr/local/courier-imap/bin/imapd Maildir
└─22406 /usr/local/courier-imap/bin/imapd Maildir
...
[root@centos7 ~]#
IMAP over SSL를 위한 self-signed X.509 key를 생성
① 생성할 인증키 정보를 편집합니다.
해당 키는 메일 클라이언트가 서버에 접속을 시도할 때 사용됩니다.
vi /usr/lcoal/courier-imap/etc/imapd.cnf
RANDFILE = /usr/local/courier-imap/share/imapd.rand
[ req ]
default_bits = 2048
encrypt_key = yes
distinguished_name = req_dn
x509_extensions = cert_type
prompt = no
# req_dn을 자신에게 맞도록 수정합니다
[ req_dn ]
C=JP
ST=TK
L=TOKYO
O=naruhodo.cf
OU=naruhodo-SSLkey
CN=mail.naruhodo.cf # << FQDN
emailAddress=admin@naruhodo.cf
[ cert_type ]
nsCertType = server
② 자체 서명된 X.509 키를 생성합니다.
courier-imap을 설치하면 자동으로 함께 설치되는 X.509 키 생성 스크립트를 편집합니다.
vi /usr/local/courier-imap/share/mkimapdcert
# 맨 아래쪽에서
# -days 365 → 3650 << 유효기간을 1년 → 10년으로 변경 (선택)
# gendh → dhparam << openssl 0.9.4. / 0.9.5 버전이후 dh, gendh → dhparam으로 통합됨
③ 이제 스크립트를 실행하여 X.509 키를 생성합니다.
imapd.cnf에서 입력했던 내용과 생성 스크립트에서 변경한 유효기간이 반영되어 생성되는 것을 볼 수 있습니다.
새롭게 생성된 키는 /usr/local/courier-imap/share/imapd.pem 에서 확인 가능합니다.
[root@centos7 etc]# /usr/local/courier-imap/share/mkimapdcert
Generating a 2048 bit RSA private key
..............+++
.............+++
writing new private key to '/usr/local/courier-imap/share/imapd.pem'
-----
1024 semi-random bytes loaded
Generating DH parameters, 512 bit long safe prime, generator 2
This is going to take a long time
.........++*++*++*++*++*++*
subject= /C=JP/ST=TK/L=TOKYO/O=naruhodo.cf/OU=naruhodo-imapd-SSLkey/CN=mail.naruhodo.cf/emailAddress=admin@naruhodo.cf # << 여기
notBefore=May 24 16:23:46 2019 GMT
notAfter=May 21 16:23:46 2029 GMT # << 유효기간 2029년 5월21일
...
생성된 imapd.pem의 내용을 확인하려면
openssl x509 -text -noout -in /usr/local/courier-imap/share/imapd.pem
이제 인증키도 생성했으니 imap-ssl를 사용하도록 설정하겠습니다.
IMAP over SSL로 기동 하기
# imapd를 START시키지않고, imapd-ssl을 START시키겠다
vi /usr/local/courier-imap/etc/imapd
IMAPDSTART=YES —> NO로 변경
vi /usr/local/courier-imap/etc/imapd-ssl
IMAPDSSLSTART=NO —> YES로 변경
① courier-imap 서비스 재시작해 줍니다
systemctl restart courier-imap
② 993 Port 리슨 체크
프로세스 확인보다는 리스닝 포트를 확인하는 게 동작 여부를 확인하기에 직관적입니다.
couriertcpd라는 데몬이 993/tcp 포트를 리슨 하고 있을 겁니다.
[root@centos7 etc]# netstat -anp|grep 993
tcp6 0 0 :::993 :::* LISTEN 16631/couriertcpd
③ 방화벽(firewall) 설정
# 이미 등록된 서비스가 있는지 찾아봅니다.( imap imaps 가 있을 겁니다)
firewall-cmd --get-services | grep imap
# imaps만 포트 오픈합니다.
firewall-cmd --add-service=imaps --zone=public --permanent
# (필요시) pop3 관련 정책이 있다면 아래와 같이 제거해줍니다.
firewall-cmd --remove-service=pop3 --zone=public --permanent
firewall-cmd --reload
firewall-cmd --list-all
참고로 글쓴이의 환경에서 firewall-cmd --list-all 명령을 실행해보면 아래와 같은 서비스만 오픈되어 있습니다.
samba http dns smtp smtps ssh https imaps
여기까지 IMAP over SSL 적용이 완료되었네요. 여기까지 읽고 설정하느라 고생 많으셨습니다^^;
Qmailadmin으로 웹 인터페이스에서 보다 쉽고 편리하게 메일을 설정할 수 있고, IMAP over SSL과 SMTP over SSL을 적용하여 보다 시큐어 한 환경에서 메일의 송수신이 가능해졌습니다.
처음 이 글을 시작할 때 Vqadmin과 dnscache 도 다뤄보려고 했었는데, Vqadmin을 사용해본 경우 Qmailadmin에서는 지원하지 않는 가상 도메인 생성 기능을 사용하는 것 외에는 그다지 메리트가 없는 듯하여(어디까지나 사견) skip 하고, 메일 전송속도에 매우 매우 영향을 미치는 dnscache를 다뤄보겠습니다.
dnscache 큐메일의 저자가 만든 패키지이죠. 그래서 호환/동작하는데 전혀 문제가 없습니다.
그리고 여기까지 작업을 따라 하셨다면 dnscache설정은 훨씬 수월하게 할 수 있을 거라 생각합니다.
dnscache 설치
djbdns는 qmail의 저자인 D. J. Bernstein이 만든 DNS 서버입니다.
djbdns는 Cache서버, 콘텐츠 서버로 분리되어 있는데, 여기서는 dnscache를 설치할 것입니다.
- dnscache (DNS Cache 서버)
- tinydns (DNS 콘텐츠 서버)
❶ 준비
djbdns를 설치하기 위해서는 daemontools-0.70 이상 버전과 ucspi-tcp가 설치되어 있어야 합니다.
❷ djbdns-1.05 설치
cd /usr/local/src
wget http://cr.yp.to/djbdns/djbdns-1.05.tar.gz
tar xvfz djbdns-1.05.tar.gz
cd djbdns-1.05
echo gcc -O2 -include /usr/include/errno.h > conf-cc
patch -p1 < ../djbdns-1.05.errno.patch
make
make setup check
❸ dnscache 설정
유저를 생성
groupadd -g 530 djbdns
useradd -u 530 -g djbdns -d /var/djbdns -s /sbin/nologin dnslog
useradd -u 531 -g djbdns -d /var/djbdns/dnscache -s /sbin/nologin dnscache
설치 시 자동 생성된 디렉터리를 지우고 다시 생성
rm -rf /var/djbdns
mkdir /var/djbdns
설정 파일 작성
dnscache-conf 명령으로 설정 파일을 작성합니다.
서식 : dnscache-conf dnscache동작 유저 dnscache로그 유저 dnscache디렉터리 허가할 IP주소
# 127.0.0.1 즉 자기자신만 cache서버를 이용할 수 있도록 설정합니다.
/usr/local/bin/dnscache-conf dnscache dnslog /var/djbdns/dnscache 127.0.0.1
실행하면, /var/djbdns/dnscache아래에 env, log, root 등의 디렉터리가 자동 생성됩니다.
❹ 외부 DNS Cache 사용 설정
dns resolver설정(resolv.conf)에서 nameserver는 자기 자신(127.0.0.1)으로만 설정할 텐데, 자신의 Cache에 없는 요청일 경우 자기 자신(127.0.0.1)이 쿼리 할 서버(Root네임서버)를 설정한다고 보면 됩니다.
■ 먼저, Root네임서버 목록(IP주소)을 가져올 스크립트를 확인합니다. 없으면 작성합니다.
vi /var/djbdns/dnscache/root/rootnamesrv.get
#!/bin/sh
wget ftp://ftp.internic.net/domain/named.cache > /dev/null 2>&1
awk '$1 ~ /.ROOT-SERVERS.NET/ {print $4}' named.cache > /var/djbdns/dnscache/root/servers/@
sleep 1
rm -f /var/djbdns/dnscache/root/named.cache
■ rootnamesrv.get 파일에 실행 권한을 부여한 후 cron에 등록시킵니다
매월 15일 0시 0분에 INTERNIC으로부터 named.cache파일을 다운로드한 후 필요한 IP 정보만을
추출하여 해당 파일을 업데이트합니다.
# 실행권한부여
chmod a+x /var/djbdns/dnschache/root/rootnamesrv.get
[root@centos7 root]# ./rootnamesrv.get # << 실행에 문제없는지 확인 !!
# cron에 등록
crontab -e
0 0 15 * * /var/djbdns/dnscache/root/rootnamesrv.get &
■ 질의에 응답할 네트워크 설정
자기 자신(127.0.0.1)만 추가해 줍니다.
touch /var/dnscache/root/ip/127.0.0.1
■ FORWARDONLY 설정
echo 1 > /service/dnscache/env/FORWARDONLY
/usr/local/bin/svc -t /service/dnscache/
rootnamesrv.get을 실행시키면, 루트 서버들의 IP가 "/service/dnscache/root/servers/@“의 아래에 생성됩니다.
이제부터 dnscache는 resolve 요청이 있을 때 답을 자신이 가지고 있지 않을 때는 여기(@)에 기재된 외부 DNS 서버에 쿼리하고 그 결과를 캐시, 응답하게 됩니다.
❺ daemontools에 등록
/var/djbdns/dnscache/run 작성(확인)
#!/bin/sh
exec 2>&1
exec <seed
exec envdir ./env sh -c '
exec envuidgid dnscache softlimit -o250 -d "$DATALIMIT" /usr/local/bin/dnscache
'
/var/djbdns/dnscache/log/run 작성(확인)
#!/bin/sh
exec setuidgid dnslog multilog t s1000000 n20 –'*' +'* stats * * *' ./dnsstatus +'*' ./main
# 작성후 권한변경
chown dnslog:djbdns /var/djbdns/dnscache/log
daemontools에 등록합니다.
ln -s /var/djbdns/dnscache /service
기동시 킨 후 확인합니다.
[root@centos7 dnscache]# /usr/local/bin/svstat /service/dnscache
/service/dnscache: up (pid 12254) 57266 seconds
dnscache를 이용하기 위해서 DNS resolver설정을 변경합니다.
[root@centos7 root]# cat /etc/resolv.conf
nameserver 127.0.0.1 # << 추가
확인 차원에서 dnscache를 재시작합니다.
/usr/local/bin/svc -t /service/dnscache
기본적인 설정은 이게 다 입니다.
❻ dnscache 모니터링 & 튜닝
이제 약간의 튜닝 포인트를 찾아보겠습니다. 먼저 잘 동작하고 있는지 살펴봅니다.
dnscache 로그 확인
# 창을 두개 띄워둡니다.
# 창1, 실행시켜 둡니다.
tail –f /var/djbdns/dnscache/log/main/current | tai64nlocal # << cached 로 시작하는 라인을 볼수있음
# 창2
# nslookup시 dnscache가 어떻게 동작하는지 창1에서 확인
[naru@centos7 ~]$ nslookup google.co.jp
Server: 127.0.0.1 # << dnscache 가 응답
Address: 127.0.0.1#53
Non-authoritative answer:
Name: google.co.jp
Address: 172.217.25.227 # << 결과
[naru@centos7 ~]$
dnscache Cache 용량 산정하기
dnscache는 기본적으로 1MB의 메모리를 자신의 Cache로 사용합니다.
dnscache는 Cache 이외에 약간의 메모리가 더 필요하기 때문에 DATALIMIT값은 CACHESIZE보다 크게 잡아 주는 것이 좋습니다.
적당한 Cache크기를 할당하기 위해서는 logfile의 내용 중 stats 라인을 모니터링해야 하는데 아래와 같이 multilog의 옵션을 이용하여 별도의 파일로 생성하도록 할 수 있습니다.
만약 위의 "❺ daemontools에 등록" 항목을 진행했다면 바로 stats를 포함한 로그 확인 단계로 넘어가세요.
설정을 변경하기 전에 /var/djbdns/dnscache/log 디렉터리의 권한이 dnslog인지 확인합니다.
chown dnslog:djbdns /var/djbdns/dnscache/log
vi /var/djbdns/dnscache/log/run
#!/bin/sh
exec setuidgid dnslog multilog t s1000000 n20 –'*' +'* stats * * *' ./dnsstatus +'*' ./main
dnscache 재기동
/usr/local/bin/svc -t /service/dnscache
# dnscache 재기동후 자동으로 아래와 같이 디렉토리와 파일이 생성됨
/var/djbdns/dnscache/log/dnsstatus/current
stats 로그를 확인
cat /var/djbdns/dnscache/log/dnsstatus/current | tai64nlocal |grep stats
이제 예제를 통해서 필요한 Cache용량을 계산합니다.
오래전에 작성해두었던 내용을 복붙 합니다.
#--------------------------------------#
# Cache용량 산정 방법
로그 파일 내의 stats행의 상태를 확인, Cache 사용 상황을 조사하여 그 값으로부터 적절한 Cache 용량을 산출한다.
우선 로그 파일로부터, 약 24시간 간격의 stats행을 아래와 같은 요령으로 찾아낸다.
[root@centos7 main]# cat /var/dnscache/log/main/current | tai64nlocal | grep stats
2006-11-08 11:30:01.435814500 stats 37 3126 1 0
...
2006-11-09 11:30:01.423782500 stats 30 19470 1 0
stats 행에 나타나고 있는 4개의 숫자 가운데, 2번째의 숫자가 Cache 이동량(cache motion)이다
dnscache 기동시부터 현재까지 Cache에 쓴 데이터의 총 바이트수를 나타내고 있다.
24시간 간격을 둔 값의 차분이, 그 사이의 Cache 사용량이 된다
상기의 예에서는 19470 - 3126 = 16344바이트
산정 방법 1)
DNS 정보의 TTL값은 대체로 3~7일이므로, 3일 분의 Cache 사용량 정도의 Cache 용량을 확보해 두는 것을 전제로 한다.
상기의 예에서는 약 17k * 3 = 50k바이트
Cache 용량은 /service/dnscache/env/CACHESIZE에서 설정 가능하므로, 필요에 따라서 조정한다.
(아래의 "100MB Cache로 변경하려면"을 참고)
산정 방법 2)
또는 현재의 Cache용량을 1일 Cache 이동량으로 나눈 값을 통해서 Cache 순환 시간을 확인한다.
상기의 예에서는 16344 / 19470 = 0.839445...이며 아래의 수치를 기준으로 보면
0.01 : Cache순환 시간(Cache Cycle Time) - 15분
0.1 : Cache순환 시간(Cache Cycle Time) - 2시간
1 : Cache순환 시간(Cache Cycle Time) – 1일
10 : Cache순환 시간(Cache Cycle Time) - 1주일 이상
0.839445... = 약 1 이므로 Cache순환 시간은 약 1일이다
1일분으로 Cache용량을 설정할 것인지는 각자의 몫이다.
산정방법 3)
Cache이동량(cache motion)을 쿼리 카운트(query count)로 나눈다.
상기의 예에서는 30 / 19470 = 0.00154이다.
쿼리 카운트(query count)는 stats행의 첫 번째 숫자이다.
Cache가 매우 크다면 결과값의 비율은 가능한 한 최소한의 작은 값이 될 것이고 Cache가 너무 작다면 결과값의 비율은 매우 높을 것이다.
이렇게 3가지 방법으로 dnscache의 Cache용량을 산정해 보았는데, 이렇게 자세하게 다룰 만큼 dnscache의 성능은 놀라울 정도로 좋다.
#--------------------------------------#
100MB Cache로 변경하려면 :
echo 10000000 > /service/dnscache/env/CACHESIZE
echo 104857600 > /service/dnscache/env/DATALIMIT
/usr/local/bin/svc -t /service/dnscache
Qmail Tuning
기본적으로 /var/qmail/bin/qmail-showctl 명령을 실행하여 필요한 항목을 수정합니다.
■ 큐를 빨리 비우고 싶다면
# queuelifetime: (Default.) Message lifetime in the queue is 604800 seconds.
echo '86400' > queuelifetime
■ Concurrencylocal & concurrencyremote
※ concurrencylocal: (Default.) Local concurrency is 10.
※ concurrencyremote: (Default.) Remote concurrency is 20.
echo 200 > concurrencylocal
echo 800 > concurrencyremote
■ timeoutconnect
※ timeoutconnect: (Default.) SMTP client connection timeout is 60 seconds.
echo '30' > timeoutconnect
■ daemontools 에 등록된 서비스 종료
# daemontools 서비스를 시작하려면 다시 링크를 걸어준다
cd /service/qmail
rm -f /service/qmail
svc -dx . log
cd /service/qmail-smtps
rm -f /service/qmail-smtps
svc -dx . log
cd /service/imaps
rm -f /service/imaps
svc -dx .
■ stat 보기
svstat /service/imaps
■ qmail 큐에 있는 메일을 강제로 배달하기
svc -a /service/qmail
■ 서버 잠시 중지시키기 (pause)
svc -p /service/qmail
svc -p /service/qmail-smtps
svc -p /service/imaps
■ 다시 진행시키기(continue)
svc -c /service/qmail
svc -c /service/qmail-smtps
svc -c /service/imaps
※ svc의 옵션 : -u (up), -d (down), -o (once), -p (pause), -c (continue), -h (hangup),-k (kill)
■ Qmail Delivery Test
① Local-local test
empty message를 전송
echo to: naru | /var/qmail/bin/qmail-inject
② Local-error test
존재하지 않는 로컬 주소로 메시지를 전송
You will now have a bounce message in your mailbox.
echo to: nonexistent | /var/qmail/bin/qmail-inject
③ Local-remote test
외부에 존재하는 계정으로 메일을 발송
echo to: your-id@gmail.com | /var/qmail/bin/qmail-inject
④ Local-postmaster test
대소문자 구분 없이 postmaster에게 메일 발송 가능
echo to: POSTmaster | /var/qmail/bin/qmail-inject
⑤ Local-postmaster test
대소문자 구분 없이 postmaster에게 메일 발송 가능
/var/qmail/bin/qmail-inject -f nonexistent To: unknownuser
Subject: testing
This is a test. This is only a test.
Ctrl+d
■ SMTP server test
[root@centos7 ~]# telnet 127.0.0.1 25
Trying 127.0.0.1...
Connected to 127.0.0.1.
Escape character is '^]'.
220 naruhodo.cf ESMTP
helo dude
250 naruhodo.cf
mail naru@naruhodo.cf
250 ok
rcpt naru@naruhodo.cf
250 ok
data
354 go ahead
subject: testing
this is a test...
.
250 ok 1559104724 qp 19451
quit
221naruhodo.cf
Connection closed by foreign host.
[root@centos7 ~]#
■ Qmail Queue관리
Q상태 보기
/var/qmail/bin/qmail-qstat
messages in queue: 0
messages in queue but not yet preprocessed: 0
Q의 내용을 강제로 내보내기
svc -a /service/qmail-send
or
/etc/init.d/qmail doqueue
qmHandle로 관리하기
cd /usr/local/src
wget https://osdn.net/projects/sfnet_qmhandle/downloads/qmhandle-1.3/qmhandle-1.3.2/qmhandle-1.3.2.tar.gz
cd qmhandle-1.3.2
cp ./qmHandle /var/qmail/bin/
qmHandle 옵션들
주로 qmHandle -l 로 큐를 확인한 후 qmhandle -a 모두 내보내기를 한다거나..
Available parameters are:
-a : try to send all queued messages now (qmail must be running)
-l : list message queues
-L : list local message queue
-R : list remote message queue
-s : show some statistics
-mN : display message number N
-dN : delete message number N
-fsender : delete message from sender
-f're' : delete message from senders matching regular expression re
-Stext : delete all messages that have/contain text as Subject
-h're' : delete all messages with headers matching regular expression re (case insensitive)
-b're' : delete all messages with body matching regular expression re (case insensitive)
-H're' : delete all messages with headers matching regular expression re (case sensitive)
-B're' : delete all messages with body matching regular expression re (case sensitive)
-t're' : flag messages with recipients in regular expression 're' for earlier retry (note: this lengthens the time message can stay in queue)
-D : delete all messages in the queue (local & remote)
-V : print program version
Additional (optional) parameters are:
-c : display colored output
-N : list message numbers only
(to be used either with -l, -L or -R)
일본어 버전 (6편)
https://www.jacepark.com/building-mail-servers-with-qmail-over-ssl-in-centos-7-basics
https://www.jacepark.com/building-mail-servers-with-qmail-over-ssl-in-centos-7-vpopmail-qmailadmin/
https://www.jacepark.com/building-mail-servers-with-qmail-over-ssl-in-centos-7-courier-imap/
https://www.jacepark.com/building-mail-servers-with-qmail-over-ssl-in-centos-7-dnscache-ezmlm/
https://www.jacepark.com/building-mail-servers-with-qmail-over-ssl-in-centos-7-operation/
'리눅스 > CentOS7' 카테고리의 다른 글
CentOS7 - 워드프레스(WordPress) 환경 구축하기 (9/10) (0) | 2019.05.25 |
---|---|
CentOS7 - Windows File Server(Samba) 구축하기(7/10) (0) | 2019.05.25 |
CentOS7 - Name Server 구축하기(bind) (4/10) (0) | 2019.05.25 |
CentOS7 - 무료도메인 취득/설정하기 (freenom) (3/10) (0) | 2019.05.25 |
CentOS7 - 초기설정/보안설정 (2/10) (0) | 2019.05.25 |