Dovecot + Exim = 不允许中继

Dovecot + Exim = 不允许中继

我已经使用 Exim 和 Dovecot 设置了一个简单的邮件服务器。显然我不想拥有开放的中继服务器,所以我想限制来自外部的访问。我设计了以下配置:

  1. Dovecot 监听端口 587 和 993,并使用我的 LDAP 服务器执行身份验证/授权,运行良好。
  2. Exim 本身不执行任何用户身份验证,仅接收外部邮件并将其分发到用户的邮件目录中。到目前为止一切顺利。
  3. 这是我的问题 - 如果我想发送电子邮件,我的 MUA 会与 Dovecot 提交模块对话 -> 它对用户进行身份验证和授权 -> 并将电子邮件转发给 Exim。我在 Dovecot 中配置了:
    submission_relay_host = 127.0.0.1
    submission_relay_port = 25

并在 Exim 中添加了相关 ACL,允许仅从本地主机进行中继,因为 Dovecot 在同一台机器上运行。尽管我在配置中没有使用任何公共 IP 地址,但 Exim 仍然将连接解析为从我的服务器的公共 IP 建立的,并且只有当我将其添加到 Exim ACL 时才允许中继。

两个问题:

  1. 如果我允许这个公共 IP 进入 Exim ACL,会造成多大的安全问题?我可以想象 IP 欺骗攻击,但攻击者必须欺骗我服务器的 IP,我相信这会使两个相同 IP 之间的通信变得不可能……对吗?因此首选方案是:
  2. 我如何强制 Dovecot 使用环回而不是公共 IP 与 Exim 通信?是 Dovecot 决定使用公共 IP 与 Exim 通信,还是 Exim 将本地主机的 IP 地址解析为公共 IP?在 /etc/hosts 中,我只有 127.0.0.1(本地主机)的条目,甚至没有列出带有 FQDN 的公共 IP...

答案1

如果您让 Exim 而不是 dovecot 监听提交端口并传输邮件(使用 daemon_smtp_ports = 25 : 465 : 587),那么您遇到的问题就会少一些。您可以将 Exim 配置为使用 dovecot 进行用户身份验证(在我的系统上,在新文件 /etc/exim4/conf.d/auth/35_exim4-config_auth_server 中):

DOVECOT_AUTH_SOCKET = /var/run/dovecot/auth-client
plain:
        driver = dovecot  
        public_name = PLAIN
        server_socket = DOVECOT_AUTH_SOCKET
        server_set_id = $auth1
        server_advertise_condition = ${if eq{$tls_in_cipher}{}{no}{yes}}
[...]

我认为 $tls_in_cipher 在某些时候已被重命名,请查看文档。确保用户必须在提交端口上进行身份验证(在我的系统中为 /etc/exim4/conf.d/acl/30_exim4-config_check_rcpt):

acl_check_rcpt:

 # deny non-authenticated messages on submission port
 deny
    condition = ${if eq{$interface_port}{587}}
    ! hosts         = <; ; 127.0.0.1 ; localhost ; ::1
    ! authenticated = *
    message = Please authenticate on submission port (587)

#[... your checks ...]

 # accept authenticated messages on submission port
 accept
   condition = ${if eq{$interface_port}{587}}
   authenticated = *
   #add_header = X-Submission: true
   control = submission/sender_retain

然后,您需要在 Dovecot 中定义身份验证监听器(在我的系统上,位于 /etc/dovecot/conf.d/10-master.conf):

  unix_listener auth-client {
    mode = 0660
    user = Debian-exim
  }

相关内容