我正在尝试设置带有收件人地址验证的 Postfix 服务器,但没有成功。这是我的相关配置(根据这)
relayhost = x.x.x.x
smtpd_recipient_restrictions = permit_mynetworks, reject_unauth_destination, reject_unknown_recipient_domain, reject_unverified_recipient
unverified_recipient_reject_reason = Address lookup failed
address_verify_negative_cache = no
unverified_recipient_tempfail_action = defer
我将主机设置为我正在测试的域的 MX 记录。
我唯一得到的是:
May 4 10:36:29 marine postfix/smtpd[28788]: connect from xyz
May 4 10:36:29 marine postfix/smtpd[28788]: NOQUEUE: reject: RCPT from xyz: 554 5.7.1 <[email protected]>: Relay access denied; from=<[email protected]> to=<[email protected]> proto=ESMTP helo=<example.nl>
May 4 10:36:29 marine postfix/smtpd[28788]: disconnect from xyz
同时,我了解到收件人地址验证仅验证用户,而不验证域。这意味着我仍然需要将域列为中继域。这是一个问题。
我不想在此服务器上保留可以中继的域列表。目标服务器将接受的内容是动态的,因此我无法继续同步域列表。我计划这样做:
- 使用reject_unknown_recipient_domain阻止成为开放中继。因为文档说这样:“当 Postfix 不是收件人域的最终目的地时拒绝请求”,我认为当 MX 记录不是这个主机时它会拒绝,但显然它没有(使用 netcat 测试端口 25;它是一个开放中继)。
- 如果成功了,它就会探测中继主机的所有地址和将此主机作为 MX 记录的域。但是,它没有。
显然,收件人地址验证仅验证用户,而不是域。
我如何确保 Postfix 确实拒绝了 MX 记录指向其他地方的邮件?
答案1
如果您谈论的是 postfix 通过 smtp 探测中继主机,这无法在本机完成,并且会给 postfix 带来负担。如果它无法通过本地文件/db/ldap 或 dns(域 mx)立即确定是否允许,它将拒绝它。否则 DOS 攻击将很快占用您的资源并破坏您的中继主机。
如果relay_host确实有数据库或ldap用户列表,则可以使用relay_recipient_maps和virtual_mailbox_domains查询relay_host并了解其可用的内容。唯一的缺点是,如果它在任何时候关闭,您的postfix框很可能会出错,出现4XX临时故障,而不是接受邮件并将其保留,直到relay_host可以接受它,这是本地缓存副本的优点。我使用wget从我的中央服务器到我的本地3个postfix中继主机,它们定期下载用户和域的列表。
如果没有有关中继主机提供的详细信息,则无法提供太多配置建议。
答案2
这允许_mx_备份Postfix 中的配置选项可能会做你想做的事情:
允许_mx_备份
当本地邮件系统是 RCPT TO 域的备份 MX,或者该域是授权目的地时,允许该请求(请参阅 permit_auth_destination 了解定义)。
- 安全性:permit_mx_backup 不接受具有发件人指定的路由信息的地址(例如:user@elsewhere@domain)。
- 安全性:当使用 permit_mx_backup_networks 未限制访问时,permit_mx_backup 很容易被滥用。
- 安全性:从 Postfix 2.3 版开始,当本地邮件系统是收件人域的主 MX 时,permit_mx_backup 不再接受该地址。例外:当指定授权目的地时,permit_mx_backup 会接受该地址(请参阅 permit_auth_destination 了解定义)。
- 限制:如果 Postfix 2.0 之前的版本出现临时 DNS 查找问题,邮件可能会被拒绝。
答案3
这个问题从未得到解答,所以让我来回答一下我的解决方法。我只需将文件 rsync.db
过来即可。这是我的 cron 作业:
# I'm not using --times on purpose, because then I can use monitoring to check the file age on the relay, to see if it's still being synced.
*/10 * * * * root rsync -- /path/to/virtual_domains.db /path/to/virtual.db [email protected]:/path/to/targetlocation/
然后中继服务器上的 Postfix 就可以查看这些。