邮件服务器和GPG公钥
Contents
翻译
本文另有 英文版本。
不知不觉中已经划水摸鱼过去一年了,菜鸡依旧是那个毫无长进的菜鸡……确切地说是比原来更菜了,本学期的绩点创下了历史新低,仿佛已经看到了下个学期堕落成为玉泉废宅的自己。值得庆幸的是废宅今天终于配置好了自己的邮件服务器,新的邮箱是 wu@x-nagi.com,欢迎来发邮件骚扰。
邮件服务器
基本配置
找到的比较靠谱的教程是 DigitalOcean 的这一篇。所有 virtual user 的账户信息存储在 virtual_users 数据库里,这样所有的收发邮件都由一个 vmail 用户完成,和实际登录的 Linux 用户名之类的都没有关系。可以在 virtual_aliases 数据库里设置别名,发送到 source 那一列的邮件就直接被放到了 destination 一列的邮箱里。
添加用户的时候直接向数据库里插入即可(ID 设成 NULL 自动增长):
| |
照着这篇教程来整的话应该不会出啥问题(Step 5 的 SpamAssassin 没有试)。值得注意的是,有的主机提供商可能默认 block 了 25 端口,导致发送邮件时谜之失败,这时可以选择换一家提供商或者给提供商发工单请求解封。
搞好之后就可以试着用 Thunderbird 之类的邮件客户端连接一下,连接不上可以先执行 netstat -tulpn 看看端口有没有打开:

登录成功后可以试着给别的邮箱发几封邮件,基本都可以收到。
Advanced
上面发出的邮件大部分都被其他邮件服务识别成了垃圾邮件,这是因为域名还缺少一些配置,导致从该域名发出的邮件可信度不高,可以通过 SPF 等提高信誉。
PTR 记录
给自己的邮件服务器的 IP 地址设置 PTR 记录(reverse DNS),指向邮件的域名,用来证明发出邮件的服务器确实属于该域名。注意 PTR 记录是与 IP 对应的,所以这个要在主机商处设置,下面的 SPF 等都是在域名商处设置。
SPF & DMARC
网上有很详细的 SPF 语法解释,只需要在自己的域名下添加一个 TXT 记录即可。例如我添加了 "v=spf1 a mx -all",即只有 IP 存在于自己的域名的 A 或者 MX 记录中时才放行该邮件。
DMARC 也是一个 TXT 记录,添加在 _dmarc 子域下。执行 dig -t TXT _dmarc.x-nagi.com,可以看到 "v=DMARC1; p=quarantine; rua=mailto:admin@x-nagi.com"。DMARC 里面的 rua 字段填写一个“如果别人发现冒充的邮件时应该通知的管理员的邮箱”,设置了一天之后居然真的收到了一个定期 report……
DKIM
这个略微复杂。DKIM 是在发送邮件时对该邮件进行一次签名,接收方利用 DNS 的 TXT 记录中存储的公钥验证签名。Postfix 可以通过 OpenDKIM 来添加签名,参考又一篇 DigitalOcean 的教程。
这些都整完了之后再发邮件就基本不会被分类成垃圾邮件了,可以在 www.mail-tester.com 测试一下(DNS 记录要一段时间才能扩散出去)。
Encryption
前面 Thunderbird 使用了 993、587 等加密端口和协议,说明本地和自己的服务器交互是加密的,但是试着给 Gmail 发两封邮件,可以看到一个红色的锁,表示邮件在传送过程中并没有加密,所以需要给 Postfix 启动 STARTTLS(Postfix 运行 SMTP,负责和其他的 MTA 交互,发出/接收邮件;Dovecot 运行 IMAP,将邮件从服务器上取到本地)。
我的邮件域名就是根域名,而我在设置 HTTPS 的时候已经申请了一个 SSL 证书,所以直接拿过来用就行了。然而比较奇怪的是,前面的配置过程中明明已经指定证书和密钥了,但是依旧没有加密,后来查了一下发现是没有启用加密……在 Postfix 的 main.cf 里面再加上这 4 行:
| |
~~再来试着骚扰一下 Gmail,~~邮件详情里面可以看到一个灰色的锁,表示传输过程中使用了 TLS。
GPG
劳苦人民终于也开始使用 GPG 了,目前还是入门阶段,正在研究怎么使用。我的公钥:nistp256/0x7DCED4FB 2019-07-26 Nagi Wu <wu@x-nagi.com>,指纹:8057 37D8 C919 EFD7 98FC 14DD E9A2 A095 7DCE D4FB,完整的公钥参见 GPG Key,来交♂流啊。用 --clearsign 签名的纯文本:
| |
发现 Protonmail 是一个不错的邮件服务,有了自己的 GPG 密钥之后就能和 Protonmail 邮箱互相发送加密和签名的邮件了(才不是因为废宅因为买不起 S/MIME 证书)。