两周以来,我一直收到从我自己的地址发送的垃圾邮件。
以下是一个例子:
Apr 2 10:15:13 hostname postfix/smtpd[28874]: warning: hostname 212.156.246.74.static.turktelekom.com.tr does not resolve to address 212.156.246.74
Apr 2 10:15:13 hostname postfix/smtpd[28874]: connect from unknown[212.156.246.74]
Apr 2 10:15:14 hostname postfix/smtpd[28874]: 750991E018: client=unknown[212.156.246.74]
Apr 2 10:15:16 hostname postfix/cleanup[28880]: 750991E018: message-id=<[email protected]>
Apr 2 10:15:17 hostname opendkim[14624]: 750991E018: [212.156.246.74] [212.156.246.74] not internal
Apr 2 10:15:17 hostname opendkim[14624]: 750991E018: not authenticated
Apr 2 10:15:17 hostname opendkim[14624]: 750991E018: no signature data
Apr 2 10:15:17 hostname postfix/qmgr[19733]: 750991E018: from=<[email protected]>, size=3207, nrcpt=1 (queue active)
Apr 2 10:15:17 hostname dovecot: lda([email protected]): msgid=<[email protected]>: saved mail to INBOX
Apr 2 10:15:17 hostname postfix/pipe[28882]: 750991E018: to=<[email protected]>, relay=dovecot, delay=2.7, delays=2.7/0.01/0/0.05, dsn=2.0.0, status=sent (delivered via dovecot service)
Apr 2 10:15:17 hostname postfix/qmgr[19733]: 750991E018: removed
Apr 2 10:15:18 hostname postfix/smtpd[28874]: disconnect from unknown[212.156.246.74]
我有这些限制:
smtpd_helo_required = yes
smtpd_client_restrictions = reject_rbl_client all.spam-rbl.fr
smtpd_sender_restrictions = permit_mynetworks permit_sasl_authenticated
smtpd_recipient_restrictions =
reject_unknown_recipient_domain
reject_non_fqdn_recipient
reject_unlisted_sender
permit_mynetworks
reject_authenticated_sender_login_mismatch
permit_sasl_authenticated
reject_unauth_destination
reject_unauth_pipelining
reject_non_fqdn_sender
reject_unknown_sender_domain
reject_invalid_hostname
我应该添加什么来阻止这些电子邮件?
阻止来自未知主机名的邮件是否安全?
我还发现一件事:根据我的收件箱,上述电子邮件是在今天下午 12:40 收到的,尽管我是在上午 10:15 收到的。在电子邮件中伪造接收时间是否也可以?
谢谢您的回答!
答案1
我们可以看到,此消息使用您的地址作为信封发件人:
postfix/qmgr[19733]: 750991E018: from=<[email protected]>, size=3207, nrcpt=1 (queue active)
这意味着您有方法在之后立即拒绝此类邮件MAIL FROM
(或,就像我一样)。至于像和这样的RCPT TO
标题,它们可能是伪造的并且包含任何内容。其他垃圾邮件过滤器(如Spamassassin)可以针对这些进行测试,但那是另一回事。From:
Date:
您的电子邮件客户端显示的是标头提供的时间和日期,Date:
而不是服务器实际收到邮件的时间。您可以查看Received
标头以查看邮件经过的服务器添加的日期,但电子邮件客户端信任标Date:
头。
方法 1:将外部来源的域名列入黑名单
这些方法的顺序并不分明:第一个方法很容易添加,但第二个方法在各方面都更好。
如果此服务器是来自您域的电子邮件的唯一合法来源example.com
,您可以简单地阻止来自该域的所有邮件,除非来自自己的网络或经过身份验证的用户,使用check_sender_access
smtpd_recipient_restrictions
。我个人在拒绝连接之前将所有内容都放入日志中以获取更多详细信息。对于main.cf
:
smtpd_recipient_restrictions =
permit_mynetworks,
permit_sasl_authenticated,
. . .
check_sender_access hash:/etc/postfix/access/sender_access,
. . .
这是白名单和黑名单地址、域名等的/etc/postfix/access/sender_access
查找表(记住)。要将来自此域的邮件列入黑名单,例如postmap
MAIL FROM
example.com 550 YOU ARE NOT ME.
方法 2:为您的域实施 SPF,并在 Postfix 中测试发件人 SPF
如果您有其他邮件来源,则不能使用上一种方法。此外,您确实应该实施 SPF,以防止您的域被用于发送垃圾邮件。首先,您需要TXT
为您的域添加一条记录,列出所有授权发件人。请参阅 SPF介绍和记录语法。
之后,配置你的 Postfix 来检查 SPF(见如何在 Postfix 中实现 SPF)例如
- 安装 Perl
Mail::SPF
及其NetAddr::IP
模块。 安装
postfix-policyd-spf-perl
main.cf
:smtpd_recipient_restrictions = . . . reject_unauth_destination, check_policy_service unix:private/policy-spf, . . .
master.cf
:policy-spf unix - n n - - spawn user=nobody argv=/usr/bin/policyd-spf
答案2
我的环境已经有一个用于接收邮件的向外端口(25)和另一个用于经过身份验证的发送的端口(587)。
我main.cf
有:
smtpd_sender_restrictions = check_sender_access pcre:/etc/postfix/sender-access
(我使用pcre
,因此我可以使用正则表达式)
然后在我的/etc/postfix/sender-access
我有:
/@example.com$/ REJECT 554 You may not send as example.com without authenticating.
(example.com
用您自己的域名替换。)
但后来我需要覆盖我的587
不进行过滤 - 所以我添加了-o smtpd_sender_restrictions=
清除它:
因此,master.cf
我现在有:
# Incoming
25 inet n - n - - smtpd
-o mynetworks_style=host
-o mynetworks=10.0.0.0/8
-o milter_macro_daemon_name=ORIGIN_EXTERNAL
# TLS + authenticated submissions
587 inet n - n - - smtpd
-o smtpd_sender_restrictions=
-o smtpd_tls_security_level=encrypt
-o smtpd_sasl_auth_enable=yes
-o smtpd_client_restrictions=permit_sasl_authenticated,defer
-o milter_macro_daemon_name=ORIGIN_AUTH
(我想我可以做相反的事情,将其清除main.cf
,然后将其设置进去master.cf
。)
为了进行测试,请使用 587 向您的域中的某人发送电子邮件,然后 telnet 到端口 25,看看是否可以手动欺骗一封电子邮件:
$ telnet smtp.example.com 25
Trying 1.2.3.4...
Connected to smtp.example.com.
Escape character is '^]'.
220 smtp.example.com ESMTP Postfix
helo example.com
250 example.com
mail from: [email protected]
250 2.1.0 Ok
rcpt to: [email protected]
554 5.7.1 <[email protected]>: Sender address rejected: 554 You may not send as example.com without authenticating.
答案3
这是垃圾邮件发送者常用的伎俩。您可以通过要求所有发件人都这样做来限制它permit_mynetworks
,permit_sasl_authenticated
这可以通过smtpd_sender_restrictions
以下是 iRedMail 项目的一个示例:
# HELO restriction
smtpd_helo_required = yes
smtpd_helo_restrictions =
permit_mynetworks
permit_sasl_authenticated
check_helo_access pcre:/etc/postfix/helo_access.pcre
reject_non_fqdn_helo_hostname
reject_unknown_helo_hostname
# Sender restrictions
smtpd_sender_restrictions =
reject_unknown_sender_domain
reject_non_fqdn_sender
reject_unlisted_sender
permit_mynetworks
permit_sasl_authenticated
check_sender_access pcre:/etc/postfix/sender_access.pcre
# Recipient restrictions
smtpd_recipient_restrictions =
reject_unknown_recipient_domain
reject_non_fqdn_recipient
reject_unlisted_recipient
check_policy_service inet:127.0.0.1:7777
permit_mynetworks
permit_sasl_authenticated
reject_unauth_destination
如果您没有运行策略服务器,您应该删除 check_policy 内容。