• Technology
  • 在Debian上配置邮件服务器:Postfix + Dovecot + SSL

    很多同学都购买了VPS用于干各种各样好玩的事情,你们肯定也有人想过要架设自己的email服务器,以后都使用绑定自己域名的邮件地址,帅到没朋友,再也不用为那些又臭又长又丑的邮箱名发愁啦。

    今天给大家带来这篇教程就是教你如何在Debian系统中架设基于postfix和dovecot的email服务器。本篇主要内容基于DigitalOcean的教程:How to set up a postfix email server with dovecot,其他参考内容有:
    http://www.byteslounge.com/tutorials/postfix-dovecot-ssl-configuration-example
    http://cnedelcu.blogspot.com/2014/01/how-to-set-up-simple-mail-server-debian-linux.html

    快速链接:
    软件简介⇒版本对应⇒SSL证书设置⇒DNS设置⇒Postfix配置⇒Dovecot配置⇒测试

    Postfix介绍

    本教程将教你如何设置一个最基本的email服务器,以及包括Postfix,Dovecot和SSL在内的一些基础知识。

    Postfix本身由一系列服务组成,它们负责接收email,以及将email传递给其他服务。Postfix实现了email的接收、路由以及发送等的核心功能,但它同时也依赖第三方软件来完成其他的工作。
    Postfix有好几百个参数可以设置,通过调节这些参数,你可以为庞大的组织结构配置可靠的邮件服务,如果你有兴趣了解详情可以查看它的官方页面或者使用man 5 postconf命令。这篇教程当然不会涵盖所有参数,但足够满足你为你自己或少数亲朋设置邮件服务器的需求。

    Dovecot介绍

    Dovecot也是个巨型软件,但我们仅会用到它的很小一部分。我们会很详细的介绍调整的每一个参数,你可以选择性的略过一些blahblah,当然后果也是自负:)

    本教程针对的系统及软件版本是

    • Debian 7.1 wheezy x64_86
    • Postfix 2.9.6-2
    • dovecot 1:2.1.7-7

    在我的VPS上已亲测成功,在其他基于Debian的系统(例如Ubuntu)上的设置也十分类似。值得注意的是,Postfix和Dovecot目前均有多个版本在使用(Postfix 1.x~2.10,Dovecot 1.x~2.1),他们之间的设置和功能都有些许差别,这里仅针对Postfix 2.9以及Dovecot 2.1.7有效,其他版本的设置请自行参阅相关文档。

    系统设置

    在开始安装软件之前,请先确保以下事项:

    • 一个域名,例如“mydomain.com”
    • 在该域名下,指向邮件服务器的子域名,例如“mail.mydomain.com”
    • 用于“mail.mydomain.com”的SSL证书

    设置SSL证书

    你需要为SSL生成一个证书与一个私钥,你可以运行以下命令生成证书文件/etc/ssl/certs/mailcert.pem以及私钥/etc/ssl/private/mail.key

    sudo openssl req -x509 -nodes -days 365 -newkey rsa:2048 -keyout /etc/ssl/private/mail.key -out /etc/ssl/certs/mailcert.pem
    

    同时请确保这些文件只能被root读取!SSL证书有很多种类型,你可以阅读这篇文章对它们有更多了解,并根据你的网站结构及需求选择合适的证书类型。上述命令生成的是自签名证书,请注意这种证书仅应在测试时使用,在正式发布的产品中不要使用!你可以使用以下命令要求访问者申请证书署名(CSR)

    sudo openssl req -nodes -days 365 -newkey rsa:2048 -keyout /etc/ssl/private/mail.key -out mailcert.csr
    

    命令中红字标出的-days 365代表证书的时效(天),可根据需求更改。生成过程中填入相应信息:

    Generating a 2048 bit RSA private key
    .............................+++
    ................+++
    writing new private key to 'mail.key'
    -----
    You are about to be asked to enter information that will be incorporated
    into your certificate request.
    What you are about to enter is what is called a Distinguished Name or a DN.
    There are quite a few fields but you can leave some blank
    For some fields there will be a default value,
    If you enter '.', the field will be left blank.
    -----
    Country Name (2 letter code) [AU]: CN
    State or Province Name (full name) [Some-State]: Beijing
    Locality Name (eg, city) []: Beijing
    Organization Name (eg, company) [Internet Widgits Pty Ltd]: Example Company
    Organizational Unit Name (eg, section) []: Infrastructure Services
    Common Name (e.g. server FQDN or YOUR name) []: mail.mydomain.com
    Email Address []: postmaster@mydomain.com
    
    Please enter the following 'extra' attributes
    to be sent with your certificate request
    A challenge password []:
    An optional company name []:

    DNS设置

    在DNS设置中,你需要一个将域名指向邮件服务器IP地址的A记录,以及一个指向邮件服务器主机名的MX记录(Mail eXchange)。此处以使用DigitalOcean DNS系统为例,如果你使用的是其他主机供应商,也能找到类似的设置页面。首先添加A记录让mydomain.com指向服务器IP,然后添加MX记录将mail.mydomain.com指向刚才的A记录。MX记录包含一个优先级,数字越小表示优先级越高,DNS会按照优先级高低选择邮件服务器来处理邮件。

    Adding an A record
    Adding an MX record

    DNS记录通常要经过数小时才能广播到全网,你可以通过这两个工具来检测DNS的广播情况:DNS PropagationMX Lookup。或者运行dighost命令测试

    [root@yourbase] ~# dig MX mydomain.com +short @8.8.8.8
    50 mail.mydomain.com.
    [root@yourbase] ~# host mail.mydomain.com 8.8.8.8
    Using domain server:
    Name:
    Address: 8.8.8.8
    Aliases:
    
    mail.mydomain.com has address 82.196.9.119
    
     其中8.8.8.8是Google架设的DNS服务器,你可以换成你自己使用的DNS服务器地址来检测本地情况。

    Postfix

    做好上述所有准备工作之后,我们可以开始安装并设置Postfix。Debian默认的邮件服务器软件是exim,首先我们卸载它并安装Postfix

    aptitude remove exim4 && aptitude install postfix && postfix stop

    配置Postfix

    Postfix有两个主要配置文件:

    • /etc/postfix/main.cf 主配置文件
    • /etc/postfix/master.cf 配置postfix所需的服务

    首先我们打开/etc/postfix/master.cf

    sudo vim /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功能用于验证用户名和密码。

    接着备份原有的main.cf文件,创建一个空白main.cf

    sudo mv /etc/postfix/main.cf /etc/postfix/main.cf.orig
    sudo vim /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配置:

    smtpd_tls_cert_file=/etc/ssl/certs/mailcert.pem
    smtpd_tls_key_file=/etc/ssl/private/mail.key
    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
    

    这些配置包括指定证书和私钥文件,开启TLS,指定缓存等。根据RFC2487,我们将TLS设置为可选,使得它在其他公共smtp服务器上不是必须使用。同时,由于近来披露的SSL Poodle漏洞,我们禁用SSLv2和SSLv3,而仅仅使用TLSv1.0。

    最后我们添加local_recipient_maps参数:

    local_recipient_maps = proxy:unix:passwd.byname $alias_maps
    

    通过设置这个参数,Postfix将会主动查询一张记录有所有收件人的表,当邮件收件人不在表中时则拒收。如果不设置该参数,则可能会引起“退信错误”(backscatter)。

    别名设置

    另外在别名设置中我们有必要添加几个特定的用户。根据SMTP RFC中规定,任何公共邮件服务器必须接收发往“postmaster”用户的邮件,另外像“hostmaster”,“webmaster”等等也是很多场合下默认使用的邮件地址。你可以通过设置别名,将发往这些“用户”的邮箱转向给root,或其他特定用户。打开/etc/aliases文件

    sudo vim /etc/aliases
    

    添加如下设置,将所有邮件转给root:

    mailer-daemon: postmaster
    postmaster: root
    nobody: root
    hostmaster: root
    usenet: root
    news: root
    webmaster: root
    www: root
    ftp: root
    abuse: root
    

    你还可以再将所有发往root的邮件转给某个用户:

    root: yourname

    编辑完/etc/aliases文件后运行以下命令完成编译。

    newaliases

    Dovecot

    由于只用到Dovecot的一小部分功能,所以它的配置相对简单,胜利就在眼前!

    首先安装Dovecot包:

    aptitude install dovecot-core dovecot-imapd dovecot-common

    同样的,备份/etc/dovecot/dovecot.conf然后新建空白文件

    
    sudo mv /etc/dovecot/dovecot.conf /etc/dovecot/dovecot.orig
    sudo vim /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用户组来管理本地邮箱,mail_location选线顾名思义指定本地邮箱的具体存放位置。同时,你还可以让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/ssl/certs/mailcert.pem
    ssl_key = /etc/ssl/private/mail.key
    

    大功告成!

    结束语

    保存好所有设置文件,然后运行以下命令重启各项服务:

    newaliases
    postfix start
    service dovecot restart
    

    一切正常的话,你现在可以使用这台服务器接收和发送邮件了。作为最简单的测试,你可以登陆其他的邮箱,发送邮件给root@mydomain.com,或者使用mail指令进行测试。

    当然你还可以添加新的用户,让他们使用你的邮件服务器,例如:

    ~# adduser joe
    Adding user `joe' ...
    Adding new group `joe' (1001) ...
    Adding new user `joe' (1001) with group `joe' ...
    Creating home directory `/home/joe' ...
    Copying files from `/etc/skel' ...
    Enter new UNIX password: Enter password here
    Retype new UNIX password: Enter password here
    passwd: password updated successfully
    Changing the user information for joe
    Enter the new value, or press ENTER for the default
            Full Name []:
            Room Number []:
            Work Phone []:
            Home Phone []:
            Other []:
    Is the information correct? [Y/n] Y
    

    先在用户Joe就可以使用joe@mydomain.com这个邮箱地址来收发邮件了。

    你可以查阅系统日志/var/log/syslog和邮件日志/var/log/mail.log来分析和处理遇到的问题。

    以上就是liwen.com上的第一篇教程日志,在本篇的后续教程中我会接着讲解如何设置虚拟邮箱等内容,今后也会带来更多IT相关的精彩内容,欢迎关注~