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

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

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

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

SPF 記錄的原理

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

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

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

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 查詢失?。?/td> 接受或拒絕

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

Mechanisms

下面介紹上面提到的 mechanism:

all

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

"v=spf1 -all" 拒絕所有(表示這個域名不會發出郵件)
"v=spf1 +all" 接受所有(域名所有者認為 SPF 是沒有用的,或者根本不在乎它)

ip4

格式為ip4:或者ip4:/,指定一個 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/
a:
a:/

會命中相應域名的 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:,表示引入域名下的 SPF 記錄。注意,如果該域名下不存在 SPF 記錄,則會導致一個PermError結果。例如:

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

exists

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

ptr

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

關于v=spf1

這是必須的,這個表示采用 SPF 1 版本,現在它的最新版本就是第 1 版。

Modifiers

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

redirect

格式為redirect=

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

exp

格式為exp=,目的是如果郵件被拒絕,可以給出一個消息。而消息的具體內容會首先對執行 TXT 查詢,然后執行宏擴展得到。

如何用 SPF 保護我的域名

如果你擁有自己的域名,并且用它發送郵件,那么你應該為它添加 SPF。通過域名服務商提供的「域名解析」、「DNS Editor」或者「DNS Zone Editor」等功能添加,并填寫正確的 SPF 數據就可以了。

嚴格來說,SPF 數據應該創建為 SPF 記錄。但是鑒于很多 DNS 服務商不支持 SPF 記錄,甚至有的郵件服務器也不支持 SPF 記錄,因此也可以創建為一條 TXT 記錄。目前,你應該至少創建一條 TXT 記錄。

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

生效時間

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

https://www.kitterman.com/spf/ 檢測工具

一些工具

雖然我不能幫你決定 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 判斷結果。

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

SPF是為了防范偽造發件人地址發送垃圾郵件而提出的一種開放式標準,是一種以IP地址認證電子郵件發件人身份的技術。域名所有者通過在DNS中發布SPF記錄來授權合法使用該域名發送郵件的IP地址。

當在DNS中定義了域名的SPF記錄后,為了確認郵件聲稱發件人不是偽造的,郵件接收方首先檢查郵件域名的SPF記錄,來確定發件人的IP地址是否被包含在SPF記錄中,若包含,則認為是一封正確的郵件,否則認為是一封偽造的郵件并退回,或將其標記為垃圾/仿冒郵件。

設置正確的SPF記錄可以提高郵件系統發送外域郵件的成功率,也可以一定程度上防止被假冒域名發送郵件。

例子:qq.comspf記錄

qq.com  text = "v=spf1 include:spf.mail.qq.com ~all"

二、SPF記錄的語法

SPF記錄是由SPF版本和指定的IP組成。

SPF記錄由一個版本開始,格式為:

record = version terms *SP

version = "v=spf1"

 

terms 由機制mechanisms和修改符modifiers(可選的)組成。

 

域名定義了一個或者多個機制mechanisms,用來描述哪些IP是被允許使用該域名發送郵件。

Mechanisms包含以下幾種類型:

mechanism = ( all / include/ a / mx / ptr / ip4 / ip6 / exists )

 

域名可能也定義修改符modifiers,每個修改符只能使用一次。

Modifiers包含以下幾種類型:

modifier = redirect / explanation

(一)機制mechanisms

每個mechanism有四種前綴(默認前綴為+”):

"+"

Pass

"-"

Fail

"~"

SoftFail

"?"

Neutral

在一條SPF記錄中,從左到右依次對每個mechanism進行驗證。對一個mechanism進行檢測,有三種結果可能發生:IP匹配成功,IP匹配失敗或者返回異常。如果IP匹配成功,處理結果返回該mechanism的前綴;如果IP匹配失敗,繼續下一個mechanism;如果返回異常,則mechanism結束并返回該異常值;如果沒有mechanism或者modifier匹配,則結果返回Neutral”。

如果不存在SPF記錄,則返回“None”;如果在DNS解析過程中出現臨時性錯誤,則返回“TempError”;如果存在某些語法錯誤或者評估錯誤(如該域指向不為人知的機制),則返回“PermError”。

SPF記錄驗證可能返回的結果如下:

Result

Explanation

Intended action

Pass

SPF記錄驗證該發信IP為合法的

接收郵件

Fail

SPF記錄驗證該發信IP是不合法的

拒絕郵件

SoftFail

SPF驗證該發信IP不是合法的,但是不采取強制措施

接收郵件但作標識

Neutral

SPF記錄沒有明確說明發信IP是否合法的信息

接收郵件

None

域名沒有設置SPF記錄或者SPF記錄驗證沒有結果

接收郵件

PermError

發生永久性錯誤(如:SPF記錄格式錯誤)

沒有規定

TempError

發生臨時性錯誤

接收郵件或拒絕郵件

1、“all”機制

all”表示所有IP都匹配。通常放在SPF記錄末尾,表示處理剩下的所有情況。

例如:

"v=spf1 mx -all"  表示允許所有該域的MX郵件服務器發送郵件,禁止其他的。

"v=spf1 -all" 表示該域不會發送任何郵件。

"v=spf1 +all" 表示域名所有者認為SPF是沒有用的或者并不關心(任何服務器都可使用該域名發送郵件)。

2、“ip4”機制

格式為:

ip4:<ip4-address> 

ip4:<ip4-network>/<prefix-length>

如果沒有提供 prefix-length ,默認為 /32。

例如:

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

表示只允許192.168.0.1~192.168.255.255范圍內的IP地址。

3、“ip6”機制

格式為:

ip6:<ip6-address>

ip6:<ip6-network>/<prefix-length>

如果沒有提供 prefix-length ,默認為 /128 。

例如:

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

表示只允許1080::8:800:0000:0000~1080::8:800:FFFF:FFFF范圍內的IP地址

"v=spf1 ip6:1080::8:800:68.0.3.1/96 -all"

表示只允許1080::8:800:0000:0000~1080::8:800:FFFF:FFFF范圍內的IP地址

4、“a”機制

格式為:

a

a/<prefix-length>

a:<domain>

a:<domain>/<prefix-length>

所有A記錄都會檢測。如果客戶端IP在這些記錄中,則該機制結果匹配。

若沒有指定域,則使用當前域。

A記錄必須與客戶端IP地址完全匹配,除非提供前綴長度,在這種情況下,A記錄查詢返回的IP地址將擴展到其相應的CIDR前綴,且客戶端IP將在其子網中查詢。

例如:

"v=spf1 a -all"

表示當前域被使用。

"v=spf1 a:example.com -all"

等價于當前域為example.com。

"v=spf1 a:mailers.example.com -all"

表示指定mailers.example.com的主機IP可以外發郵件。

"v=spf1 a/24 a:offsite.example.com/24 -all"

如果example.com解析到192.0.2.1,那么整個C類地址192.0.2.0/24將作為客戶端IP地址外發郵件。同樣,如果offsite.example.com返回多個A記錄,每個IP地址將被擴展到CIDR子網。

5、“mx”機制

格式:

mx

mx/<prefix-length>

mx:<domain>

mx:<domain>/<prefix-length>

所有域的MX記錄對應的A記錄按照MX優先級進行驗證。如果客戶端IP在這些記錄中,那么該機制匹配。

如果沒有指定域,則使用當前域。

A記錄必須與客戶端IP地址完全匹配,除非提供前綴長度,在這種情況下,A記錄查詢返回的IP地址將擴展到其相應的CIDR前綴,且客戶端IP將在其子網中查詢。

例如

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

表示允許當前域通過其MX服務器發送郵件,并通過deferrals.domain.comMX服務器重試延遲的郵件。

"v=spf1 mx/24 mx:offsite.domain.com/24 -all"

也許一個域的MX服務器使用一個IP地址接收郵件,使用另一個相鄰IP地址發送郵件。

6、“ptr”機制

格式:

ptr

ptr:<domain>

通過PTP查詢客戶端IP對應的主機名。對主機名進行驗證:PTR主機名對應的A記錄至少有一個與原客戶端IP匹配,無效主機名將被丟棄。如果一個有效主機名以該域結尾,則該機制匹配。

若沒有指定域,則使用當前域。

盡量避免使用該機制,因為會帶來很大開銷的DNS查詢。

例如:

"v=spf1 ptr -all"

直接控制所有機器的域(不像撥號或寬帶ISP)允許其所有服務器發送郵件。比如,hotmail.com或者paypal.com。

"v=spf1 ptr:otherdomain.com -all"

表示允許所有以otherdomain.com結尾的主機名的服務器發送郵件。

7、“exists”機制

格式為:

exists:<domain>

對提供的域進行A記錄查詢。如果有返回結果,則為匹配,無論查詢結果是什么。

例如:在下面例子中,客戶端IP1.2.3.4 a,當前域為example.com。

"v=spf1 exists:example.com -all"

example.com不能解析,則結果返回失??;若能解析,則該機制匹配。

當使用該機制的宏,可以執行RBL方式反向IP查詢或者設置每個用戶異常。

"exists:%{i}._spf.sparkpostmail.com"用于SPF驗證,%{i}為連接的ip地址,通過查詢"%{i}._spf.sparkpostmail.com"A記錄,若有返回結果,則允許該ipMAIL FROM域的名義發送郵件。

以下為兩個在審議中的特別的IP地址:

$ host 35.167.215.19._spf.sparkpostmail.com

35.167.215.19._spf.sparkpostmail.com has address 35.167.215.19

$ host 35.167.179.82._spf.sparkpostmail.com

35.167.179.82._spf.sparkpostmail.com has address 35.167.179.82

兩者均需通過exists機制。

值得注意的是,SPF記錄也包括ptr機制,雖然在最近的SPF RFC版本中已正式棄用,且推薦不使用,但是在執行SPF驗證時必須支持。我們發布ptr機制是因為今天美國的郵箱提供商也不能完全解析exists機制。同樣,指定的兩個IP地址也需通過ptr機制:

$ host 35.167.215.19

19.215.167.35.in-addr.arpa domain name pointer mta523b.sparkpostmail.com.

$ host 35.167.179.82

82.179.167.35.in-addr.arpa domain name pointer mta522b.sparkpostmail.com.

8、“include”機制

格式為:

include:<domain>

表示指定域查詢匹配。若查詢返回不匹配或者有錯誤,接著處理下一個機制。警告:如果指定域沒有一個有效的SPF記錄,結果將返回永久性錯誤。某些郵件接收者會根據“PermError”拒絕接收郵件。

例如:在下面例子中,客戶端IP1.2.3.4,當前域為example.com.

"v=spf1 include:example.com -all"

example.com沒有SPF記錄,結果為“PermError”。

假設example.comSPF記錄為“v=spf1 a -all”,查詢example.comA記錄,

若與1.2.3.4匹配,返回“Pass”;

若不匹配,處理包含域的-all”,include整個匹配失??;

從這個例子的外部指令集可見,最終的結果仍為失敗。

因為信任關系,include”機制可能會被認為有越權行為。需要確保“include”機制不會給跨用戶偽造的信息SPF驗證返回“Pass”。除非對指定的其他域技術機制到位,從而反正跨用戶偽造,“include”機制應該提供“Neutral”處理結果而非“Pass”。即在“include:”前添加“?”前綴。例如:

"v=spf1 ?include:example.com -all"

如此看來,include”機制不宜選擇。

(二)修改符Modifiers

Modifiers是可選的。在每個記錄中每個修改符只能使用一次。未知修改符unknown-modifier忽略。

redirect”修改符

格式為:

redirect=<domain>

表示使用指定域的SPF記錄替代當前記錄。宏擴展的域也將取代當前域。

例如:在下面例子中,客戶端IP為 1.2.3.4 ,當前域為example.com。

"v=spf1 redirect=example.com"

example.com沒有SPF記錄,則返回錯誤,結果是未知的。

假設example.comSPF記錄為“v=spf1 a -all”,查詢example.comA記錄,

若與1.2.3.4匹配,則結果為“Pass”;

若不匹配,則匹配失敗,接著執行-all”機制。

exp”修改符

格式為:

exp=<domain>

SMTP接收者拒絕郵件,可以返回一個解釋信息給發信者。SPF記錄中可以包含一個解釋字符串給發信者。這樣,ISP可以通過網頁進一步指導不合格的用戶如何配置SASL。

對域進行擴展,執行TXT查詢,然后通過宏擴展得到TXT查詢結果展示給發信者。其他宏可以用來提供一個自定義。

 

 

參考文獻

1、SPF RFC協議:http://tools.ietf.org/html/rfc7208

2、SPF協議官方網站:http://www.openspf.org/Introduction

業務熱線電話:(+86)021-52765253 021-61172807      上海哲濤網絡科技有限公司版權所有 © 2005-2023       滬ICP備06058430-1號

滬公網安備 31011302000898號

校睿寶,培訓機構學員管理軟件,教師工資計算軟件,消課管理軟件!

手機智慧課堂答題,短信答題,微信答題!

數據備份軟件,文件數據備份軟件,文件備份軟件,B/S架構備份軟件,分布式計算機備份軟件!

点广告流量赚钱吗 辽宁十一选五开奖视频 北京快三预测号码推荐 股票分析师黄鑫老师 云南十一选五开奖结果真准网 481开奖结果最近30期 山西快乐十分50期开奖 股票配资杠杆 江西11选5近1000期走势图 七乐彩基本走势图图表 广东11选5走势