记录一下本次实验的过程,以供未来参考
准备工作
- 注册一个域名(或者使用子域名)本次实验使用
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
则是将邮件标记垃圾邮件投递到相应账户。
准备和运行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
配置和启动
- 将证书和密钥放置在 ./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"
添加MTA-STS
-
添加mta-sts.alone.email子域解析
-
在mta-sts.alone.email上开启http(s)服务
-
创建MTA-STS策略文件,参考Gmail MTA-STS政策
version: STSv1
mode: enforce
mx: mx1.alone.email
max_age: 604800
-
将MTA-STS策略文件发布到
https://mta-sts.alone.email/.well-known/mta-sts.txt
-
添加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"
更多
相关工具
- MTA-STS validator
- Hardenize 全面检查
- MxToolbox.com
- DNSViz 检查DNSSEC
- DNSSEC Analyzer 检查DNSSEC
- CAA Record Helper CAA记录生成
- Mail Tester邮件分数测试
后续预计添加的其他技术
- DANE
- S/MIME
- OpenGPG
- 自动配置
备注
- 目前Docker对于IPv6的支持还不是太好,未来可能要是用其他方法进行适配