SPF是为了防范垃圾邮件而提出来的一种DNS记录类型,它是一种TXT类型的记录,它用于登记某个域名拥有的用来外发邮件的所有IP地址。例如:

 
    
  1. dig TXT 21cn.com

  2.   21cn.com. 27970 IN TXT "v=spf1ip4:202.105.45.0/24 ip4:61.140.60.0/24 ip4:202.123.79.206 ip4:220.232.167.218 ip4:221.192.129.0/24 ip4:59.36.102.0/24 -all"

按照SPF的格式在DNS记录中增加一条TXT类型的记录,将提高该域名的信誉度,同时可以防止垃圾邮件伪造该域的发件人发送垃圾邮件。
SPF是跟DNS相关的一项技术,它的内容写在DNS的txt类型的记录里面。mx记录的作用是给寄信者指明某个域名的邮件服务器有哪些。SPF的作用跟mx相反,它向收信者表明,哪些邮件服务器是经过某个域名认可会发送邮件的。
由定义可以看出,SPF的作用主要是反垃圾邮件,主要针对那些发信人伪造域名的垃圾邮件。

  添加SPF记录的方法:
   这方法很简单,只要我们的DNS供应商提供的管理界面中可以添加SPF记录就可以设置了(不是所有的供应商会提供这设置,我的域名是在godaddy.com上注册的,可以设置SPF记录)。设置时,添加一个SPF记录,然后输入域名,如果是本域,可用@来表示。然后在VALUE中输入如“v=spf1 ip4:67.202.107.106 -all”的值。 这值分三部分:


  (1)v=spf1 说明是一个SPF的v1记录
  (2)ip4:67.202.107.106 说明邮件会从此声明IPv4地址发出。它可以是一个IP,或一个IP段。如果有多个IP或多个IP段的话,可以声明多个ip4记录(如“ip4:1.0.1.0/24 ip4:1.0.2.0/24″),每个ip4记录间用空格分隔。另外,除了用IPv4外,还可以有如下选择:
      1) ip6: 使用 IPv6 进行验证。
      2) a: 使用一个域名进行验证。这将引起对域名服务器进行一次 A RR 查询。可以按照 a:domain, a:domain/cidr 或 a/cidr 的形式来使用。
      3) mx: 使用 DNS MX RR 进行验证。MX RR 定义了收信的 MTA,这可能和发信的 MTA 是不同的,这种情况基于 mx 的测试将会失败。 可以用 mx:domain, mx:domain/cidr 或 mx/cidr 这些形式进行 mx 验证。
      4) ptr: 使用域名服务器的 PTR RR 进行验证。这时,SPF 使用 PTR RR 和反向图进行查询。如果返回的主机名位于同一个域名之内,就验证通过了。这个参数的写法是 ptr:domain
      5) exist: 验证域名的存在性。可以写成 exist:domain 的形式。
      6) ext: 定义对 type 的可选扩展。如果没有这个字段,那么仅使用单个记录进行问询。
      7) mod: 这是最后的类型指示,作为记录的一个修正值。修正值 描述:
redirect 重定向查询,使用给出的域名的 SPF 记录。
以 redirect=domain 的方式使用。
exp 这条记录必须是最后一条,允许给出一条定制的失败消息。
IN TXT “v=spf1 mx -all exp=getlost.example.com”
getlost IN TXT “You are not authorized to send mail for the domain”


(3)-all 定义匹配时的返回值,可有如下选择:
  1) + 缺省值。在测试完成的时候表示通过。
  2) – 表示测试失败。这个值通常是 -all,表示没有其他任何匹配发生。
  3) ~ 表示软失败,通常表示测试没有完成。
  4) ? 表示不置可否。这个值也通常在测试没有完成的时候使用。
所以“v=spf1 ip4:67.202.107.106 -all”的意思是这个域只有67.202.107.106这个IP可以发邮件出来,其他IP的都是非法的。


如何在 DNS Server 設定 SPF

SPF 說明:
SPF 的全寫是 Sender Policy Framework,它是一個可以保障域名持有人,免被 spammers 冒充發信的一種機制。做法是在域名的 DNS 內加入 SPF record,說明這個域名只會透過那些主機發送郵件,而 SPF record 的格式如下為:
       v=spf1 [[pre] type [ext] ] … [mod]
如果不熟悉 SPF record 也沒關係,我覺得反正不是經常要用到,在 SPF 的官方網站提供了一個很方便的 SPF WIZARD,它會根據你的設定給出一個 SPF record 的字串,直接加入 DNS 及重新啟動即可。
http://old.openspf.org/wizard.html?mydomain=&x=35&y=6 (The SPF Setup Wizard)

補充說明:
SPF 是 Sender Policy Framework 的簡寫, 它是用識別寄件者的來源 IP 位址是否偽造的技術, 這是放在 DNS Server 上的一種技術, 向人說明 cpc.com.tw 寄出的郵件, 其來源 IP 位址都會 203.69.155.3。假設, [email protected] 寄給 yahoo 時, 他會去看 cpc.com.tw 的 DNS Server 所宣稱的來源 IP 位址與目前的來源 IP 位址是否一致, 是的話, 這應該就是可信的寄件者。        



如果在 DNS Server 中加入一筆 SPF record:
1. Linux Bind
       假設我們的域名為 hgiga.com, 其出去的 IP 位址有210.241.239.221, 203.69.97.156, 210.241.239.253
       設在 /var/named/hgiga.com.hosts 中, 加入內容如下:

               hgiga.com.                500     IN      TXT     "v=spf1 ip4:210.241.239.221 ip4:203.69.97.156 ip4:210.241.239.253
- all"

       誠如您所看到的, 它是一筆 TXT 記錄。 500 是設定 TTL (Time To Live) 的秒數。500秒意指這個設定 500 秒內都不需重讀。

2. Solaris        
       假設我的域名為 cpc.com.tw, 出去的 IP 位址有 203.69.155.3
       設在 /var/named/named.data 中, 加入內容如下:
               cpc.com.tw.     500     IN      TXT     "v=spf1 ip4:203.69.155.3 mx a:ap1.cpc.com.tw a:ap2.cpc.com.tw a:ap3.cpc.com.tw
- all"
       然後再 kill -1 named.pid 使設定生效



測試 SPF 記錄是否有成功:
1. http://www.seoconsultants.com/tools/spf/
       輸入 Domain, 如 hgiga.com; 然後再輸入來源 IP 位址, 如 210.241.239.221, 得到 Result 為 Pass, 表示為可信任的來源
2. http://www.dnsreport.com/
       輸入 Domain, 如 hgiga.com, 在 Mail 那塊的檢測的最後一部份, 會說您有 SPF record.
3. 利用 dig 指令
       # dig txt hgiga.com
       ;; ANSWER SECTION:
       hgiga.com.              500     IN      TXT     "v=spf1 ip4:210.241.239.221 ip4:203.69.97.156 ip4:210.241.239.253 -all"



附註:
1. Perl CPAN Library: Mail::SPF:uery (此 Library 可用來查詢 SPF record, 藉此驗來寄件者的來源 IP 是否可信)        
2. SPF 官方網站: http://www.openspf.org/