在Debian Wheezy上配置邮件服务器:Postfix + Dovecot + SSL + DKIM
一直都想有一台自己的邮件服务器,原因有俩:
- 可以使用自己的域名,不必看Google apps等服务的脸色(自打Google Apps免费版只能添加域别名后就放弃使用了,虽然这是一个可以添加1000个用户的帐号)。
- 对新闻组特别有好感,也喜欢由MHonArc生成的archive,展现的方式远远优于目前各种论坛组织方式,将来我也会找时间学习一下MHonArc的配置使用。
正好头脑一时发热又注册了一枚域名,且并没有拿去建站的想法,所以干脆趁热搭建自己的邮件服务器吧。
嗯,本文参考了3篇教程:
- https://www.digitalocean.com/community/tutorials/how-to-set-up-a-postfix-e-mail-server-with-dovecot
- https://www.linode.com/docs/email/email-with-postfix-dovecot-and-mysql
- https://www.digitalocean.com/community/tutorials/how-to-install-and-configure-dkim-with-postfix-on-debian-wheezy
注:本文所有操作均在root下进行
所涉及的软件介绍
- Postfix是一个著名的邮件服务器,由任职于IBM华生研究中心(T.J. Watson Research Center)的荷兰籍研究员Wietse Venema为改良sendmail而开发。Postfix是一个著名的邮件服务器,由任职于IBM华生研究中心(T.J. Watson Research Center)的荷兰籍研究员Wietse Venema为改良sendmail而开发。
- Dovecot是CentOS系统中著名的POP3/IMAP服务器实现。POP3/IMAP是从邮件服务器中读取邮件时使用的协议,POP3将邮件全部从服务器中拖取下来;IMAP则每次从服务器获取邮件名等关键信息,要读某封邮件时,才从服务器下载。
- DKIM(DomainKeys Identified Mail)是一种电子邮件的验证技术,使用密码学的基础提供了签名与验证的功能。发送方会在电子邮件的标头插入
DKIM-Signature
及电子签名资讯。而接收方则透过DNS查询得到公开金钥后进行验证。
DNS设置
- 添加一条SPF记录:
v=spf1 a mx ip4:123.123.123.123 ~all
- Reverse DNS设置,IP到域名的映射,可通过vps控制面板进行设置。
- MX设置
example.com MX 10 example.com example.com MX 10 12.34.56.78 mail.example.com MX 10 12.34.56.78
安装及配置Postfix
Debian默认的邮件服务器软件是exim,首先我们卸载它并安装Postfix。
aptitude remove exim4 && aptitude install postfix && postfix stop
Postfix有两个主要配置文件,主配置文件 /etc/postfix/main.cf
,配置postfix所需的服务 = /etc/postfix/master.cf = 。
- 编辑配置 = /etc/postfix/master.cf =
### 找到#submission,移除#注释修改为以下内容,或者直接添加一下内容到配置文件 submission inet n - - - - smtpd -o syslog_name=postfix/submission -o smtpd_tls_wrappermode=no -o smtpd_tls_security_level=encrypt -o smtpd_sasl_auth_enable=yes -o smtpd_recipient_restrictions=permit_mynetworks,permit_sasl_authenticated,reject -o milter_macro_daemon_name=ORIGINATING -o smtpd_sasl_type=dovecot -o smtpd_sasl_path=private/auth
这样我们添加了一个名为“submission”的smtpd实例,这样它将接受所有来自可信用户的邮件,你可以通过man 5 master命令查看这些配置的详情。简而言之我们开启了TLS用于安全连接,以及由Dovecot提供的SASL功能用于验证用户名和密码。
- 编辑配置
/etc/postfix/main.cf
,备份原有的main.cf文件,创建一个空白main.cf。
mv /etc/postfix/main.cf /etc/postfix/main.cf.orig emacs /etc/postfix/main.cf
添加如下配置:
myhostname = mail.mydomain.com myorigin = /etc/mailname mydestination = mail.mydomain.com, mydomain.com, localhost, localhost.localdomain relayhost = mynetworks = 127.0.0.0/8 [::ffff:127.0.0.0]/104 [::1]/128 mailbox_size_limit = 0 recipient_delimiter = + inet_interfaces = all
这里我们用Debian中提供的/etc/mailname作为默认的发件人地址,你也可以根据需求指定为其他内容。Postfix只会接受收件人地址为mydestination中限定的域名的邮件。relayhost适用于邮件中继转发,例如公司对所有内网发出的邮件进行审查后再发送时使用,此处设为空。
接着添加以下内容,用来指定本地别名映射(alias maps):
alias_maps = hash:/etc/aliases alias_database = hash:/etc/aliases
接下来添加SSL配置,这里禁用SSLv2和SSLv3,而仅仅使用TLSv1.0。
smtpd_tls_cert_file=/etc/dovecot/dovecot.pem smtpd_tls_key_file=/etc/dovecot/private/dovecot.pem smtpd_use_tls=yes smtpd_tls_session_cache_database = btree:${data_directory}/smtpd_scache smtp_tls_session_cache_database = btree:${data_directory}/smtp_scache smtpd_tls_security_level=may smtpd_tls_protocols = !SSLv2, !SSLv3
最后我们添加 local_recipient_maps
参数,通过设置这个参数,Postfix将会主动查询一张记录有所有收件人的表,当邮件收件人不在表中时则拒收。如果不设置该参数,则可能会引起“退信错误”(backscatter)。
local_recipient_maps = proxy:unix:passwd.byname $alias_maps
- 你可以通过设置别名,将发往这些“用户”的邮箱转向给root,或其他特定用户。打开编辑
/etc/aliases
文件,添加如下设置,将所有邮件转给root(也可以设置发给其他用户):
mailer-daemon: postmaster postmaster: root nobody: root hostmaster: root usenet: root news: root webmaster: root www: root ftp: root abuse: root
安装及配置Dovecot
首先安装Dovecot包:
aptitude install dovecot-core dovecot-imapd dovecot-common
同样的,备份/etc/dovecot/dovecot.conf然后新建空白文件:
mv /etc/dovecot/dovecot.conf /etc/dovecot/dovecot.orig emacs /etc/dovecot/dovecot.conf
添加如下配置:
disable_plaintext_auth = no mail_privileged_group = mail mail_location = mbox:~/mail:INBOX=/var/mail/%u userdb { driver = passwd } passdb { args = %s driver = pam } protocols = " imap"
其中 mail_privileged_group
选项指定了mail用户组来管理本地邮箱,maillocation选线顾名思义指定本地邮箱的具体存放位置。同时,你还可以让Dovecot自动创建“垃圾箱”和“已发送”邮件夹:
protocol imap { mail_plugins = " autocreate" } plugin { autocreate = Trash autocreate2 = Sent autosubscribe = Trash autosubscribe2 = Sent }
接着我们设置socket让Postfix可以与Dovecot验证过程同时发生:
service auth { unix_listener /var/spool/postfix/private/auth { group = postfix mode = 0660 user = postfix } }
最后设置SSL:
ssl=required ssl_cert = </etc/dovecot/dovecot.pem ssl_key = </etc/dovecot/private/dovecot.pem
安装及配置DKIM
首先安装 OpenDKIM
apt-get install opendkim opendkim-tools
编辑 /etc/opendkim.conf
文件:
Domain mydomain.com AutoRestart Yes AutoRestartRate 10/1h UMask 002 Syslog yes SyslogSuccess Yes LogWhy Yes Canonicalization relaxed/simple ExternalIgnoreList refile:/etc/opendkim/TrustedHosts InternalHosts refile:/etc/opendkim/TrustedHosts KeyTable refile:/etc/opendkim/KeyTable SigningTable refile:/etc/opendkim/SigningTable Mode sv PidFile /var/run/opendkim/opendkim.pid SignatureAlgorithm rsa-sha256 UserID opendkim:opendkim Socket inet:12301@localhost
编辑 /etc/default/opendkim
文件,加入:
SOCKET="inet:12301@localhost"
这时需要再次修改一下Postfix的配置文件 /etc/postfix/main.cf
了。
milter_protocol = 2 milter_default_action = accept smtpd_milters = inet:localhost:12301 non_smtpd_milters = inet:localhost:12301
增加信任列表:
mkdir /etc/opendkim mkdir /etc/opendkim/keys
编辑 /etc/opendkim/TrustedHosts
127.0.0.1 localhost 192.168.1.1/24 *.mydomain.com #*.example.net #*.example.org
编辑 /etc/opendkim/KeyTable
mail._domainkey.ipb.tw ipb.tw:mail:/etc/opendkim/keys/ipb.tw/mail.private #mail._domainkey.example.net example.net:mail:/etc/opendkim/keys/example.net/mail.private #mail._domainkey.example.org example.org:mail:/etc/opendkim/keys/example.org/mail.private
编辑 /etc/opendkim/SigningTable
*@mydomain.com mail._domainkey.mydomain.com #*@example.net mail._domainkey.example.net #*@example.org mail._domainkey.example.org
cd /etc/opendkim/keys mkdir mydomain.com cd mydomain.com
sudo opendkim-genkey -s mail -d mydomain.com sudo chown opendkim:opendkim mail.private
最后查看 /etc/opendkim/keys/mydomain/mail.txt
,根据里面的内容给域名增加一条TXT记录:
mail._domainkey.mydomain.com. 300 IN TXT "v=DKIM1; k=rsa; p=一大串的編碼9fFUwIDAQAB"
重启 Postfix
及 Dovecot
服务。
给邮件服务器打分
可以通过 http://www.mail-tester.com 来给你发出的邮件进行打分:
对于结果小过表示相当满意。