在 Postfix 中,如何使用 SQL 查询实现访问规则

在 Postfix 中,如何使用 SQL 查询实现访问规则

我已成功设置了 postfix 以查找用于服务虚拟域的 sql 表。我想要做的是拒绝并立即断开以下任何客户端的连接:

1.尝试MAIL FROM:与我的任何虚拟域匹配的域

2. 不是本地客户端(连接来自 my_networks)。

(我的域名的合法用户想要发送邮件,请使用其他规则的 587 提交服务)

第 2 点是通过以 开始来完成的smtpd_sender_restrictionspermit_mynetworks然后我想附加check_sender_access = ????

我不知道应该在 ???? 中输入什么来查询 SQL 查询。我知道如何用访问哈希表来做到这一点。我不想使用哈希,因为有效域已经在 SQL 中,而且每次我添加域时,我都不想更新访问哈希表。

问题是,REJECT如果 SQL 查询返回任何值,我应该是邮件发件人,OK如果查询不返回任何行,我应该是邮件发件人。我不知道如何使用 SQL 表达该模式 - 操作。

谢谢。

答案1

你应该能够使用这个来实现这一点:

smtpd_sender_restrictions = permit_mynetworks
                            reject_sender_login_mismatch

这将允许任何仅来自 $mynetworks 的 MAIL FROM,或者如果客户端已登录并通过 smtpd_sender_login_maps 列为 MAIL FROM 的所有者。然后,例如,您可以通过 mysql 创建一个“假”查找表,该表始终为您的虚拟域返回不存在的 SASL 登录名。

在 main.cf 中

smtpd_sender_login_maps = proxy:mysql:/etc/postfix/mysql-sender-login-maps.cf

和 mysql-sender-login-maps.cf 像这样

user = database_user
password = users_password
query = SELECT 'NON_EXISTING_SASL_LOGINNAME' FROM maildb.mail_users WHERE email='%s' UNION SELECT 'NON_EXISTING_SASL_LOGINNAME' FROM maildb.mail_domains WHERE CONCAT('@', domain) = '%s'

为此,您需要 Postfix 2.2 或更高版本,否则您必须使用 mysql-sender-login-maps.cf 中的 db_name、table 和 select_field 来构建它。您只需要为现有的 MAIL FROM 地址和域返回该值,否则任何人都无法将邮件发送到您的服务器。

答案2

也许你想看看http://workaround.org/ispmail/squeeze/postfix-database-configuration。这是更大的指南的一部分,即构建以数据库为中心的邮件服务器。

相关内容