从头搭建简单的邮件服务器

记录一下本次实验的过程,以供未来参考

准备工作

  • 注册一个域名(或者使用子域名)本次实验使用 alone.email 进行
  • 一台服务器(检查是否开放25端口)
    • 如果未开放,查看服务商相关政策并提工单请求开放(可能需要比较久,大约1天时间)
    • 个人经验:国内云服务厂商一般默认禁用25端口且禁止搭建邮件服务器(如阿里云、腾讯云等),传统VPS一般不限制;
    • 腾讯云轻量服务器实际上未封禁25端口
    • DigitalOcean 没有具体的政策,提工单也不能解封25端口;
    • Vultr对25端口的封禁有具体政策,且提工单后简单说明用途即可解封,比较友好反应也很快;同时设置rDNS也很方便
    • 本次实验将使用Vultr的服务器进行

设置DNS解析

设置 MX子域 解析到服务器(A/AAAA记录,域名->IP)

$ dig mx1.alone.email A
mx1.alone.email.        600     IN      A       167.179.109.13

$ dig mx1.alone.email AAAA
mx1.alone.email.        600     IN      AAAA    2001:19f0:7001:4233:5400:2ff:fe32:62e6

顶级域 添加MX记录

$ dig alone.email MX
alone.email.            600     IN      MX      5 mx1.alone.email.

添加反向解析 rDNS(PTR记录,IP->域名)

  • 非必须,添加后可降级识别为垃圾邮件概率
  • 需要在服务器提供商处进行(可能需要提工单进行处理)
  • Vultr直接在Setting->IPv4/IPv6内修改即可
$ dig -x 167.179.109.13
13.109.179.167.in-addr.arpa. 3589 IN    PTR     mx1.alone.email.

$ dig -x 2001:19f0:7001:4233:5400:02ff:fe32:62e6
6.e.2.6.2.3.e.f.f.f.2.0.0.0.4.5.3.3.2.4.1.0.0.7.0.f.9.1.1.0.0.2.ip6.arpa. 3599 IN PTR mx1.alone.email.

添加SPF记录

$ dig -x 167.179.109.13
alone.email.            600     IN      TXT     "v=spf1 mx -all"

允许当前域名的 mx 记录对应的 IP 地址来信,拒绝其他IP来信。

如果将 -all 改为 ~all 则是将邮件标记垃圾邮件投递到相应账户。

SPF 原理参考 Gmail SPF策略

准备和运行maddy

准备工作:

  • mx1.alone.email获取TLS证书,可以通过Let’s Encrypt或者云服务商申请
  • 在服务器中安装docker和docker-compose

编写配置文件

docker-compose.yaml

version: "3.5"
services:
  maddy:
    image:    "foxcpp/maddy:latest"
    restart:  always
    volumes:
      - ./data:/data
      - ./data/maddy.conf:/etc/maddy/maddy.conf
    ports:
      - "25:25"   # SMTP  Transfer->Exchange ClearText
      - "587:587" # ESMTP User->Submission   ClearText/STARTTLS
      - "465:465" # SMTPs User->Submission   TLS
      - "143:143" # IMAP  Delivery->User     ClearText
      - "993:993" # IMAPs Delivery->User     TLS

./data/maddy.conf

$(hostname) = mx1.alone.email
$(primary_domain) = alone.email
$(local_domains) = $(primary_domain)

tls file /data/tls_cert.pem /data/tls_key.pem

state_dir /data
runtime_dir /tmp

配置和启动

  1. 将证书和密钥放置在 ./data/tls_cert.pem ./data/tls_key.pem
$ docker-compose up -d # 启动Docker Container服务

$ docker exec -it maddy_maddy_1 sh # 进入Container内部
$ maddyctl creds create [email protected]     # 添加登录账户
$ maddyctl imap-acct create [email protected] # 新建邮件地址

继续添加DNS记录

以下步骤非必选,添加后可以进一步提升发件域信用,降低被识别为垃圾邮件的风险

添加DKIM记录

首次运行之后,maddy会生成DKIM key(邮件将自动使用该key对邮件进行签名), 此时可以添加到DNS记录中以供接收方验证

$ cat ./data/dkim_keys/alone.email_default.dns
v=DKIM1; k=rsa; p=MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAzluDEdgRkfmkT1meDu2Nf5dRXCaWeMW06WNDv56CziThSgVusrs5JQ9Nn3othfCEX0B42VxLM27elxqN66kbBLpBLRShzMxps9qmeQVbX0r1kS4xOg2DDxij6ZCKadSquNmNaUfxPbZxWCjsRet8om5J4ZzHFxTxZWI319Aj8TT+hYd+BOVPJX36jwKzDfT3wOtXL10QJJ6Yeyjfk3PcrsFik8MEcyvsnb4y9+1/AFf/kp1G7D0X2TWxVLImDwDRIU9kBe1PrVmOi8gJKdXBYs8ijuJHhc9Wbb6qBnvqMxgPcbVWvD4j6YOTplGcl1R1fJQtmUfjZk4PpisDQGnMJQIDAQAB

$ dig default._domainkey.alone.email TXT
default._domainkey.alone.email. 600 IN  TXT     "v=DKIM1; k=rsa; p=MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAzluDEdgRkfmkT1meDu2Nf5dRXCaWeMW06WNDv56CziThSgVusrs5JQ9Nn3othfCEX0B42VxLM27elxqN66kbBLpBLRShzMxps9qmeQVbX0r1kS4xOg2DDxij6ZCKadSquNmNaUfxPbZxWCjsRet8om5J4ZzHFxTxZWI319Aj8TT+hYd+BOVPJX36jwKzDfT3w" "OtXL10QJJ6Yeyjfk3PcrsFik8MEcyvsnb4y9+1/AFf/kp1G7D0X2TWxVLImDwDRIU9kBe1PrVmOi8gJKdXBYs8ijuJHhc9Wbb6qBnvqMxgPcbVWvD4j6YOTplGcl1R1fJQtmUfjZk4PpisDQGnMJQIDAQAB"

添加DMARC记录

$ dig _dmarc.alone.email TXT
_dmarc.alone.email.     600     IN      TXT     "v=DMARC1; p=quarantine; ruf=mailto:[email protected]"

收件方如收到SPF或DKIM验证失败,则将邮件移动到垃圾箱,并定期向 [email protected] 发送报告

!!注意!!: 如果使用外部邮件地址,需要在接收域添加相应记录

$ dig alone.email._report._dmarc.mix64.cn TXT
alone.email._report._dmarc.mix64.cn. 600 IN  TXT     "v=DMARC1"

Gmail DMARC参考

添加MTA-STS

  1. 添加mta-sts.alone.email子域解析

  2. mta-sts.alone.email上开启http(s)服务

  3. 创建MTA-STS策略文件,参考Gmail MTA-STS政策

version: STSv1
mode: enforce
mx: mx1.alone.email
max_age: 604800
  1. MTA-STS策略文件发布到https://mta-sts.alone.email/.well-known/mta-sts.txt

  2. 添加DNS记录

$ dig _smtp._tls.alone.email TXT # 用于接收SMTP TLS报告
_smtp._tls.alone.email. 600     IN      TXT     "v=TLSRPTv1; rua=mailto:[email protected]"
$ dig _mta-sts.alone.email TXT   # 用于启用MTA-STS策略,id为策略版本号,可自定义
_mta-sts.alone.email.   600     IN      TXT     "v=STSv1; id=202102231937"

添加DNSSEC, CAA

  • DNS服务商处选择开启DNSSEC,然后将服务商提供的DS记录参数,到域名注册商处进行填写
  • 使用CAA Record Helper生成对应的CAA记录,在DNS服务商处填写
$ dig alone.email DS
alone.email.            21599   IN      DS      2371 13 2 EAC2A76DE37E6DE67706250E3A7B7AB3DA8920B19503E76ADAE2652C 9582F710

$ dig alone.email CAA
alone.email.            299     IN      CAA     0 iodef "mailto:[email protected]"
alone.email.            299     IN      CAA     0 issue "comodoca.com"
alone.email.            299     IN      CAA     0 issue "digicert.com"
alone.email.            299     IN      CAA     0 issue "letsencrypt.org"
alone.email.            299     IN      CAA     0 issuewild "comodoca.com"
alone.email.            299     IN      CAA     0 issuewild "digicert.com"
alone.email.            299     IN      CAA     0 issuewild "letsencrypt.org"

更多

相关工具

后续预计添加的其他技术

  • DANE
  • S/MIME
  • OpenGPG
  • 自动配置

备注

  • 目前Docker对于IPv6的支持还不是太好,未来可能要是用其他方法进行适配