上网翻邮箱服务器配置的文章,被某文坑了一次之后,看到一篇文章对邮箱服务器配置写的很详细。
看得出作者十分有耐心啊,转过来做留档参考,另外感谢原作者如此翔实的文章
##原文链接以及版权信息## [Noisy Guy >>终于完美的用SENDMAIL, DOVECOT, SASLAUTHD, DKIM-MILTER搭建了邮件服务器][1]
##原文内容##
某天,偶尔看了一下我的VPS的进程,发现有个sendmail,好像曾经在哪见过。。。后来突然想到centos应该都自带了的,闲着蛋疼,就弄一个邮件服务器吧。但这条路真的是好艰辛,在一个莫名其妙的地方卡了我一晚上,最后还是给我用暴力法过去了。我可怜的VPS,你快被我榨干了,什么时候才这么折腾到头。
下边我说一下我折腾的过程,凭记忆写一下,希望对各位有用。虽然我也是查了很多资料,但是这些资料都不全面,我在这就相当于汇总一下,你来到这里就对了,一条龙服务。
首先,确认安装了必要的软件
rpm -qa | grep sendmail #发信服务器
rpm -qa | grep dovecot #imap pop3 服务器
rpm -qa | grep cyrus #sasl认证支持
如果以上都有返回信息的话,恭喜你,这一步你省了。如果没有,跟着一边的做吧
#缺哪个就装哪个,如果显示已安装了更新的版本,你就可以跳过了
yum install sendmail sendmail-cf
yum install dovecot
yum install cyrus-sasl
yum install cyrus-sasl-md5
yum install cyrus-sasl-plain
yum install cyrus-sasl-lib
现在我们可以来配置sendmail了。如果你不是自己编译的,就会在/etc/mail/下有个sendmail.mc文件,直接可以编译这个文件来配置sendmail,不然你就要看sendmail.cf这本天书了,我觉得和二进制码没什么区别,反正就是看不通。
打开sendmail.mc
vi /etc/mail/sendmail.mc
然后修改下边这些东西。注:m4文件内的右引号都是“1”旁边那个,直接复制下边的代码请自行修改,因为它会自动转换成html代码,我就改成正常的右引号了。
#先把这两行前面的dnl删掉,也就是取消注释
dnl TRUST_AUTH_MECH('EXTERNAL DIGEST-MD5 CRAM-MD5 LOGIN PLAIN')dnl
dnl define('confAUTH_MECHANISMS', 'EXTERNAL GSSAPI DIGEST-MD5 CRAM-MD5 LOGIN PLAIN')
#改为
TRUST_AUTH_MECH('EXTERNAL DIGEST-MD5 CRAM-MD5 LOGIN PLAIN')dnl
define('confAUTH_MECHANISMS', 'EXTERNAL GSSAPI DIGEST-MD5 CRAM-MD5 LOGIN PLAIN')
#然后修改登陆SMTP的IP地址,在这我希望在任何地方都可以用这个SMTP服务器来发信
DAEMON_OPTIONS('Port=smtp,Addr=127.0.0.1, Name=MTA')dnl
#改为
DAEMON_OPTIONS('Port=smtp,Addr=0.0.0.0, Name=MTA')dnl
然后生成配置,也就是刚才说的用这个模版生成sendmail.cf
m4 /etc/mail/sendmail.mc > /etc/sendmail.cf
#***************************
#如果出现:sendmail.mc:10: m4: cannot open `/usr/share/sendmail-cf/m4/cf.m4': No such file or directory
#说明需要安装sendmail-cf
#yum install sendmail-cf
#***************************
其实,现在你就可以发信了,但是只能发,不能收,而且就算你现在用这个来发邮件,也不会有任何一个邮箱敢收,因为都会被当作垃圾邮件的。
现在开始设置dovecot,这就是管收邮件的,这样你用邮件客户端登陆的时候,就会自动下载邮件到本地了。
vi /etc/dovecot/dovecot.conf
#去掉下面一行前面的注释
#protocols =imap imaps pop3 pop3s
#改为
protocols =imap pop3 lmtp
然后添加域名到local-host-names
vi /etc/mail/local-host-names
#然后添加你的域名,每行一个,例如你的VPS有多个域名,在这我只有一个,就添加
noisyguy.com
然后修改认证方式,我是用saslauthd来认证的,听说这个安全点。首先编辑/usr/lib/sasl2/Sendmail.conf,如果没有的话就自己新建一个,注意这文件开头是大写的
vi /usr/lib/sasl2/Sendmail.conf
#添加
pwcheck_method:saslauthd
然后再编辑/usr/lib/sasl2/smtpd.conf.rpmsave,同样,如果没有也新建一个
vi /usr/lib/sasl2/smtpd.conf.rpmsave
#把内容改成以下的
log_level: 3
pwcheck_method: saslauthd
mech_list: PLAIN LOGIN
然后再编辑/etc/sysconfig/saslauthd
vi /etc/sysconfig/saslauthd
# Directory in which to place saslauthd's listening socket, pid file, and so
# on. This directory must already exist.
SOCKETDIR=/var/run/saslauthd
# Mechanism to use when checking passwords. Run "saslauthd -v" to get a list
# of which mechanism your installation was compiled with the ablity to use.
MECH=shadow #把这玩意改成这样
# Additional flags to pass to saslauthd on the command line. See saslauthd(8)
# for the list of accepted flags.
FLAGS=
现在基本搞定了,就是把以上这几个程序设置开机启动再重启就好了
#设置开机启动
chkconfig sendmail on
chkconfig dovecot on
chkconfig saslauthd on
#重启
service sendmail restart
service dovecot restart
service saslauthd restart
现在可以添加一个帐户了,千万不要用support这个帐号,我开始就是建了这个,然后发信的时候总收不到。看日志发现都被root帐号给截了,我研究了一个晚上还是没搞明白,也不知道在哪里可以设置。最好我只好相信root是support的老婆,support的邮件都让root看了。重新建了一个别的帐号后,一切正常,眼泪都想出来了!
groupadd mailuser #添加一个组
adduser -g mailuser -s /sbin/nologin testmail #添加一个nologin帐号
passwd testmail #设置密码
好了,现在测试一下testmail能通过saslauthd验证吗
testsaslauthd -u testmail -p password #password为密码
#如果返回OK "Success."说明成功
现在先测试一下SMTP启动没有
[root@mail]# telnet localhost 25
Trying 127.0.0.1...
Connected to localhost.localdomain (127.0.0.1).
Escape character is '^]'.
220 centos5 ESMTP Sendmail 8.13.8/8.13.8; Apri, 25 Tue 2012 06:21:29 +0800
helo localhost
250 centos5 Hello localhost.localdomain [127.0.0.1], pleased to meet you
mail from:
250 2.1.0
rcpt to:
250 2.1.5
data
354 Enter mail, end with "." on a line by itself
From: alin
To: alin
Subject: Hello
test
.
250 2.0.0 o45MLTcH005157 Message accepted for delivery
quit
221 2.0.0 centos5 closing connection
Connection closed by foreign host.
#高亮的部分都是要你输入的地方,如果没有问题,[email protected]这个邮箱就会收到邮件了
下一步你就可以去设置你的DNS了,添加一个mail.noisyguy.com域名,然后再添加一条MX记录。
现在就增加一个用于smtp发信的帐户
saslpasswd2 -u noisyguy.com -c testmail
#然后设置密码
但是,现在你还不能用客户端来登陆你的邮箱收信,又但是,你可以用客户端来发信了,你可以试试, 在SMTP那填上你的地址,然后帐号用[email protected],密码就是你刚刚用saslpasswd2设置的密码,不要使用SSL,因为我们还没有为SMTP添加证书。
要实再收信,我们要设置一下dovecot,让在任何地方的IP都可以登陆到你的imap帐户,编辑/etc/dovecot/dovecot.conf
vi /etc/dovecot/dovecot.conf
#找到login_trusted_network,改为
login_trusted_network = 0.0.0.0/0
然后修改一下/etc/dovecot/conf.d/10-mail.conf
vi /etc/dovecot/conf.d/10-mail.conf
#找到mail_location设置邮箱的路径
mail_location = mbox:~/mail:INBOX=/var/mail/%u
#然后找到mail_privileged_group,给dovecot正确的邮箱目录用户组权限,可以到/var/mail看一下目录是哪个用户组的,我的是mail,所以这样改
mail_privileged_group = mail
基本上没问题了,现在你可以发一封邮件到[email protected],看看用客户端能不能接收。记住,收信邮箱的帐号是用testmail,也就是linux里的帐号。如果有问题,就看一下/var/log/maillog这个日志,里面很详细的出了什么问题。
如果一切OK,恭喜你,你有了自己的企业邮箱,再也不忍受用别人的邮箱发信时附带的广告了。但是,我们还想再完美一点,弄个SSL证书吧,这样我就不用怕国宝看我的邮件了,也不怕我的密码泄漏了,也不怕007了。因为没有SSL的邮件都是明文传输的,弄个SSL加密吧,和银行网站一样的东西,你也能做到高端的。
首先,我们先弄imap的证书,这个是收件用的,这样你也可以在收件服务器那打开SSL了。dovecot有一个生成证书的脚本,我们就用他吧,不然要自己去买的。先下dovecot网站把这个脚本下载来,最好是到/etc/pki/dovecot里下载,因为这个脚本要用到这个目录下的dovecot-openssl.cnf文件
cd /etc/pki/dovecot
wget http://dovecot.org/doc/mkcert.sh
在执行脚本之前,我们先修改一下这个脚本,就是设置一下生成证书的路径
vi mkcert.sh
#找到SSLDIR=修改为
SSLDIR=${SSLDIR-/etc/pki/dovecot/keys}
然后,把原来自带的测试证书改个名,就在/etc/pki/dovecot/keys/这个目录下面,cert/和private/下各有一个,然后就可以修改dovecot-opssl.cnf来设置,你就把你的信息弄进去就好了。
[ req ]
default_bits = 1024
encrypt_key = yes
distinguished_name = req_dn
x509_extensions = cert_type
prompt = no
#以上都不用改,默认的就行
[ req_dn ]
# country (2 letter code)
#C=FI 国家,两个字母,中国就写CN
# State or Province Name (full name)
#ST= 你是哪个省的
# Locality Name (eg. city)
#L=Helsinki 城市
# Organization (eg. company)
#O=Dovecot 公司
# Organizational Unit Name (eg. section)
OU=IMAP server 这个证书用于什么
# Common Name (*.example.com is also possible)
CN=imap.example.com 你的邮箱服务器地址,例如我的mail.noisyguy.com
# E-mail contact
[email protected] 你的e-mail
[ cert_type ]
nsCertType = server
改后以后运行mkcert.sh
/etc/pki/dovecot/mkcert.sh
然后你就可以在/etc/pki/dovecot/keys/cert和/etc/pk/dovecot/keys/private下看到生成的证书了,OK,这样我们设置一下dovecot,让它使证书来登陆,打开/etc/dovecot/dovecot.conf,主要就改这几项
ssl = yes #启用SSL
# Preferred permissions: root:root 0444
ssl_cert =
# Preferred permissions: root:root 0400
ssl_key =
这样就好了,其他的高级选项你还用不上,除非你真的为企业做邮箱服务器,有这需要的话就去看一下dovecot的官网吧。重启dovecot,然后测试一下是否成功了
service dovecot restart
openssl s_client -connect mail.noisyguy.com:imaps
#如果出现下边的信息,就说明成功了
CONNECTED(00000003)
depth=2 /O=Root CA/OU=http://www.cacert.org/CN=CA Cert Signing Authority/[email protected]
verify error:num=19:self signed certificate in certificate chain
verify return:0
---
Certificate chain
0 s:/CN=mail.example.com
i:/O=CAcert Inc./OU=http://www.CAcert.org/CN=CAcert Class 3 Root
1 s:/O=CAcert Inc./OU=http://www.CAcert.org/CN=CAcert Class 3 Root
i:/O=Root CA/OU=http://www.cacert.org/CN=CA Cert Signing Authority/[email protected]
2 s:/O=Root CA/OU=http://www.cacert.org/CN=CA Cert Signing Authority/[email protected]
i:/O=Root CA/OU=http://www.cacert.org/CN=CA Cert Signing Authority/[email protected]
---
Server certificate
-----BEGIN CERTIFICATE-----
MIIE1DCCArygAwIBAgIDAMBPMA0GCSqGSIb3DQEBBAUAMFQxFDASBgNVBAoTC0NB
Y2VydCBJbmMuMR4wHAYDVQQLExVodHRwOi8vd3d3LkNBY2VydC5vcmcxHDAaBgNV
BAMTE0NBY2VydCBDbGFzcyAzIFJvb3QwHhcNMTAxMjIwMTM1NDQ1WhcNMTIxMjE5
MTM1NDQ1WjAmMSQwIgYDjksadnjkasndjksandjksandjksandj5YXJlYS5vcmcw
ggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQC3jOX3FC8wVqnb2r65Sfvk
cYUpJhlbhCfqPdN41c3WS0y1Jwwum1q4oMAJvdRnD5TMff1+fqTFy3lS1sYxIXiD
kBRo478eNqzXHMpBOqbvKjYp/UZgWUNA9ebI1nQtwd7rnjmm/GrtyItjahCsgzDS
qPAie+mXYzuT49ZoG+Glg7/R/jDcLMcJY0d5eJ7kufB1RLhvRitZD4FEbJVehqhY
aevf5bLk1BNFhzRBfLXmv6u/kfvWf2HjGAf0aFhaQyiAldDgnZrvaZOFjkToJk27
p9MguvwGmbciao0DmMjcJhQ0smclFwy8Kj98Tz+nTkfAlU8jJdb1J/tIatJdpSRh
AgMBAAGjgdwwgdkwDAYDVR0TAQH/BAIwADA0BgNVHSUELTArBggrBgEFBQcDAgYI
KwYBBQUHAwEGCWCGSAGG+EIEAQYKKwYBBAGCNwoDAzALBgNVHQ8EBAMCBaAwMwYI
KwYBBQUHAQEEJzAlMCMGCCsGAQUFBzABhadodHRwOi8vb2NzcC5jYWNlcnQub3Jn
LzBRBgNVknsadkjasnjdksandjksandjsnNlY3VyaXR5YXJlYS5vcmegKQYIKwYB
BQUHCAWgHQwbbWFpbC5qb2ludC5zZWN1cml0eWFyZWEub3JnMA0GCSqGSIb3DQEB
BQUAA4ICAQAX8ceObvUZNKYTlNQ/cv0BiA1XweRsVNca1ILACNLdVPR9mvf+aXCh
ODkHaZAmGngj1DfD4fJsTbaydGWSPeVH91Qi9F+Pi6szhsxylI83NKbuXihcenuG
twnte8aIb5FelVHttLQPSKRR62E8YmDWk3KYivuFAuZqDaGnWc5yeneTBpsGter/
4awqsgymBK2YEg1HIWMPaRBvwzCVN/yUyWhFH9Nj11f/xgZE87VXrjLHWT/73i2Z
S4uIZ2KHQUYuxMGldgpXm+QxFM8DGA6z1T1oPCVfW85cezlfr8QVvX6SXZrAUNL0
3D5YPzQuevW+5CrqnGA+F5ff4mBMl8R8Sg0+0LoLqt5PbpGyTt9vS1INZCdfvtIA
/d7Ae7Xp9W8FVRqd7tvNMIy3ZA0/wNMDUczkhC/YtvHfMELpjtMJAGF15OtO7Vik
V+FZnBP1Yd7760dtEmd6bF8vjcXCvDdxwGtcAehAUpIgAWvkHHOt8+H56tkFENAP
/ZpJ+Wr+K3lxkkG+BN1bucxMuAdVyTpFyZfKDHRXIO/5e0hpPOaTO+obD3kifzdh
yy7KmdKvDclHTiPuonJBzEXeM3JQBjcDHbMSyA6+38yBcso27h9VqCQJB2cZmSlW
ArS/9wt2X21KgeuGHlTZ/8z9gXAjQKXhDYECWWd6LkWl98ZDBihslQ==
-----END CERTIFICATE-----
subject=/CN=mail.example.com
issuer=/O=CAcert Inc./OU=http://www.CAcert.org/CN=CAcert Class 3 Root
---
No client certificate CA names sent
---
SSL handshake has read 5497 bytes and written 293 bytes
---
New, TLSv1/SSLv3, Cipher is DHE-RSA-AES256-SHA
Server public key is 2048 bit
Secure Renegotiation IS supported
Compression: zlib compression
Expansion: zlib compression
SSL-Session:
Protocol : TLSv1
Cipher : DHE-RSA-AES256-SHA
Session-ID: 114A22BE4625B33F6893124ACF640AE0628B48B5039E90B3B9A20ADF7FA691F3
Session-ID-ctx:
Master-Key: B8A55EC91A060575CFB29503FBF7160C2DC8BCBFE02D20A7F704882F72D8D00272D8D002CE5CCC4B94A492F43ED8F
Key-Arg : None
TLS session ticket:
0000 - 86 c7 46 63 a5 b6 48 74-16 d8 e0 a7 e2 64 e8 89 ..Fc..Ht.....d..
0010 - 97 90 59 4b 57 f3 e2 b3-e2 d2 88 90 a8 aa b4 44 ..YKW..........D
0020 - ea 24 08 5e b4 14 7f e1-2a 1a 1c 40 ca 85 e7 41 .$.^....*[email protected]
0030 - 9d 0d a8 4c f7 e3 db 1e-ef da 53 9c fe 43 cc 62 ...L......S..C.b
0040 - 79 b6 ad ea 9d cf ca b2-37 41 b7 0f ea 7d 59 e8 y.......7A...}Y.
0050 - 10 01 a0 eb dc c2 63 66-56 54 6a e8 3a 4b 93 49 ......cfVTj.:K.I
0060 - 77 da e4 4b 21 e8 30 7e-bf 10 91 3a 2c f9 59 80 w..K!.0~...:,.Y.
0070 - 01 1f 36 0b 92 85 67 55-c8 86 1d 44 b1 6f 0d ae ..6...gU...D.o..
0080 - 15 36 b6 49 3a ef 94 9a-ef 6d 27 f0 80 20 43 09 .6.I:....m'.. C.
0090 - be 70 c5 30 15 3b 93 c6-c1 4c e9 7f 5c 34 98 dd .p.0.;...L..4..
Compression: 1 (zlib compression)
Start Time: 1292857721
Timeout : 300 (sec)
Verify return code: 19 (self signed certificate in certificate chain)
---
+OK Dovecot ready.
就这样,你可以在客户端设置用SSL登陆了。
下边,我们就来设置一下用带SSL的SMTP来发信吧
我们还是自已来签证书,谁叫我没钱买正版的证书呢。
cd /etc/pki/tls/certs
make sendmail.pem
输入以上命令后,就会要求你输入一些信息,其实就是和上一步骤一样的。然后配置一下/etc/mail/sendmail.mc文件
vi /etc/mail/sendmail.mc
#然后找到这一行,把前边的dnl删了
dnl DAEMON_OPTIONS ('Port=smtps, Name=TLSMTA, M=s')dnl
#然后找到下面这几行,把你的证书路径弄进去,记得把dnl删了
dnl define(`confCACERT_PATH', `/etc/pki/tls/certs')dnl
dnl define(`confCACERT', `/etc/pki/tls/certs/ca-bundle.crt')dnl
dnl define(`confSERVER_CERT', `/etc/pki/tls/certs/sendmail.pem')dnl
dnl define(`confSERVER_KEY', `/etc/pki/tls/certs/sendmail.pem')dnl
#重新生成sendmail.cf并重启sendmail
m4 /etc/mail/sendmail.mc >/etc/mail/sendmail.cf
service sendmail restart
我们来测试一下是否成功了
telnet localhost 25
EHLO localhost
#如果看到
250-STARTTLS
#恭喜你,成功了
似乎到这里一切就结束了,发吧,收吧,一切正常。但是,如果对方的邮箱是Gmail之类的牛X邮箱,是不是把你的邮件当垃圾邮件了呢。之前好像一切正常的,但是用了SSL验证后,就成这样了,莫非是我用了自签署的证书的缘故?谁叫我没钱!谁叫我没钱!谁叫这东西要钱!
不过老子有办法,就是弄一个DKIM来给我们的服务器发出的邮件添加一个数字验证。如果你的域名可以添加SPF记录,那你不用往下看了,因为添加SPF记录就能很简单的解决这个问题。
首先我们先安装dkim-milter
rpm -ivh http://dl.fedoraproject.org/pub/epel/5/i386/dkim-milter-2.8.3-8.el5.i386.rpm
安装好后,随便在哪个地方都行,不过最好在一个你熟悉的地方,执行以下命令
dkim-genkey -r -d noisyguy.com
#把noisyguy.com换成你的域名
然后会在当前的目录下生成一个default.private和default.txt文件,default.txt是公钥部分,打开它会看到如下的东西
default._domainkey IN TXT “v=DKIM1; g=*; k=rsa; p=MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQC2ubSRHUKzL4ucfzuMKEHyy6rx/WlrZB5SKYKrCsSJWUpQstNqjcaLntaQtmKEnDgDr5rMvklaByf8vE5guqZerZ8UWeBx5joIwuohjkapgM/R6lFmI9VUj8N/c5O9AxQAOQLgnDNPl5OQamUuOp9c5W0jLbYd/hrymPYBSKEi0wIDAQAB” ; —– DKIM default for noisyguy.com
现在你可以到你的域名解析中添加一条TXT记录,名字就写default._domainkey,值就是上面双引号中的那一串看不懂的东西。下一步,我们来配置dkim-milter,打开/etc/mail/dkim-milter/dkim-filter.conf,修改以下的几项就行了
Domain noisyguy.com ## 设置域名
KeyFile /etc/mail/dkim/keys/default.private ##就是密钥的保存位置
#如果设置了keylist的话,这条就会被忽略了,如果只有一个密钥的话,就把keylist注释掉
Selector mail1 ##本机使用的selector的名字,比如mail1
Socket local:/var/run/dkim-milter/dkim.sock
接下来,我们配置一下sendmail,打开/etc/mail/sendmail.mc
vi /etc/mail/sendmail.mc
#然后添加以下两行
INPUT_MAIL_FILTER('dkim-milter', 'S=local:/var/run/dkim-milter/dkim-milter.sock')dnl
define('confMILTER_MACROS_ENVFROM', 'i, {auth_type}, {auth_authen}, {auth_ssf}, {auth_author}, {mail_mailer}, {mail_host}, {mail_addr}')dnl
#重新生成sendmail.cf
m4 /etc/mail/sendmail.mc > /etc/mail/sendmail.cf
然后启动dkim并重启sendmail
service dkim-milter start
service sendmail restart
到这,真的是一切都完了。。。。试试发几封看看,应该不会再被当作垃圾了吧,同时你可以在信头的位置看到dkim的签名
DKIM-Signature: v=1; a=rsa-sha256; c=simple/simple; d=noisyguy.com;
s=default; t=1335321913;
bh=vhGcrWEOzdLzyNBO5N2CRkI2e6xSCoIb8v7XqSpD+Rc=;
h=From:Content-Type:Content-Transfer-Encoding:Subject:Date:
Message-Id:To:Mime-Version;
b=LPFwdhKTx2UNdRFaSruV35Dl3StNqSu9/BRdyje/wJvt6mK9HjXYdLdNXfncTJPtR
daYtSoes7nQyHBHacpEvNBaErdb+8Y7eUNp6ZN/w9qFS5UT1JKK/UWnjG7FkAB2nmr
m0i1Swt5wHjFS1xzijmegXx+bDJt65//atKyxYAE=
是不是,一切都完美了?