中了SVOHOST.EXE病毒,手工杀毒过程全纪录 Linux看网卡流量的命令
Sep 16
作者: 肖建彬 | 可以转载, 转载时务必以超链接形式标明文章原始出处和作者信息及版权声明
网址:http://www.xiaojb.com/archives/mailtech/postfix-spf.shtml

学习了一下SPF(Sender Policy FrameWork),SPF目前已经是互联网标准,是对抗垃圾邮件的一项手段
hotmail.com/gmail.com/sohu.com/tom.com/sina.com等都支持这个协议,Postfix从2.3起,支持Sendmail的Milter协议,这使得Postfix能轻松的支持SPF(Sender ID &SPF),我们今天先说SPF。
sid-milter是一个milter协议的SPF和Sender-ID实现,这个软件需要sendmail的libmilter支持,所以我们首先要下载sendmail并编译sendmail。

wget ftp://ftp.sendmail.org/pub/sendmail/sendmail.8.13.8.tar.gz
tar zxf sendmail.8.13.8.tar.gz
cd sendmail-8.13.8/libmilter/
make

我们只需要编译libmilter就可以了,另外还需要知道编译后的libmilter.a的位置,通常在sendmail源码的目录下有一个obj.xxx的目录,我们需要记住这个目录下libmiter.a的位置

debian:/home/xjb/mail/sendmail-8.13.8/libmilter# pwd
/home/xjb/mail/sendmail-8.13.8/libmilter
debian:/home/xjb/mail/sendmail-8.13.8/libmilter# cd ../obj.Linux.2.6.17-1-686.i686/libmilter/
debian:/home/xjb/mail/sendmail-8.13.8/obj.Linux.2.6.17-1-686.i686/libmilter# ls libmilter.a
libmilter.a
debian:/home/xjb/mail/sendmail-8.13.8/obj.Linux.2.6.17-1-686.i686/libmilter#

然后我们sid-milter的网站去下载最新的代码,然后解压。

tar zxf sid-milter-0.2.14.tar.gz
cd sid-milter-0.2.14

这个时候我们可以看看INSTALL&README再进行下一步。
Postfix的官方文档给出了sid-milter的一些patch,我们需要先打上patch

  1. diff -urN sid-milter-0.2.14.org/sid-filter/sid-filter.c sid-milter-0.2.14/sid-filter/sid-filter.c
  2. --- sid-milter-0.2.14.org/sid-filter/sid-filter.c       2006-07-21 06:28:09.000000000 +0800
  3. +++ sid-milter-0.2.14/sid-filter/sid-filter.c   2006-09-16 23:32:10.000000000 +0800
  4. @@ -1949,6 +1949,10 @@
  5. assert(ctx != NULL);
  6. #endif /* !DEBUG */
  7.  
  8. +       ret = mlfi_eoh(ctx);
  9. +       if (ret != SMFIS_CONTINUE)
  10. +           return ret;
  11. +
  12.     memset(stathdr, '\0', sizeof stathdr);
  13.     memset(spf_errmsg, '\0', sizeof spf_errmsg);
  14.     memset(sid_errmsg, '\0', sizeof sid_errmsg);
  15.     @@ -2392,7 +2396,7 @@
  16.     mlfi_envfrom,   /* envelope sender filter */
  17.     NULL,           /* envelope recipient filter */
  18.     mlfi_header,    /* header filter */
  19. -       mlfi_eoh,       /* end of header */
  20. +       NULL,           /* end of header */
  21.     NULL,           /* body block filter */
  22.     mlfi_eom,       /* end of message */
  23.     NULL,           /* message aborted */

然后我们编辑sid-filter/Makefile.m4,这里定义了sid-milter使用的库和库的位置,我的Makefile.m4如下

下载: Makefile.m4
  1. include(confBUILDTOOLSDIR`/M4/switch.m4')
  2.  
  3. define(`confMT', `TRUE')
  4. define(`confREQUIRE_LIBSM', `true')
  5.  
  6. dnl Sometimes enabling this next line clears up some load-time warnings
  7. dnl APPENDDEF(`confLIBS', `-lcipher ')
  8.  
  9. bldPUSH_SMLIB(`sm')
  10. bldPUSH_SMLIB(`marid')
  11.  
  12. PREPENDDEF(`confINCDIRS', `-I../../sendmail ')
  13. PREPENDDEF(`confINCDIRS', `-I../../libmarid ')
  14.  
  15. dnl Disable these three lines if you want to use the OS-provided resolver
  16. dnl instead of the provided asynchronous resolver library.
  17. bldPUSH_SMLIB(`ar')
  18. PREPENDDEF(`confINCDIRS', `-I../../libar ')
  19. APPENDDEF(`confENVDEF', `-DUSE_ARLIB ')
  20.  
  21. dnl Enable these next line if needed to specify the locations of libmilter.a
  22. dnl and the libmilter include files:
  23. APPENDDEF(`confINCDIRS', `-I/home/xjb/mail/sendmail-8.13.8/include')
  24. APPENDDEF(`confLIBDIRS', `-L/home/xjb/mail/sendmail-8.13.8/obj.Linux.2.6.17-1-686.i686/libmilter')
  25.  
  26.  
  27. bldPRODUCT_START(`executable', `sid-filter')
  28. define(`bldSOURCES', `sid-filter.c rfc2822.c util.c ')
  29. PREPENDDEF(`confLIBS', `-lmilter ')
  30. bldPRODUCT_END
  31.  
  32. bldPRODUCT_START(`manpage', `sid-filter')
  33. define(`bldSOURCES', `sid-filter.8')
  34. bldPRODUCT_END
  35.  
  36. bldFINISH

AR(asynchronous resolver library)早在某公司的某个程序里边看到过了。23行是sendmail的头文件路径,24行改为上边提到的libmitler.a的路径。修改保存后就可以编译和安装了。

make
make install

sid-filter被默认安装在/usr/bin/目录下,它的参数可以看man。
我的启动参数是

/usr/bin/sid-filter -a /etc/postfix/milter/peerlist -l -p inet:3332@127.0.0.1 -h

-a是设置了一个信任列表,这里边的域名或者IP不会被过滤,-l是记录syslog,-p是指定socket文件或者监听端口。
-h是在mail的header增加Sid-milter的版本等信息。

另外我们还需要修改DNS,增加一个TXT记录

@       IN      TXT     "v=spf1 ip4:192.168.0.3 ?all"

我还没有看RFC,这里暂且猜测是指定了这个域的邮件服务器的IP地址列表,spf支持的格式有

# host -t txt gmail.com
gmail.com descriptive text "v=spf1 redirect=_spf.google.com"
# host -t txt _spf.google.com
_spf.google.com descriptive text "v=spf1 ip4:216.239.56.0/23 ip4:64.233.160.0/19 ip4:66.249.80.0/20 ip4:72.14.192.0/18 ?all"

# host -t txt hotmail.com
hotmail.com descriptive text "v=spf1 include:spf-a.hotmail.com include:spf-b.hotmail.com include:spf-c.hotmail.com include:spf-d.hotmail.com ~all"

# host -t txt spf-a.hotmail.com
spf-a.hotmail.com descriptive text "v=spf1 ip4:209.240.192.0/19 ip4:65.52.0.0/14 ip4:131.107.0.0/16 ip4:157.54.0.0/15 ip4:157.56.0.0/14 ip4:157.60.0.0/16 ip4:167.220.0.0/16 ip4:204.79.135.0/24 ip4:204.79.188.0/24 ip4:204.79.252.0/24 ip4:207.46.0.0/16 ip4:199.2.137.0/24 ~all"

redirect和include作用相似?

Postfix 2.3及以上的版本支持milter,如果需要这些功能需要升级至2.3。Postfix的main.cf的配置

smtpd_milters = inet:127.0.0.1:3332

关于Postfix对Milter的支持,请看Postfix官网。

SPF的更多实现:http://new.openspf.org/Implementations

注:由于环境的限制,本文只是一个初步的笔记,等我有互联网服务器,并详细测试后,本文会随时更新。

参考:
Howto: Define an SPF Record

One Response to “SPF在Postfix上的实现”

  1. 权威的RBL列表查询 Says:

    [...] SPF在Postfix上的实现 [...]

Leave a Reply