MX邮件投递场景下,SMTP 25端口是否必须启用TLS?
嘿,针对你在老旧Postfix环境里部署新实例、要求客户端必须通过465/587加密中继的需求,我来给你梳理下正确的配置思路——核心是要区分**互联网邮件接收端口(25)和客户端中继端口(465/587)**的TLS策略,毕竟RFC2487的规则是专门针对25端口的,不能一刀切。
首先先明确RFC2487的要求,这一点很关键:
公开引用的SMTP服务器不得要求使用STARTTLS扩展来本地投递邮件。此规则可防止STARTTLS扩展破坏互联网SMTP基础设施的互操作性。公开引用的SMTP服务器是指在域名的MX记录(若无MX记录则为A记录)所列互联网主机的25端口上运行的SMTP服务器
简单说:25端口是用来接收其他邮件服务器发来的邮件的,必须允许未加密的连接,否则会导致很多老邮件服务器无法给你投递邮件,破坏全网的互操作性。所以你原有的smtpd_tls_security_level = may这个全局配置必须保留,不能改。
而465和587是客户端用来发邮件(中继)的端口,我们可以完全强制加密,这和RFC的要求不冲突,反而能提升客户端连接的安全性。下面是具体配置步骤:
1. 配置465端口(SMTPS)
465端口是传统的SMTP over SSL端口,连接建立时就直接加密。你需要在master.cf文件中找到或添加465的配置段,修改成这样:
smtps inet n - y - - smtpd -o smtpd_tls_wrappermode=yes -o smtpd_tls_security_level=encrypt -o smtpd_sasl_auth_enable=yes -o smtpd_recipient_restrictions=permit_sasl_authenticated,reject
参数解释:
smtpd_tls_wrappermode=yes:开启SSL包裹模式,适配465端口的工作方式smtpd_tls_security_level=encrypt:强制要求客户端使用加密连接,未加密的连接直接被拒绝smtpd_sasl_auth_enable=yes:启用用户认证,确保只有授权用户才能用这个端口中继邮件smtpd_recipient_restrictions:只允许认证通过的用户中继,拒绝所有未认证的请求
2. 配置587端口(Submission)
587是标准的客户端提交端口,默认是明文连接后通过STARTTLS升级为加密连接。同样在master.cf中找到或添加587的配置段:
submission inet n - y - - smtpd -o smtpd_tls_security_level=encrypt -o smtpd_sasl_auth_enable=yes -o smtpd_recipient_restrictions=permit_sasl_authenticated,reject -o smtpd_relay_restrictions=permit_sasl_authenticated,reject_unauth_destination
参数解释:
smtpd_tls_security_level=encrypt:强制客户端必须通过STARTTLS升级为加密连接,不支持的连接会被拒绝- 后面的认证和限制参数和465一致,确保只有合法用户才能中继
3. 验证配置并重启服务
完成配置后,先检查Postfix配置文件的语法是否正确:
postfix check
如果没有报错,就重启Postfix服务让配置生效:
systemctl restart postfix
关键注意事项
- 绝对不要修改全局的
smtpd_tls_security_level = may:否则25端口会强制TLS,违反RFC2487的要求,导致其他邮件服务器无法给你投递邮件 - 确保Postfix已经配置了有效的TLS证书:你需要在
main.cf中通过smtpd_tls_cert_file和smtpd_tls_key_file指定证书和密钥的路径,比如用Let's Encrypt的免费证书就很合适
内容的提问来源于stack exchange,提问作者Michael Moser




