我的烏拉拉練功坊

請來參觀移植到 Google Firebase 的成績 https://oolala.xyz/ken73chen/

2014年6月26日

SPF 的設定

http://www.openspf.org/Logo

這篇文章將介紹如何在發信的時候,讓信件符合 SPF 的規範。

這兒要介紹的 SPF,當然不是防曬係數,是 Sender Policy Framework (寄件者策略架構) 的簡稱,用來識別哪些郵件伺服器,可以使用指定的網域名稱寄送 email,也就是可以避免信件標題被偽造,詳細的介紹,可以參考 Google 的說明維基百科


目前 SPF,Gmail 、Yahoo mail、Hotmail 都會使用到。

在繼續以下的文章之前,如果您嘗試實做 SPF,請確認您已經有了以下技能:
  1. 除了 A 記錄以外,還會正確的設定其他 DNS 記錄。
  2. 你正要設定的 DNS,已經設定好了兩筆正確的 NS 記錄。
  3. 你正要設定的 DNS,除非該 domain 不提供 mail,否則至少已經有了一筆 MX 記錄 (但是不提供 mail 的話,似乎就用不到 SPF 了)。
  4. 會簡單的操作 nslookup 或者 dig。
  5. 看的懂以上 4 種技能。
如果 SPF 設定正確,在 Gmail,可以在信件標題看到以下的文字:
Received-SPF: pass (google.com: domain of nobody@web1.foo.com designates X.Y.188.217 as permitted sender) client-ip=X.Y.188.217;
如果是 Yahoo mail,看到的是:
Received-SPF: pass (domain of foo.com designates X.Y.188.217 as permitted sender)
在 Hotmail (outlook.com、livemail.tw .. 我也搞不懂微軟到底有多少個名字)看到的就是底下這樣:
Authentication-Results: hotmail.com; spf=pass (sender IP is X.Y.188.217) smtp.mailfrom=kenchen@foo.com; dkim=pass (testing mode) header.d=foo.com; x-hmca=pass header.id=kenchen@foo.com
SPF 的設定很簡單,只要修改 name server 的設定就可以了,建議你設定的時候,把 TTL 縮短到最短,這樣如果設定錯了,也不用等上幾天幾夜,才會換回正確的設定 (如果又錯了,那就又要幾天幾夜了)。

設定

SPF 的設定相當簡單,只有四個步驟:
  1. 設定 IP 反查
  2. 設定 TXT 記錄
  3. 檢查設定
首先設定 IP 的反查,也就是用來寄信的主機如果是 web1.foo.com, 那麼它的 X.Y.188.217 反查後,要得到的就是 web1.foo.com。

IP 反查

反查通常無法自己設定,必須由發放 IP 的單位設定,例如 ISP 或者 NOC,設定完之後,也需要一段時間才會更新到所有的 name server,因此你在查詢時,最好指定發放 IP 單位的 name server 去查詢,或者乾脆等個一天再進行以下步驟。

繼續之前,請 double check:

root@foo:~ # drill -x X.Y.188.217
;; ->>HEADER<<- opcode: QUERY, rcode: NOERROR, id: 16362
;; flags: qr rd ra ; QUERY: 1, ANSWER: 1, AUTHORITY: 0, ADDITIONAL: 0 
;; QUESTION SECTION:
;; 217.188.Y.X.in-addr.arpa. IN PTR

;; ANSWER SECTION:
217.188.Y.X.in-addr.arpa. 21599 IN PTR foo.com.

;; AUTHORITY SECTION:

;; ADDITIONAL SECTION:

;; Query time: 192 msec
;; SERVER: 8.8.4.4
;; WHEN: Thu Jun 26 02 


重點在中間 PTR 那一段,這樣子就代表反查已經設定 OK,可以接著下一步。

TXT 記錄

請參考 http://www.openspf.org/SPF_Record_Syntax 找出適合您的狀況,通常會看這篇文章設定 SPF 的話,狀況都不會太複雜,只有一個特別的狀況,很多使用者喜歡透過 Gmail 收發信件 (因為好用呀!),所以這時候寄信的 server 就包括 Gmail 的 server,必須將這些 server 包含到 TXT 的記錄裡面,可以參考 https://support.google.com/a/answer/178723?hl=zh-Hant 的說明。

一般的狀況通常是 "v=spf1 mx -all",Gmail 的設定是 "v=spf1 include:_spf.google.com ~all",加在一起做成撒尿丸子 "v=spf1 mx include:_spf.google.com -all" 就可以了。

或者到 https://www.spfwizard.net/,資料填一填,也可以產生 SPF 的設定。

在 DNS 中,加上這筆 TXT 記錄就可以了,記得 TTL 先設定短一點,這樣如果有錯誤,可以很快更正。

加上後,再查詢 check 一次:

root@foo:~ # drill txt foo.com
;; ->>HEADER<<- opcode: QUERY, rcode: NOERROR, id: 16362
;; flags: qr rd ra ; QUERY: 1, ANSWER: 1, AUTHORITY: 0, ADDITIONAL: 0 
;; QUESTION SECTION:
;; phoebusart.com. IN TXT

;; ANSWER SECTION:
foo.com. 599 IN TXT "v=spf1 mx include:_spf.google.com -all"

;; AUTHORITY SECTION:

;; ADDITIONAL SECTION:

;; Query time: 211 msec
;; SERVER: 8.8.4.4
;; WHEN: Thu Jun 26 02:54:43 2014
;; MSG SIZE  rcvd: 83

測試

同樣的,先別急著用 Gmail ... 測試,可以到 http://tools.bevhost.com/spf/ 測試,依序從頭到尾填入他要的資料,最後按下 SPF Check,看結果是不是 Pass 就可以了。

如果是 Pass,就可以實際寄信到 Gmail、Yahoo mail、Microsoft Live Mail 去測試,應該不會有問題。

測試 OK 後,記得回到 name server 的設定,把 TXT 的 TTL 時間延長。

還有一篇文章,是設定 domain keys 的,建議您 domains key 和 SPF 兩項都要設定。