如何在Postfix中实现SPF
版本1.0
作者:Falko Timme
本教程将介绍如何在Postfix 2.x安装中实现SPF(发件人策略框架)。 发件人策略框架是一个开放标准,规定了防止发件人地址伪造的技术方法(请参见http://www.openspf.org/Introduction )。 Postfix提供了大量SPF扩展和补丁,但大多数需要重新编译Postfix。 因此,我们将从openspf.org安装postfix-policyd-spf-perl
软件包,这是一个Perl软件包,可以在现有的Postfix安装中实现(不需要Postfix编译)。
我想先说说这不是建立这样一个系统的唯一途径。 实现这一目标有很多方法,但这是我所采取的方式。 我不会保证这将为您工作!
1初步说明
我假设你已经设置了一个工作的Postfix邮件服务器。
以下过程是独立于分配的,即它应该适用于任何Linux发行版(但是我在Debian Etch上进行了测试)。
2安装所需的Perl模块
postfix-policyd-spf-perl
包取决于Mail :: SPF
和NetAddr :: IP
Perl模块。 因此,我们将使用Perl shell安装它们。 像这样启动Perl shell:
perl -MCPAN -e shell
如果你第一次运行Perl shell,你会被问到几个问题。 您可以接受所有默认值。 还将询问您是否要使用CPAN存储库。 选择靠近你的仓库。
在最初的Perl shell配置之后,我们可以开始安装所需的模块。 要安装Mail :: SPF
,只需运行
install Mail::SPF
在我的情况下,它试图安装Module :: Build
(这是一个依赖),但是它失败了。 如果发生这种情况,只需键入Perl shell即可
q
然后再次启动Perl shell:
perl -MCPAN -e shell
并尝试再次安装Mail :: SPF
:
install Mail::SPF
这一次它应该成功,你应该看到它还安装了Mail :: SPF
所依赖的模块Net :: DNS :: Resolver :: Programmable
和NetAddr :: IP
。
Mail:SPF的成功安装
应该这样结束:
Installing /usr/local/bin/spfquery
Writing /usr/local/lib/perl/5.8.8/auto/Mail/SPF/.packlist
/usr/bin/make install -- OK
因为NetAddr :: IP
已经安装,我们现在可以离开Perl shell:
q
3安装postfix-policyd-spf-perl
接下来我们从http://www.openspf.org/Software将postfix-policyd-spf-perl
下载到/ usr / src /
目录,并将其安装到/ usr / lib / postfix /
目录中,如下所示:
cd /usr/src
wget http://www.openspf.org/blobs/postfix-policyd-spf-perl-2.001.tar.gz
tar xvfz postfix-policyd-spf-perl-2.001.tar.gz
cd postfix-policyd-spf-perl-2.001
cp postfix-policyd-spf-perl /usr/lib/postfix/policyd-spf-perl
然后我们编辑/etc/postfix/master.cf
,并在最后添加以下节:
vi /etc/postfix/master.cf
[...] policy unix - n n - - spawn user=nobody argv=/usr/bin/perl /usr/lib/postfix/policyd-spf-perl |
(在user = nobody
之前的前导空格很重要,所以Postfix知道这一行属于前一个!)
然后打开/etc/postfix/main.cf
并搜索smtpd_recipient_restrictions
指令。 您应该在该指令
中有reject_unauth_destination,并在reject_unauth_destination
之后添加check_policy_service unix:private / policy,
如下所示:
vi /etc/postfix/main.cf
[...] smtpd_recipient_restrictions = permit_sasl_authenticated,permit_mynetworks,reject_unauth_destination,check_policy_service unix:private/policy [...] |
或者这样:
[...] smtpd_recipient_restrictions = [...] reject_unauth_destination check_policy_service unix:private/policy [...] [...] |
您必须在reject_unauth_destination
之后指定check_policy_service
,否则您的系统可以成为一个开放的中继!
然后重新启动Postfix:
/etc/init.d/postfix restart
已经这样了 您应该检查postfix-policyd-spf-perl
软件包附带的README
文件,它包含一些关于postfix-policyd-spf-perl
如何处理电子邮件的重要细节,例如,像postfix-policyd-spf-perl- 2.0001 README
:
此版本的策略服务器始终在邮件发件人(旧版本)之前检查HELO
如果Mail From为空,版本只是检查了HELO)。 它会拒绝邮件
无法从Mail From或HELO SPF检查。 如果有的话会延迟邮件
临时的SPF错误和消息将被允许
(DEFER_IF_PERMIT)。 如果HELO检查产生REJECT / DEFER结果,Mail From
不会被检查。
如果消息没有被拒绝或延迟,则策略服务器将会准备好
适当的SPF接收头。 在多收件人邮件的情况下,多个
标题将被追加。 如果邮件从不是完全是空的
(即)然后邮件从结果将被用于接收的SPF(例如邮件
从无,即使HELO是通行证)。
策略服务器跳过SPF检查本地主机(127.)和
而是预先添加并记录'SPF跳过 - 本地主机总是允许的'。
4测试policyd-spf-perl
我们可以通过运行测试policyd-spf-perl
perl /usr/lib/postfix/policyd-spf-perl
光标然后等待policyd-spf-perl
shell。 我们现在可以像我们试图将某个域和某个服务器的电子邮件发送到另一个电子邮件地址一样。 policyd-spf-perl
将检查是否允许某个服务器发送发送方域的电子邮件,并向我们显示结果。
所以,让我们看看如果我们尝试从服务器h
****。info@hhhforge.com
发送邮件, 服务器*********。net
(IP地址81.169.1 **。**
)。 h **** forge.com
有一个SPF记录,允许81.169.1 **。**
从h **** forge.com
发送电子邮件。
所以在policyd-spf-perl
shell上,我们键入:
request=smtpd_access_policy
protocol_state=RCPT
protocol_name=SMTP
helo_name=h****forge.com
queue_id=8045F2AB23
sender=info@h****forge.com
recipient=falko.timme@*******.de
client_address=81.169.1**.**
client_name=h****.server*********.net
[empty line]
输出应如下所示:
action=PREPEND Received-SPF: pass (h****forge.com: 81.169.1**.** is authorized to use 'info@h****forge.com' in 'mfrom' identity (mechanism 'ip4:81.169.1**.**' matched)) receiver=server1.example.com; identity=mfrom; envelope-from="info@h****forge.com"; helo=h****forge.com; client-ip=81.169.1**.**
这意味着我们通过了测试。
让我们再试
一次,这次我们将从客户端发送1.2.3.4
( www.example.com
),不允许从h **** forge.com
发送电子邮件:
request=smtpd_access_policy
protocol_state=RCPT
protocol_name=SMTP
helo_name=h****forge.com
queue_id=8045F2AB23
sender=info@h****forge.com
recipient=falko.timme@*******.de
client_address=1.2.3.4
client_name=www.example.com
[empty line]
这是输出,测试失败如预期:
action=PREPEND Received-SPF: softfail (h****forge.com: Sender is not authorized by default to use 'info@h****forge.com' in 'mfrom' identity, however domain is not currently prepared for false failures (mechanism '~all' matched)) receiver=server1.example.com; identity=mfrom; envelope-from="info@h****forge.com"; helo=h****forge.com; client-ip=1.2.3.4
我们现在甚至可以尝试将发件人
字段留空,尽可能多的垃圾邮件发送者。 尽管如此, policyd-spf-perl
应该能够完成测试:
request=smtpd_access_policy
protocol_state=RCPT
protocol_name=SMTP
helo_name=h****forge.com
queue_id=8045F2AB23
sender=
recipient=falko.timme@*******.de
client_address=81.169.1**.**
client_name=h****.server*********.net
[empty line]
这是输出,我们仍然允许从h **** forge.com
发送:
action=PREPEND Received-SPF: pass (h****forge.com: 81.169.1**.** is authorized to use 'h****forge.com' in 'helo' identity (mechanism 'ip4:81.169.1**.**' matched)) receiver=server1.example.com; identity=helo; helo=h****forge.com; client-ip=81.169.1**.**
我们来试试与无效的客户端相同的测试:
request=smtpd_access_policy
protocol_state=RCPT
protocol_name=SMTP
helo_name=h****forge.com
queue_id=8045F2AB23
sender=
recipient=falko.timme@*******.de
client_address=1.2.3.4
client_name=www.example.com
[empty line]
如预期的那样,这是输出:
action=PREPEND Received-SPF: softfail (h****forge.com: Sender is not authorized by default to use 'h****forge.com' in 'helo' identity, however domain is not currently prepared for false failures (mechanism '~all' matched)) receiver=server1.example.com; identity=helo; helo=h****forge.com; client-ip=1.2.3.4
要离开policyd-spf-perl
shell,请键入
[CTRL+C]
5链接
- OpenSPF: http : //www.openspf.org
-
policyd-spf-perl
下载: http : //www.openspf.org/Software - 维基百科上的SPF定义:http: //en.wikipedia.org/wiki/Sender_Policy_Framework
- Postfix: http : //www.postfix.org