Postfix 2.10及以上版本中smtpd_client_restrictions等访问控制指令的执行顺序及生效场景问询
咱们先明确Postfix 2.10及更高版本中,这些指令的执行顺序:
smtpd_client_restrictionssmtpd_helo_restrictionssmtpd_relay_restrictionssmtpd_recipient_restrictions
接下来针对你提出的三个问题,结合文档里的矛盾点逐一解答:
问题1:前两个指令是否总是按指定顺序对所有客户端(MUA和其他SMTP服务器)、所有目标地址执行?
是的,完全正确。smtpd_client_restrictions和smtpd_helo_restrictions属于SMTP会话早期的限制规则——前者在客户端建立连接后就会触发,后者在客户端发送HELO/EHLO命令时执行,和收件人地址是本地还是非本地完全无关,只要有SMTP会话就会按顺序评估这两个规则。
问题2:smtpd_relay_restrictions是总是被评估,还是仅针对非本地域名?
选a) 总是被评估。虽然名字里带“relay”很容易让人误以为它只处理中继场景,但实际上它是Postfix 2.10+中RCPT TO命令阶段最先执行的收件人相关限制,不管目标地址是本地(属于mydestination/virtual_alias_domains/virtual_mailbox_domains)还是非本地。
文档里提到它要在smtpd_recipient_restrictions之前执行,核心目的就是把中继权限控制和本地收件人的垃圾邮件拦截策略分开,避免后者的宽松规则意外导致Postfix被用作开放中继。
问题3:smtpd_recipient_restrictions是总是被评估,还是仅针对本地地址?
选a) 总是被评估。这里容易被文档表述误导:虽然文档推荐“把中继权限规则放在smtpd_relay_restrictions中”,但这只是安全最佳实践,并不意味着smtpd_recipient_restrictions只处理本地地址。
你提到的默认main.cf注释里说“外部邮件服务器的情况下,这个列表会和smtpd_recipient_restrictions结合”,恰恰印证了它会对所有收件人地址生效——包括非本地的中继邮件。而smtpd_recipient_restrictions的文档明确说它“在smtpd_relay_restrictions之后执行”,也说明它是全局生效的,不会因为收件人类型跳过。
备注:内容来源于stack exchange,提问作者user2690527

