[Postfix进阶]Postfix配置SPF并禁止伪造发件人

提醒:本文最后更新于 2892 天前,文中所描述的信息可能已发生改变,请仔细核实。


最近讨论比较多的是邮件被判断为SPAM的一些补救措施,接下来的几篇文章都是关于postfix邮件系统。

当服务器接收到邮件时会检查域名的SPF记录与客户端IP是否匹配,如匹配就被认为是真实的邮件,不匹配就被认为是假冒的邮件(如果对方域名未做SPF记录肯能会被误报)。

额,至于什么是SPF,当然不是防晒指数,而是指Sender Policy Framework。翻译过来就是发信者策略架构,比较拗口,通常都直接称为SPF。

基本的SPF验证,请移驾到《Postfix添加DKIM协议,完善DNS中的SPF解析》查看。

下面说的是配置发信系统,附带SPF检测,配置本地检测系统。

安装不难,如下(算原创吧,亲身安装编辑):

yum install -y perl-Mail-SPF perl-Sys-Hostname-Long perl-NetAddr-IP
wget https://launchpad.net/postfix-policyd-spf-perl/trunk/release2.010/+download/postfix-policyd-spf-perl-2.010.tar.gz
tar zxvf postfix-policyd-spf-perl-2.010.tar.gz
cp postfix-policyd-spf-perl-2.010/postfix-policyd-spf-perl /usr/local/lib/policyd-spf-perl
chmod +x /usr/local/lib/policyd-spf-perl

编辑/etc/postfix/master.cf,添加:

policy    unix -       n       n       -       0       spawn
user=nobody argv=/usr/local/lib/policyd-spf-perl

接着编辑/etc/postfix/main.cf,添加:

smtpd_recipient_restrictions =
  permit_mynetworks,
  permit_sasl_authenticated,
  reject_unknown_sender_domain,
  reject_unauth_destination,
  check_policy_service unix:private/policy
policy_time_limit = 3600

注意:check_policy_service unix:private/policy-spf 必須放置于 reject_unauth_destination 后面。
重启下postfix即可生效。如果不生效的话,可用python来支持。

下载Python2.6.7.tar.bz2 :

python -V
wget http://www.python.org/ftp/python/2.6.7/Python-2.6.7.tar.bz2
tar jxvf Python-2.6.7.tar.bz2
cd Python-2.6.7
./configure
$make && make install
mv /usr/bin/python /usr/bin/python.bak
cp /usr/local/bin/python2.6 /usr/bin/python
python -V

解决系统python软链接指向python2.6版本后,yum不能正常工作

vi /usr/bin/yum

将文本编辑显示的#!/usr/bin/python修改为#!/usr/bin/python2.4:wq保存修改即可。
安装python版的policy-spf:

wget https://launchpad.net/pypolicyd-spf/1.2/1.2/+download/pypolicyd-spf-1.2.tar.gz
tar zxvf pypolicyd-spf-1.2.tar.gz
cd pypolicyd-spf-1.2
python setup.py build
python setup.py install

编辑/etc/postfix/master.cf,添加:

policy-spf     unix -       n       n       -       -       spawn
user=nobody argv=/usr/bin/python /usr/bin/policyd-spf

重启下postfix即可生效。


至于禁止发送伪造发件人邮件嘛,只要改改配置就好了。

编辑/etc/postfix/main.cf,添加或修改如下:

smtpd_sender_login_maps = hash:/etc/postfix/sasl_sender
smtpd_sender_restrictions =
   reject_sender_login_mismatch
smtpd_recipient_restrictions =
   permit_sasl_authenticated

然后,新建用户与账号匹配表,如:

echo "root@kn007.net       root" > /etc/postfix/sasl_sender
echo "no-reply@kn007.net       www" > /etc/postfix/sasl_sender
echo "www@kn007.net       www" > /etc/postfix/sasl_sender

最后,生成hash数据库:

postmap /etc/postfix/sasl_sender

Policy-spy默认不阻止验证失败的发件人邮件,会在邮件头部添加Received-SPF: softfail标签,如果要对其处理可使用Postfix过滤规则header_checks进行匹配操作。

在/etc/postfix/header_checks下,添加:

/Received-SPF: softfail/   REJECT

在/etc/postfix/main.cf中,添加:

header_checks = pcre:/etc/postfix/header_checks

ok,这样一切在服务器自身通不过SPF的会被禁止发送。


我会告诉你,我在添加邮件SPF验证的时候,postfix并没有生效么。。我的vps系统及postfix版本,有点问题(猜的),所以,发送时并没有附带SPF结果。其他vps应该是没问题的。但是因为是本地其实功能不大,只是他在发出去的邮件会带Received-SPF: pass,使被检测为SPAM程度减少。

转载请注明转自:kn007的个人博客的《[Postfix进阶]Postfix配置SPF并禁止伪造发件人