![LDAP 中断时使 Postfix local(8) 暂时失败](https://linux22.com/image/547238/LDAP%20%E4%B8%AD%E6%96%AD%E6%97%B6%E4%BD%BF%20Postfix%20local(8)%20%E6%9A%82%E6%97%B6%E5%A4%B1%E8%B4%A5.png)
我有一个 Unix 系统,其中用户帐户仅存在于 LDAP 中。我正在使用libnss-ldapd和神经胶质细胞这样做效果很好。Postfix 在正常情况下按预期投递邮件。
但是,如果 LDAP 服务器关闭,并且用户映射未完全缓存在 nscd 中,则用户似乎不存在(即getent passwd username
不返回任何结果),因此 Postfix 的本地 (8) 会硬退回电子邮件,并显示“未知用户”错误。这是很坏。
当前配置包括:
smtpd_smtpd_reject_unlisted_recipient = yes
local_recipient_maps = $alias_maps, ldap:/etc/postfix/ldap-passwd.cf
mailbox_transport_maps = ldap:/etc/postfix/ldap-passwd.cf
当 LDAP 服务不可用时,通过 SMTP 接收的邮件会暂时失败。但是,从此主机发出的邮件(例如使用 mail(1))则不会。
Apr 25 15:25:33 testmail postfix/local[5972]: warning: dict_ldap_lookup: Search error -1: Can't contact LDAP server
Apr 25 15:25:33 testmail postfix/local[5972]: 29B4847DB: to=<ENVELOPE_TO_ADDRESS>, orig_to=<ENVELOPE_FROM_ADDRESS>, relay=local, delay=0.12, delays=0.01/0/0/0.11, dsn=5.1.1, status=bounced (unknown user: "ENVELOPE_TO_ADDRESS_LOCALPART")
我相当确定映射配置正确,因为如果 LDAP 服务可用,则一切正常,包括 NSS 因 nslcd 停止而无法查看 LDAP 映射的情况。将 mailbox_transport_maps 保留为默认值(空)会产生相同的结果,只是没有 LDAP 连接错误。如果使用 proxymap(8),则没有任何改进。
当 LDAP 关闭时,如何让 Postfix 延迟(而不是拒绝)收到的邮件?
自从第一次提出以来,这个问题被修改了很多次。最初的问题是问当 LDAP 不可用时如何让 smtpd(8) 暂时失败;事实证明它已经这样做了。真正的问题出现在交付过程的后期。
可能相关:
答案1
事实证明Postfix 中的一个错误。作者将此补丁应用于版本 2.8.4,2.7.5、2.6.11 和 2.5.14。
使用 Postfix 版本修复:
...
本地(8)投递代理忽略了 mailbox_command_maps、mailbox_transport_maps、fallback_transport_maps 和(将邮件反弹到别名时)别名所有者查找中的表查找错误。