說(shuō)明:
公司的郵件服務(wù)器經(jīng)常收到垃圾郵件,通過(guò)查看/var/log/maillog日志看到有很多來(lái)源為bsoibsfs.com這種不規(guī)則,ping也ping不到的域名。如
Jul 28 07:40:37 FD10 postfix/qmgr[20316]: 5470414C83D6: from=
這主要是因?yàn)榫W(wǎng)路上有人通過(guò)搭建郵件服務(wù)器,任意偽造發(fā)件人地址,從而發(fā)送垃圾郵件。
要解決這個(gè),可以通過(guò)配置郵件服務(wù)器支持 SPF,對(duì)每封進(jìn)入的郵件進(jìn)行SPF驗(yàn)證,過(guò)濾這些這種亂七八糟的域名。
SPF通過(guò)在域名中添加txt記錄,向支持SPF功能的郵件服務(wù)器提供驗(yàn)證信息,心使別人能驗(yàn)證自己;另一方面也可以驗(yàn)證別人。配置spf需要會(huì)進(jìn)行大量dns查詢,因此郵件服務(wù)器的dns請(qǐng)選擇離自己最近的dns。
解決:有兩個(gè)兼容的策略模塊給postfix使用,一個(gè)是用Python編寫(xiě),另一種是用Perl編寫(xiě)的。Perl包滿足最基本的要求,Python包配置復(fù)雜一點(diǎn)。
第一種方式:
1. 安裝SPF模塊(Perl)
# wget https:///postfix-policyd-spf-perl/trunk/release2.010/+download/postfix-policyd-spf-perl-2.010.tar.gz # perl -MCPAN -e 'install version' # perl -MCPAN -e 'install NetAddr::IP' # perl -MCPAN -e 'install Mail::SPF' # perl -MCPAN -e 'install Sys::Hostname::Long' # tar zxvf postfix-policyd-spf-perl-2.010.tar.gz # cd postfix-policyd-spf-perl-2.010 # cp postfix-policyd-spf-perl /usr/libexec/postfix/policyd-spf-perl
2. 配置Postfix支持SPF檢查
# vi /etc/postfix/master.cf //添加以下內(nèi)容: ## spf check policy-spf unix - n n - - spawn user=nobody argv=/usr/bin/perl /usr/libexec/postfix/policyd-spf-perl
# vi /etc/postfix/main.cf //添加以下內(nèi)容: smtpd_recipient_restrictions = ......, check_policy_service unix:private/policy-spf
3. 重新載入postfix服務(wù)
# service postfix reload
4. 域名增加SPF記錄:
給自己的域名添加TXT記錄,含義:
*@dspam.org.cn賬戶只能在116.254.202.94的IP發(fā)送郵件,否則SPF驗(yàn)證不通過(guò)。
# dig -t txt dspam.org.cn dspam.org.cn. 600 IN TXT "v=spf1 ip4:116.254.202.94 ~all"
下面這條,是查找我自己的域名
# nslookup -query=txt gaingreat.com ;; Got SERVFAIL reply from 218.85.157.99, trying next server Server: 114.114.114.114 Address: 114.114.114.114#53 Non-authoritative answer: gaingreat.com text = "v=spf1 a mx ~all" Authoritative answers can be found from:
5. 配置成功后,Postfix的SPF檢查日志如下:
# tail -10f /var/log/maillog postfix/policy-spf[15857]: Policy action=PREPEND Received-SPF: softfail (www.haiyun.me: Sender is not authorized by default //錯(cuò)誤,可以看到softfail postfix/policy-spf[15726]: Policy action=PREPEND Received-SPF: pass (qq.com: Sender is authorized to use 'qq@qq.com' //#正確,pass
6. Policy-spy默認(rèn)不阻止驗(yàn)證失敗的發(fā)件人郵件,會(huì)在郵件頭部添加Received-SPF: softfail標(biāo)簽,如果要對(duì)其處理可使用Postfix過(guò)濾規(guī)則header_checks進(jìn)行匹配操作
# cat /etc/postfix/header_checks //添加header_checks匹配規(guī)則,拒絕未添加txt的域名,及txt認(rèn)證不通過(guò)的 /Received-SPF: none/ REJECT /Received-SPF: softfail/ REJECT
7. 編輯主Postfix主配置文件應(yīng)用此規(guī)則:
# cat main.cf header_checks = pcre:/etc/postfix/header_checks
8. 再次測(cè)試效果,這時(shí)再查看/var/log/maillog就可以看到以下這條記錄,已經(jīng)reject掉了
Jul 28 16:47:31 FD10 postfix/cleanup[9605]: 7408314C86BC: reject: header Received-SPF: none (smartech.com.tw: No applicable sender policy available) receiver=unknown; identity=mailfrom; envelope-from="qtaqw@smartech.com.tw"; helo=smartech.com.tw; client-ip=101.71.37.109 from unknown[101.71.37.109]; from=<qtaqw@smartech.com.tw> to=<tech@lala.com> proto=ESMTP helo=<smartech.com.tw>: 5.7.1 message content rejected
第二種方式,這種方式我還沒(méi)有嘗試,有興趣的可以去試下。
1. 安裝SPF模塊(python)
# wget https:///pypolicyd-spf/1.1/1.1/+download/pypolicyd-spf-1.1.tar.gz # tar zxvf pypolicyd-spf-1.1.tar.gz # cd pypolicyd-spf-1.1 # python setup.py build # python setup.py install
2. 配置Postfix支持SPF檢查
# vi /etc/postfix/master.cf //添加以下內(nèi)容: ## spf check policy-spf unix - n n - - spawn user=nobody argv=/usr/bin/python /usr/bin/policyd-spf
# vi /etc/postfix/main.cf //添加以下內(nèi)容: smtpd_recipient_restrictions = ......, check_policy_service unix:private/policy-spf
3. 重新載入postfix服務(wù)
# service postfix reload
附錄:
附錄1:使用最新版的pypolicyd-spf,需要python-2.6以上版本支持
附錄2:spf只能針對(duì)那些偽造的域名進(jìn)行認(rèn)證
如果來(lái)信地址為lalal@qq.com這種合法的且經(jīng)過(guò)認(rèn)證的,比如lalal@qq.com郵箱被盜,被拿來(lái)發(fā)垃圾郵件這種,則只能通過(guò)郵件內(nèi)容過(guò)濾來(lái)過(guò)濾垃圾郵件。知道的spamlock這個(gè)插件,可以實(shí)現(xiàn)內(nèi)容過(guò)濾,目前還沒(méi)嘗試?。。?/p>
附錄3:spf會(huì)屏蔽沒(méi)有做txt域名解析記錄的域名,如果我們又需要接收他們的郵件怎么辦。
這時(shí)就需要使用postfix的白名單黑名單。具體詳見(jiàn):postfix白名單黑名單
附錄4:安裝perl -MCPAN -e ‘install Mail::SPF’安裝時(shí),一直出現(xiàn)。導(dǎo)出Mail::SPF模塊無(wú)法安裝上
This package fails to build on current sid: t/00.00-class-misc.t .......... ok t/00.01-class-util.t .......... ok t/00.02-class-request.t ....... ok t/00.03-class-result.t ........ ok Unknown error on DNS 'A' lookup of 'example.com' (EDNSError) at /tmp/buildd/mail-spf-perl-2.9.0/blib/lib/Mail/SPF/Server.pm line 573. # Looks like you planned 23 tests but ran 19. # Looks like your test exited with 255 just after 19. t/00.04-class-server.t ........ Dubious, test returned 255 (wstat 65280, 0xff00) Failed 4/23 subtests [...] Test Summary Report ------------------- t/00.04-class-server.t (Wstat: 65280 Tests: 19 Failed: 0) Non-zero exit status: 255 Parse errors: Bad plan. You planned 23 tests but ran 19.
這可能是因?yàn)镸ail::SPF需要調(diào)用的Net::DNS(版本>=0.75)跟libnet-dns-perl不太兼容。具體可以看 libnet-dns-resolver-programmable-perl: broken with newer Net::DNS
可以通過(guò)給Net::DNS打補(bǔ)丁,補(bǔ)丁在https://rt./Public/Bug/Display.html?id=95901,但我這補(bǔ)丁一直打不進(jìn)去 – -,直接下載Net-DNS-0.72.tar.gz,舊版的Net::DNS直接編譯安裝,ok
# wget http://www./download/Net-DNS-0.72.tar.gz # tar zxvf Net-DNS-0.72.tar.gz # cd Net-DNS-0.72 # less README # perl Makefile.PL # make # make install # perl -MCPAN -e 'install Mail::SPF'可以!