我的邮件服务器当前在 mxtoolbox 中显示为 Open Relay。
RCPT TO:
目标:仅当example.com时允许 SMTP 连接
RCPT TO:
我应该对它进行哪些更改,以便它在知道不是时立即拒绝连接example.com
。目前,我收到了垃圾邮件,并且我根据拒绝了电子邮件check_recipient_access
。
测试电子邮件:
Trying 127.0.0.1...
Connected to localhost.
Escape character is '^]'.
220 <HOSTNAME> ESMTP Postfix (Debian/GNU)
ehlo test.com
250-<HOSTNAME>
250-PIPELINING
250-SIZE 10240000
250-VRFY
250-ETRN
250-STARTTLS
250-ENHANCEDSTATUSCODES
250-8BITMIME
250 DSN
现在的情况:
mail from: [email protected]
250 2.1.0 Ok
rcpt to: [email protected]
250 2.1.5 Ok
预期:
mail from: [email protected]
250 2.1.0 Ok
rcpt to: [email protected]
REJECT
和
mail from: [email protected]
250 2.1.0 Ok
rcpt to: [email protected]
250 2.1.5 Ok
输出postconf -n
user@hostname:~$ sudo postconf -n
alias_database = hash:/etc/aliases
alias_maps = hash:/etc/aliases
append_dot_mydomain = no
biff = no
config_directory = /etc/postfix
header_checks = pcre:/etc/postfix/header_checks
inet_interfaces = loopback-only
mailbox_size_limit = 0
mydestination = <hostname>, localhost.<domain>, localhost
mydomain = example.com
myhostname = <hostname>
mynetworks = 127.0.0.0/8 [::ffff:127.0.0.0]/104 [::1]/128 10.32.247.0/24
myorigin = <hostname>
readme_directory = no
recipient_delimiter = +
relay_domains = example.com
relayhost = [10.32.247.125]:10000
smtp_tls_session_cache_database = btree:${data_directory}/smtp_scache
smtpd_banner = $myhostname ESMTP $mail_name (Debian/GNU)
smtpd_helo_required = yes
smtpd_recipient_restrictions = reject_unauth_destination, reject_unknown_recipient_domain, permit
smtpd_sender_restrictions = check_recipient_access pcre:/etc/postfix/sender_access, reject_unauth_pipelining, reject_non_fqdn_recipient, reject_unknown_recipient_domain, permit_mynetworks, reject_unauth_destination, permit
smtpd_tls_cert_file = /etc/ssl/certs/ssl-cert-snakeoil.pem
smtpd_tls_key_file = /etc/ssl/private/ssl-cert-snakeoil.key
smtpd_tls_session_cache_database = btree:${data_directory}/smtpd_scache
smtpd_use_tls = yes
详细模式下的邮件日志文件:http://pastebin.com/9q7f5DFp
我现在的情况:
电子邮件 --> Postfix 接受 --> 检查标头 --> 如果不属于 example.com,则丢弃
预期的:
电子邮件 --> Postfix 检查 RCPT TO: == example.com --> 如果不是,则拒绝,并且不再进一步处理
答案1
这是您的 mail.log 中的关键行
NOQUEUE: discard: RCPT from localhost[127.0.0.1]: : 收件人地址触发 DISCARD 操作;from= to= proto=ESMTP helo=
在 postfix 中,DISCARD
这意味着 postfix 假装接受电子邮件,但实际上它会将电子邮件发送到 /dev/null(换句话说,它会丢弃电子邮件)。因此,当您使用 telnet 检查时,postfix 将回复“好的,我接受”。
答案2
开放中继的定义是允许任何未物理绑定到您的网络的人通过它发送邮件的 smtp 服务器。因此,您内部网络上的任何人都应该能够通过服务器向其他 smtp 服务器发送邮件而无需身份验证。但是,您不想将这种能力扩展到全世界。通常,所有 permit 语句都先完成,然后是 rejection_unauth_destination 。我还没有看到反过来做,所以我不确定它是否有效。但是,您在设置中拒绝了错误的东西。reject_unknown_recipient_domain 在这里并不真正适用,它是一个发件人限制。reject_unauth_destination 在这里不执行任何操作,因为您使用 permit 语句允许所有内容。所以这就是为什么 permits 通常在 rejection 语句之前,这样它就知道要拒绝什么。至少这对我来说是有意义的。
smtpd_recipient_restrictions = permit_mynetworks,permit_sasl_authenticated,reject_unauth_destination
这句话的意思是,它将允许在 mynetworks 中定义的任何网络,并允许任何已经通过 SSL/TLS 连接正确验证的用户,并拒绝其他所有内容。即,不是开放中继。