SPF 記錄:原理、語法及配置方法簡介
摘自網址: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 判斷結果。
相關文章
- ppium簡介及工作原理
- Hive內部函式簡介及查詢語法Hive函式
- WebSocket原理及技術簡介Web
- Thanos工作原理及元件簡介元件
- 04 . Filebeat簡介原理及配置檔案和一些案例
- Azure Bicep(二)語法簡介
- 01 . MongoDB簡介及部署配置MongoDB
- 條形碼生成原理介紹及簡介
- C#基礎程式設計——簡介及基礎語法C#程式設計
- logstash 配置檔案語法介紹
- GOLANG簡介與基礎語法Golang
- mybatis原理,配置介紹及原始碼分析MyBatis原始碼
- ZooKeeper: 簡介, 配置及運維指南運維
- Spring的簡介安裝及配置Spring
- ES6語法學習筆記之物件簡潔語法,及新增內容筆記物件
- flex設計思想和語法簡介Flex
- Typora編輯器Markdown語法簡介
- CSRF簡單介紹及利用方法
- 光碟目錄隱藏原理及破解方法
- 01 . ELK Stack簡介原理及部署應用
- 簡單理解async、await語法實現原理AI
- 配置中心之Nacos簡介,使用及Go簡單整合Go
- Burp Suite學習記錄1 - 簡介UI
- kafka入門:簡介、使用場景、設計原理、主要配置及叢集搭建(轉)Kafka
- Go之Gorm和BeegoORM簡介及配置使用GoORM
- go 學習記錄--基礎語法Go
- 筆記50-Spring簡介和配置筆記Spring
- Hive簡介、應用場景及架構原理Hive架構
- ProxySQL簡介原理及讀寫分離應用SQL
- 《AOP挖掘記》概念介紹及原理初探(一)
- metaq原理簡介
- HSF原理簡介
- Flutter原理簡介Flutter
- Robot Framework(8)——指令碼語法示例記錄Framework指令碼
- 記錄---docker安裝及配置jenkins全流程DockerJenkins
- Git 配置簡介Git
- Ansible自動化部署工具-元件及語法介紹元件
- swift4.0語法雜記(精簡版)Swift