我用dovecot和postgresql为虚拟用户configuration了exim4,而且我遇到了一个问题,我无法解决,情况是这样的:
我需要,当一个'localdomain'用户试图发送电子邮件到另一个'localdomain'用户或外国用户,需要authentication,否则拒绝操作。
实际上,我试图避免任何types的smtp开放中继。
其实smtp工作正常,只需要设置该要求,我找不到正确的方式来configurationexim正确的获取此行为(是acl或路由或传输规则?)
我怎样才能定义这个configuration?
例1
220 my-server ESMTP Exim 4.84 2016年3月31日星期四22:26:28 +0000 ehlo localhost 250-my-server Hello localhost [192.168.1.X] 250-SIZE 52428800 250-8BITMIME 250stream水 250-AUTH PLAINlogin 250帮助 邮件来自:[email protected] 250 OK rcpt to:[email protected] 250接受 数据 input消息,以“。”结尾。 在一条线上 这一定不会发生,用户“[email protected]”没有被authentication, 他一定不能发送任何消息,直到使用 'auth login'或'auth plain',因为是本地域的用户。 。 250 OK id = 1all3Q-0004l2-V4
例2
220 my-server ESMTP Exim 4.84 2016年3月31日星期四22:58:56 +0000 ehlo localhost 250-my-server Hello localhost [192.168.1.X] 250-SIZE 52428800 250-8BITMIME 250stream水 250-AUTH PLAINlogin 250帮助 邮件来自:[email protected] 250 OK 转到:[email protected] 250接受 数据 input消息,以“。”结尾。 在一条线上 这已经是有效的了。 。 250 OK id = 1allZR-00050E-Sq
ACL RCPT-TOconfiguration文件
acl_check_rcpt:
接受
hosts =:
control = dkim_disable_verify
.ifdef CHECK_RCPT_LOCAL_LOCALPARTS
拒绝
domains = + local_domains
local_parts = CHECK_RCPT_LOCAL_LOCALPARTS
消息=地址中的限制字符
。万一
拒绝
domains =!+ local_domains
local_parts = CHECK_RCPT_REMOTE_LOCALPARTS
消息=地址中的限制字符
。万一
接受
.ifndef CHECK_RCPT_POSTMASTER
local_parts = postmaster
。其他
local_parts = CHECK_RCPT_POSTMASTER
。万一
domains = + local_domains:+ relay_to_domains
.ifdef CHECK_RCPT_VERIFY_SENDER
拒绝
消息=失败!
!acl = acl_local_deny_exceptions
!validation=发件人
。万一
拒绝
!acl = acl_local_deny_exceptions
发件人= $ {if exists exists {CONFDIR / local_sender_callout} \
{CONFDIR / local_sender_callout} \
{}}
!validation=发件人/标注
接受
hosts = + relay_from_hosts
control = submission / sender_retain
control = dkim_disable_verify
接受
authentication= *
control = submission / sender_retain
control = dkim_disable_verify
要求
消息=中继拒绝!
domains = + local_domains:+ relay_to_domains
要求
validation=收件人
拒绝
!acl = acl_local_deny_exceptions
recipients = $ {if exists exists(CONFDIR / local_rcpt_callout)\
{CONFDIR / local_rcpt_callout} \
{}}
!validation=收件人/标注
拒绝
message =发件人信封地址$ sender_address在本地被列入黑名单。 如果您认为这是错误的,请联系postmaster
!acl = acl_local_deny_exceptions
发件人= $ {if exists {CONFDIR / local_sender_blacklist} \
{CONFDIR / local_sender_blacklist} \
{}}
拒绝
message =发件人IP地址$ sender_host_address在本地被列入黑名单。 如果您认为这是错误的,请联系postmaster
!acl = acl_local_deny_exceptions
hosts = $ {if exists {CONFDIR / local_host_blacklist} \
{CONFDIR / local_host_blacklist} \
{}}
接受
域= + relay_to_domains
endpass
validation=收件人
接受
只要确保local_domains不包括任何你想要validation的主机。 这将防止这些服务器的开放中继情况。
但是,服务器通过MX将电子邮件发送到互联网是很常见的。 一般来说,在这种情况下你不需要authentication。
确保relay_to_domains是空的,或只包含您想允许中继的域。 (您是此列表中任何域的开放中继。)
确保您在接受AUTH请求之前需要STARTTLS。 否则,您的密码将很容易被嗅探。
最后,我自己解决了这个问题,我只需要将下一条语句添加到我的aclconfiguration文件中:
接受
消息=必须validation
domains = + local_domains:+ relay_to_domains
发件人=:正则expression式
这也可以通过条件statemen和perl脚本来解决。
谢谢您的帮助。