SPF 記錄:原理、語法及配置方法簡介

青蔥味奶糖發表於2018-06-21

摘自網址:https://www.renfei.org/blog/introduction-to-spf.html點選開啟連結

很大部分是摘下來滴,文章很棒那,可以看原版連結,侵刪 以上。

SPF,全稱為 Sender Policy Framework,即發件人策略框架。

當前 Email 通訊,還是在使用 SMTP 這個協議。SMTP 的全稱為 Simple Mail Transfer Protocol,即「簡單郵件傳輸協議」。正如它的名字鎖暗示的,SMTP 實際上是一個非常簡單(甚至簡陋)的傳輸協議,本身並沒有很好的安全措施。根據 SMTP 的規則,發件人的郵箱地址是可以由發信方任意宣告的。在 SMTP 協議制定的時候也許還好,但在垃圾和詐騙郵件橫行的今天,這顯然是極不安全的。

SPF 出現的目的,就是為了防止隨意偽造發件人。

 

SPF 記錄的原理

 

SPF 記錄實際上是伺服器的一個 DNS 記錄,原理其實很簡單:

 

假設郵件伺服器收到了一封郵件,來自主機的 IP 是173.194.72.103,並且聲稱發件人為email@example.com。為了確認發件人不是偽造的,郵件伺服器會去查詢example.com的 SPF 記錄。如果該域的 SPF 記錄設定允許 IP 為173.194.72.103的主機傳送郵件,則伺服器就認為這封郵件是合法的;如果不允許,則通常會退信,或將其標記為垃圾/仿冒郵件。

 

因為不懷好心的人雖然可以「聲稱」他的郵件來自example.com,但是他卻無權操作example.com的 DNS 記錄;同時他也無法偽造自己的 IP 地址。因此 SPF 是很有效的,當前基本上所有的郵件服務提供商(例如 Gmail、QQ 郵箱等)都會驗證它。

怎麼查詢SPF記錄呢?----使用nslookup工具

1.開啟CMD/Powershell 輸入nslookup.

2.set type=txt.

3.輸入要查詢SPF記錄的域名.

 

SPF 記錄的語法

一條 SPF 記錄定義了一個或者多個 mechanism,而 mechanism 則定義了哪些 IP 是允許的,哪些 IP 是拒絕的。

這些 mechanism 包括以下幾類:

all | ip4 | ip6 | a | mx | ptr | exists | include

每個 mechanism 可以有四種字首:

"+"  Pass(通過)

"-"  Fail(拒絕)

"~"  Soft Fail(軟拒絕)

"?"  Neutral(中立)

測試時,將從前往後依次測試每個 mechanism。如果一個 mechanism 包含了要查詢的 IP 地址(稱為命中),則測試結果由相應 mechanism 的字首決定。預設的字首為+。如果測試完所有的 mechanisms 也沒有命中,則結果為 Neutral。

除了以上四種情況,還有 None(無結果)、PermError(永久錯誤)和 TempError(臨時錯誤)三種其他情況。對於這些情況的解釋和伺服器通常的處理辦法如下:

結果 含義 伺服器處理辦法

Pass 發件 IP 是合法的 接受來信

Fail 發件 IP 是非法的 退信

Soft Fail 發件 IP 非法,但是不採取強硬措施 接受來信,但是做標記

Neutral SPF 記錄中沒有關於發件 IP 是否合法的資訊 接受來信

None 伺服器沒有設定 SPF 記錄 接受來信

PermError 發生了嚴重錯誤(例如 SPF 記錄語法錯誤) 沒有規定

TempError 發生了臨時錯誤(例如 DNS 查詢失敗) 接受或拒絕

注意,上面所說的「伺服器處理辦法」僅僅是 SPF 標準做出的建議,並非所有的郵件伺服器都嚴格遵循這套規定。

Mechanisms

下面介紹上面提到的 mechanism:

all

表示所有 IP,肯定會命中。因此通常把它放在 SPF 記錄的結尾,表示處理剩下的所有情況。例如:

"v=spf1 -all" 拒絕所有(表示這個域名不會發出郵件)

"v=spf1 +all" 接受所有(域名所有者認為 SPF 是沒有用的,或者根本不在乎它)

ip4

格式為ip4:<ip4-address>或者ip4:<ip4-network>/<prefix-length>,指定一個 IPv4 地址或者地址段。如果prefix-length沒有給出,則預設為/32。例如:

"v=spf1 ip4:192.168.0.1/16 -all"

只允許在 192.168.0.1 ~ 192.168.255.255 範圍內的 IP

ip6

格式和ip4的很類似,預設的prefix-length是/128。例如:

"v=spf1 ip6:1080::8:800:200C:417A/96 -all"

只允許在 1080::8:800:0000:0000 ~ 1080::8:800:FFFF:FFFF 範圍內的 IP

a 和 mx

這倆的格式是相同的,以a為例,格式為以下四種之一:

a

a/<prefix-length>

a:<domain>

a:<domain>/<prefix-length>

會命中相應域名的 a 記錄(或 mx 記錄)中包含的 IP 地址(或地址段)。如果沒有提供域名,則使用當前域名。例如:

"v=spf1 mx -all"

允許當前域名的 mx 記錄對應的 IP 地址。

"v=spf1 mx mx:deferrals.example.com -all"

允許當前域名和 deferrals.example.com 的 mx 記錄對應的 IP 地址。

"v=spf1 a/24 -all"

類似地,這個用法則允許一個地址段。

例如,這是一個比較常見的 SPF 記錄,它表示支援當前域名的 a 記錄和 mx 記錄,同時支援一個給定的 IP 地址;其他地址則拒絕:

v=spf1 a mx ip4:173.194.72.103 -all

include

格式為include:<domain>,表示引入<domain>域名下的 SPF 記錄。注意,如果該域名下不存在 SPF 記錄,則會導致一個PermError結果。例如:

"v=spf1 include:example.com -all" 即採用和 example.com 完全一樣的 SPF 記錄

exists

格式為exists:<domain>。將對<domain>執行一個 A 查詢,如果有返回結果(無論結果是什麼),都會看作命中。

ptr

格式為ptr或者ptr:<domain>。使用ptr機制會帶來大量很大開銷的 DNS 查詢,所以連官方都不推薦使用它。

關於v=spf1

這是必須的,這個表示採用 SPF 1 版本,現在它的最新版本就是第 1 版。這是2014年的帖子哈

Modifiers

SPF 記錄中還可以包括兩種可選的 modifier;一個 modifier 只能出現一次。

redirect

格式為redirect=<domain>

將用給定域名的 SPF 記錄替換當前記錄。

exp

格式為exp=<domain>,目的是如果郵件被拒絕,可以給出一個訊息。而訊息的具體內容會首先對<domain>執行 TXT 查詢,然後執行巨集擴充套件得到。

如何用 SPF 保護我的域名

如果你擁有自己的域名,並且用它傳送郵件,那麼你應該為它新增 SPF。通過域名服務商提供的「域名解析」、「DNS Editor」或者「DNS Zone Editor」等功能新增,並填寫正確的 SPF 資料就可以了。

嚴格來說,SPF 資料應該建立為 SPF 記錄。但是鑑於很多 DNS 服務商不支援 SPF 記錄,甚至有的郵件伺服器也不支援 SPF 記錄,因此也可以建立為一條 TXT 記錄。目前,你應該至少建立一條 TXT 記錄。

因為本質上 SPF 的作用是為一個域名指定合法的發件 IP,所以你需要知道自己使用的郵件伺服器的發件 IP 是什麼。如果你使用第三方的域名郵箱服務(比如騰訊的域名郵箱),那麼他們應該有相應的文件告訴你該怎麼填寫。如果你用虛擬主機,則主機提供商也應該會告訴你。

生效時間

SPF 記錄本質上是一個 DNS 記錄,所以並不是修改之後立即生效的——通常需要幾個小時的時間。

一些工具

雖然我不能幫你決定 SPF 該填什麼,但是這裡有一些非常好用的工具可以幫助你,點選它們在新視窗開啟:

Open SPF:官方網站,有很多資料,值得一看。

RFC 4408:SPFv1 的規範全文。

SPF Recored Testing Tools:幫助你驗證域名是否存在 SPF 記錄、記錄的語法是否正確,以及輸入 IP 和 host 來測試是不是真正管用。

SPF: Why?:為什麼我發的郵件被拒絕了?

Beveridge Hosting DNS Lookup:圖形介面的dig,也可以顯示查詢到的 SPF 資訊。

Beveridge SPF Test:另一個根據 IP 和 host 驗證 SPF 是否通過的工具。

Gmail:如果你有 Gmail 的話,可以給自己的 Gmail 郵箱發一封郵件,然後用 Gmail 獨有的 Show Original 功能檢視 Gmail 伺服器的 SPF 判斷結果。

相關文章