康康

在Proxmox开出的小鸡中使用Poste搭建自用邮件服务器
前言看过前面文章的朋友应该知道,康康的阿里云邮件推送曾经被冻结过一次,而SendCloud账号也在康康不使用之后没...
扫描右侧二维码阅读全文
06
2018/09

在Proxmox开出的小鸡中使用Poste搭建自用邮件服务器

前言

看过前面文章的朋友应该知道,康康的阿里云邮件推送曾经被冻结过一次,而SendCloud账号也在康康不使用之后没几天被冻结了(使用的时候不冻结?黑人问号??)

自此之后,康康一直很纠结,的确,阿里云的邮件推送服务的确很好用,也很方便,可有了第一次的冻结,谁知道还会不会有第二次、第三次呢?更无法预料的是,如果下次再被冻结,会很容易的继续解封么?

主动权被掌握在别人的手中,始终是一件很让人担心的事,所以康康一直在寻找有没有替代的方案,之后注册了sendgridmailgunyandex等。

其中sendgrid尝试了一天,愣是没配置成功,邮件死活发不出去,最后因为测试过多,被官方直接封号…………

mailgun也尝试过,很容易配置,也很容易使用,可国内邮箱对mailgun的支持不太好,或者说mailgun对国内的邮箱支持不太好,康康尝试发送到自己的QQ邮箱、腾讯企业邮箱中,全部被标注为垃圾邮件。

yandex是俄罗斯的服务商,有免费企业邮箱,收发信也还算顺畅,康康也测试了下,到国内邮箱没发现什么问题,都是进的收件箱。

测试之后,康康也准备用yandex来替换阿里云邮件推送,不过就在这时,看到了香菇肥牛的一篇文章,就觉得,与其使用别人提供的服务,干脆自己动手来吧~

文章地址:https://qing.su/article/139.html

前置知识

要架设自己的邮件服务器,咱们得先了解部分前置知识,若对这些知识不了解,那邮件服务器搭建起来也是白搭,发送的邮件不是进垃圾邮箱就是拒收。

这里所讲解的前置知识都是关于邮件服务器的域名解析相关知识,共有如下几项:

  1. MX
  2. Reverse DNS
  3. SPF
  4. DMARC
  5. DKIM

MX

MX解析记录是邮件交换记录(邮件路由记录),主要是用来定位邮件服务器的,只要配置过企业邮箱的朋友应该都清楚,配置也没有难点。

只是有点需要注意的地方,就是同一解析前缀下,CNameMX两种解析是不能共存的,这是标准的解析要求,不过有的NS服务商是提供共存的解析模式的,可康康绝对不推荐这样操作,因为极为容易出问题!

举个例子:

domain.com这个域名,咱们做了一个@CName解析,指向了www.domain.com

然后又继续增加一个MX解析记录,@指向了mx.domain.com

那最终的结果会怎样呢?那就是很可能在解析的时候,那一条MX解析记录会被CName解析记录给盖掉,就会造成邮件丢信等情况。

检查域名MX解析是否正确:

nslookup -qt=MX domain.com

Reverse DNS

Reverse DNS,也就是俗称的反向解析,平常的解析是通过域名解析出IP地址,而反向解析是通过IP地址解析出主机名,这在邮件服务器中是非常重要的东西,因为能够通过反向解析而检查出邮件来源,以此来进行判断,若没有做反向解析,部分邮件服务器可能会将邮件判定为垃圾邮件。

不过Reverse DNS这一项解析并不是在自己的NS服务器中操作,而是得通过IP提供商来进行操作,简单的说,就是要通过自己的VPS或者独服后台管理面板进行操作,而且必须是服务商提供这项服务才行。

检查Reverse DNS记录是否正确:

nslookup -qt=PTR 1.1.1.1

查看得出的结果是否为自己邮件服务器的主机名(hostname)。

SPF

SPF是Sender Policy Framework的缩写,一种以IP地址认证电子邮件发件人身份的技术。 接收邮件方会首先检查域名的SPF记录,来确定发件人的IP地址是否被包含在SPF记录里面,如果在,就认为是一封正确的邮件,否则会认为是一封伪造的邮件进行退回。

假设邮件服务器收到了一封邮件,来自主机的 IP 是1.1.1.1,并且声称发件人为admin@domain.com。为了确认发件人不是伪造的,邮件服务器会去查询domain.com的 SPF 记录。如果该域的 SPF 记录设置允许 IP 为1.1.1.1的主机发送邮件,则服务器就认为这封邮件是合法的;如果不允许,则通常会退信,或将其标记为垃圾/仿冒邮件。

检查SPF记录:

nslookup -qt=TXT domain.com

DMARC

DMARC是Domain-based Message Authentication, Reporting & Conformance的缩写,是一种基于现有的SPF和DKIM协议的可扩展电子邮件认证协议,其核心思想是邮件的发送方通过特定方式(DNS)公开表明自己会用到的发件服务器(SPF)、并对发出的邮件内容进行签名(DKIM),而邮件的接收方则检查收到的邮件是否来自发送方授权过的服务器并核对签名是否有效。对于未通过前述检查的邮件,接收方则按照发送方指定的策略进行处理,如直接投入垃圾箱或拒收。从而有效识别并拦截欺诈邮件和钓鱼邮件,保障用户个人信息安全。

检查DMARC记录:

nslookup -qt=TXT _dmarc.domain.com

DKIM

DKIM是DomainKeys Identified Mail的缩写,和SPF一样,是为了解决最为严重的电子邮件欺诈问题。但和SPF不一样的是,DKIM是对邮件内容进行验证,而SPF是对信封进行认证。

DKIM是目前最流行的用来解决邮件欺诈的方案,它的具体做法是生成一对公钥和私钥,私钥由发送者保存,公钥存放在From字段指定域名的TXT记录中。邮件发送时,用私钥加密邮件头的某些字段,并附上邮件内容的HASH值,让用户收到邮件时,查找此原来的公钥,对加密的内容进行解密。

当收到一封邮件后,支持DKIM的服务商就会查询TXT记录,从中找到公钥,用以验证此邮件是否的确是该邮件服务器所发出的。

检查DKIM记录:

nslookup -qt=TXT xxxx._domainkey.domain.com

更改NS解析记录

OK,明白了邮件服务器相关的基础解析知识后,咱们能够知道,如果想要让自己的邮件不进入垃圾邮件或被拒收,需要设定几个关键的解析记录。

当这些记录都设置完成后,那么基本咱们的邮件服务器所发出的邮件是不再会进入垃圾邮件或是拒收了。

那这些记录要如何来设置呢?

这里康康以实例来做讲解,比如康康搭建的邮件服务器主机名为mail.domain.com,邮件服务器的IP地址为1.1.1.1

那么咱们就需要设定如下几条记录:

  1. mail.domain.com A 1.1.1.1
  2. domain.com MX mail.domain.com 10
  3. domain.com IN TXT "v=spf1 mx ~all"
  4. _dmarc.domain.com IN TXT "v=DMARC1; p=none; rua=mailto:dmarc-reports@domain.com"
  5. 1.1.1.1 PTR mail.domain.com

mail.domain.com A 1.1.1.1这一条记录,咱们给domain.com做了一条mail子域名的A记录,指向了邮件服务器IP地址1.1.1.1

domain.com MX mail.domain.com 10这一条记录,咱们给domain.com做了一条MX解析,指向的是mail.domain.com这个地址,也就是上一条A记录,优先级为10。

domain.com IN TXT "v=spf1 mx ~all"这一条记录,咱们添加了SPF解析,仅允许当前MX解析指向的IP发送邮件,其他的均为伪造,同时大家也应该发现,这条记录我标准为了粗体,这是因为康康要特别说明一下,SPF记录可以使用另外的方式来记录。

首先,咱们这个邮件服务器是否只服务一个域名?如果是,那么无所谓,如果有多个,那就建议做如下配置(上面这条就不使用):

domain.com IN TXT "v=spf1 redirect=_spf.domain.com",首先添加一条SPF记录,解析时重定向到_spf.domain.com这条SPF记录中。

_spf.domain.com IN TXT "v=spf1 ip4:1.1.1.1/32 ip6:aaaa:aaa:aaa:aaaa::/64 -all",再做这样一条记录,指定只以允许特定的IPv4及特定的IPv6发送邮件,其余地址的均为伪造邮件。

这样做的好处就是,如果咱们有多个IP地址,或者今后需要更换IP地址,那么咱们只要更换邮件服务器的_spf这条解析记录就行,而不用每个域名SPF记录都去更换一遍。

_dmarc.domain.com IN TXT "v=DMARC1; p=none; rua=mailto:dmarc-reports@domain.com"这一条记录,咱们添加了DMARC解析,当发现伪造邮件时,对方不进行任何操作,而收件方的综合报告将发送到dmarc-reports@domain.com这个邮箱。

1.1.1.1 PTR mail.domain.com这一条记录,咱们添加了PTR解析,将1.1.1.1的反向解析指向到邮件服务器的主机名,这是需要到服务商那里进行设置的,不在NS服务器上设置。

Docker安装

完成了上面的NS配置之后,咱们就可以安心的安装Poste软件了,Poste运行于Docker中,所以咱们需要先安装Docker。

本来康康想使用FreeBSD作为服务器,可惜Docker对FreeBSD的支持实在是有够烂,康康弄了好长时间也没能成功运行起来,只能使用Linux作为服务器,使用的是CentOS 7 x64(只能为64位版本)。

这里要注意下,Poste运行内存达到700多MB,所以请选择至少1GB内存的VPS或服务器来进行搭建。

安装Docker时请注意,若您使用的是Proxmox或其他LXC架构的虚拟机系统,请更换为其他类型的虚拟机,比如Proxmox不要使用创建CT,而用创建虚拟机,也就是添加KVM虚拟机,挂载ISO来安装系统,否则会出现Docker运行不起来的情况。

yum remove postfix -y
curl -sSL https://get.docker.com/ | sh
systemctl enable docker.service
systemctl start docker.service

运行Poste

确保Docker已经启动,且25、80、110、143、443、465、587、993、995端口没有被占用,然后执行下面的命令。

docker run -d -p 25:25 -p 80:80 -p 110:110 -p 143:143 -p 443:443 -p 465:465 -p 587:587 -p 993:993 -p 995:995 --restart=always -v /etc/localtime:/etc/localtime:ro -v /data/poste:/data --name "PosteServer" -h "mail.domain.com" -t analogic/poste.io

执行后,Docker将会创建一个叫做PosteServer的容器,并映射25、80、110、143、443、465、587、993、995到宿主机的对应端口。

容器与宿主机时间同步,并挂载宿主机的/data/poste目录到容器/data下,作为数据存储使用,避免因各种原因导致的容器重启后数据丢失问题。

容器主机名设置为mail.domain.com,并设定为任何情况下均自动重启。

容器使用镜像为analogic/poste.io包,这是Poste的免费镜像,另外有一个收费版本,这个自行去了解。

程序配置

当执行上面的命令后,若无意外,可以执行docker ps,就能看到已经运行了一个叫做"PosteServer"的容器,若出现问题,请根据错误提示解决。

程序启动后,可使用浏览器打开咱们的邮件服务器管理面板,地址为:mail.domain.com,也就是之前设置的A记录地址。

首次登录会要求设置管理员账号,管理员账号为邮件地址,并不一定要为邮件服务器后缀邮箱地址,可随意。

01.jpg

设定完管理员账号后,会自动登录后台,这时依次点击:System settings —— TLS certificate,然后点击绿色的按钮申请免费的SSL证书。

02.jpg

按照香菇肥牛的说明,可在下方填写其他域名,不过康康试过,无论如何就是失败,所以这里只保留邮件服务器域名,申请成功后关闭窗口,重新打开一个新窗口并登陆邮件服务器界面,已经可以看到,SSL为绿色信任了。

03.jpg

添加域名

默认情况下,Poste会自动添加一个管理员账号所对应的域名,比如管理员账号邮箱为administrator@abc.com,那么就会自动添加一个abc.com的域名到系统中,而不是添加邮件服务器域名,这个自动添加的域名咱们不用管。

在后台面板点击左侧Virtual domains按钮,并点击界面中出现的蓝色Create a new virtual domain按钮添加自己的域名。

04.jpg

05.jpg

添加完成后点击Create a new email按钮添加一个邮箱。

06.jpg

07.jpg

完成后返回域名管理界面,并点击create new key生成一个DKIM记录。

08.jpg

09.jpg

按照给出的记录信息,到NS服务器上添加一条TXT解析记录。

收尾工作

到目前为止,咱们的邮件服务器其实可以说已经配置完成了,只要解析记录生效后,咱们就可以正常收发邮件。

不过,一般的邮件服务器都有smtp.domain.compop.domain.comimap.domain.com这样的解析地址,咱们是否可以设置呢?

当然可以,只要把这几条记录添加CName解析,指向mail.domain.com即可。

垃圾邮件测试

为了验证咱们的邮件服务器是否会被其他邮件服务器判定为垃圾邮件,咱们最好对自己的邮件服务器进行一个测试。

打开网站:https://www.mail-tester.com/

10.jpg

使用自己的邮件服务器邮箱发送一封邮件到上面给出的邮件地址,并点击查看你的邮件得分,就可以看到自己的邮件服务器得分情况。

11.jpg

12.jpg

13.jpg

14.jpg

最后修改:2019 年 04 月 27 日 10 : 23 PM
如果觉得我的文章对你有用,请随意赞赏

发表评论

25 条评论

  1. LONG

    请教一下,我在申请换SSL证书后,因为服务器原因,重新进行了poste的搭建,在搭建成功后再次申请证书,就一直申请不了了,并且提示“[2019-01-24 12:42:20] LEScript.INFO: Verification ended with status: valid
    [2019-01-24 12:42:20] LEScript.INFO: Sending signed request to /acme/new-cert”,请问下这个怎么解决呢?

    1. 康康
      @LONG

      有可能是acme的服务器抽筋了,等过段时间再试试

      1. LONG
        @康康

        嗯,好的,等过一段时间再试,谢谢爱喝茶的小伙子他爹解答

        1. 康康
          @LONG

          哈哈,客气了

  2. ccqnb

    经查询,正确的格式为 “ v=spf1 mx -all”

    1. 康康
      @ccqnb

      没有,只是一个是拒绝,一个是软拒绝

  3. 三毛

    博主还有一个问题,为何smtp发信端口只能是587,加密方式TLS。25端口是没被占用的,可以调整吗?因为常用的第三方客户端不支持587。

    1. 康康
      @三毛

      这个请咨询服务商,与我的插件无关的,我的插件可以自己填写端口号,至于服务商的端口号是什么,就得看服务商了,还有,25端口占用没占用这个无关,得看你VPS提供商是否允许使用而已。

  4. 三毛

    你好,DKIM设置时主机填什么?in txt 前面所有的内容?谢谢

    1. 康康
      @三毛

      就是系统给出的这个啊,比如文章中的就是:s2018095724._domainkey

      1. 三毛
        @康康

        这程序真要命。我回复的时候不是说网络问题,就是说内容不合规,我还以为没发出去。

        1. 康康
          @三毛

          哈哈,没事

      2. 三毛
        @康康

        谢谢,我搞不清是不是要带上后面的域名。

        1. 康康
          @三毛

          后面的域名你要看你的NS服务商啊,就和你设置A记录一样的

  5. locyoo

    VPS重启后poste无法启动

    1. 康康
      @locyoo

      这个要注意两点:

      Docker必须自启动;Poste在创建时必须增加--restart=always

      这样就会自动重启,不过,如果你说的是启动错误,那得看看是什么错误了

      1. locyoo
        @康康

        按照大佬的教程配置完了,重启以后docker ps就可以了

        1. 康康
          @locyoo

          呵呵,可以就行

          1. locyoo
            @康康

            poste能批量设置不同邮箱自动转发邮件吗?比如我poste上有500个邮箱,想把所有受到的邮件转发到Gmail,除了挨个设置,有其他办法吗

            1. 康康
              @locyoo

              这个没研究过,不太清楚,你看看能不能域名转发

      2. locyoo
        @康康

        在最前面加就可以了吗?docker run \
        -p 25:25 \
        -p 80:80 \
        -p 110:110 \
        -p 143:143 \
        -p 443:443 \
        -p 587:587 \
        -p 993:993 \
        -p 995:995 \
        -v /etc/localtime:/etc/localtime:ro \
        -v /srv/poste/data:/data \
        --name "PosteServ" \
        -h "mail.xxx.com" \
        -t analogic/poste.io

        1. 康康
          @locyoo

          docker run --restart=always -p 25:25 ....... -t analogic/poste.io

      3. locyoo
        @康康

        在最前面加就可以了吗?docker run \
        -p 25:25 \
        -p 80:80 \
        -p 110:110 \
        -p 143:143 \
        -p 443:443 \
        -p 587:587 \
        -p 993:993 \
        -p 995:995 \
        -v /etc/localtime:/etc/localtime:ro \
        -v /srv/poste/data:/data \
        --name "PosteServ" \
        -h "mail.xxx.com" \
        -t analogic/poste.io

  6. 老左

    收藏你的博客,看到不少干货。邮件服务器确实是有一些用户需要的。

    1. 康康
      @老左

      哈哈,感谢大佬能收藏啊,你的博客也很多干货啊