我正在使用 dovecot 和 postgresql 为虚拟用户配置 exim4,但遇到了一个无法解决的问题,情况如下:
我需要当“localdomain”用户尝试向另一个“localdomain”用户或外部用户发送电子邮件时,需要进行身份验证,否则拒绝该操作。
实际上我正在尝试避免任何类型的 smtp 开放中继。
实际上 smtp 工作正常,只需要设置该要求,我找不到正确配置 exim 以获取此行为的正确方法(是 acl 还是路由或传输规则?)
我该如何定义这个配置?
示例 1
220 我的服务器 ESMTP Exim 4.84 2016 年 3 月 31 日星期四 22:26:28 +0000 ehlo 本地主机 250-我的服务器你好本地主机[192.168.1.X] 250-尺寸 52428800 250-8BITMIME 250-流水线 250-AUTH 普通登录 250 帮助 邮件发件人:[电子邮件保护] 250 好 收件地址:[电子邮件保护] 250 已接受 数据 354 输入消息,以“.”结尾,独占一行 这绝不能发生,用户'[电子邮件保护]' 未经认证, 他必须还不能发送任何消息,直到使用 'auth login' 或 'auth plain',因为是本地域的用户。 。 250 确定 id=1all3Q-0004l2-V4
示例 2
220 我的服务器 ESMTP Exim 4.84 2016 年 3 月 31 日星期四 22:58:56 +0000 ehlo 本地主机 250-我的服务器你好本地主机[192.168.1.X] 250-尺寸 52428800 250-8BITMIME 250-流水线 250-AUTH 普通登录 250 帮助 邮件发件人:[电子邮件保护] 250 好 收件地址:[电子邮件保护] 250 已接受 数据 354 输入消息,以“.”结尾,独占一行 这已经有效了。 。 250 确定 id=1allZR-00050E-Sq
ACL RCPT-TO 配置文件
acl_check_rcpt: 接受 主机 = : 控制 = dkim_disable_verify .ifdef CHECK_RCPT_LOCAL_LOCALPARTS 否定 域 = +本地域 本地部分 = CHECK_RCPT_LOCAL_LOCALPARTS 消息 = 地址中的限制字符 。万一 否定 域 = !+本地域 本地部分 = CHECK_RCPT_REMOTE_LOCALPARTS 消息 = 地址中的限制字符 。万一 接受 .ifndef CHECK_RCPT_POSTMASTER local_parts = 邮政局长 。别的 本地部分 = CHECK_RCPT_POSTMASTER 。万一 域 = +本地域:+中继到域 .ifdef CHECK_RCPT_VERIFY_SENDER 否定 消息 = 失败! !acl = acl_local_deny_exceptions !验证 = 发送者 。万一 否定 !acl = acl_local_deny_exceptions 发送者 = ${如果存在{CONFDIR/local_sender_callout}\ {CONFDIR/本地发送者调出}\ {}} !验证 = 发送者/标注 接受 主机 = +relay_from_hosts 控制 = 提交/发送者保留 控制 = dkim_disable_verify 接受 已验证 = * 控制 = 提交/发送者保留 控制 = dkim_disable_verify 要求 消息 = 中继被拒绝! 域 = +本地域:+中继到域 要求 验证 = 收件人 否定 !acl = acl_local_deny_exceptions 收件人 = ${如果存在{CONFDIR/local_rcpt_callout}\ {CONFDIR/local_rcpt_callout}\ {}} !验证 = 收件人/标注 否定 message = 发件人信封地址 $sender_address 在此处本地列入黑名单。如果您认为这是错误的,请联系邮政局长 !acl = acl_local_deny_exceptions 发件人 = ${如果存在{CONFDIR/local_sender_blacklist}\ {CONFDIR/本地发送者黑名单}\ {}} 否定 消息 = 发件人 IP 地址 $sender_host_address 在此处本地列入黑名单。如果您认为这是错误的,请联系邮政局长 !acl = acl_local_deny_exceptions 主机 = ${如果存在{CONFDIR/local_host_blacklist}\ {CONFDIR/local_host_blacklist}\ {}} 接受 域 = +relay_to_domains 端传 验证 = 收件人 接受
答案1
最后我自己解决了这个问题,我只需要在我的 acl 配置文件中添加下一个语句:
接受 消息 = 必须授权 域 = +本地域:+中继到域 发件人 = : 正则表达式
这也可以通过条件语句和 perl 脚本来解决。
谢谢您的帮助。
答案2
只需确保 local_domains 不包含任何您想要要求身份验证的主机即可。这将防止这些服务器出现开放中继的情况。
但是,服务器通过 MX 向互联网发送电子邮件是很常见的。通常,在这种情况下您不需要身份验证。
确保relay_to_domains为空,或者仅包含您想要允许中继到的域。(您是此列表中任何域的开放中继。)
确保在接受 AUTH 请求之前需要 STARTTLS。否则,您的密码将很容易被嗅探。