Intro
DNS SPF紀錄用來反查認證寄送IP。
Sender Policy Framework - SPF Record Syntax
規則
使用DNS的TXT紀錄標記:
"v=spf1 +a +mx +ip4:139.162.80.137 -all"
其中的 v=spf1
是表示 spf 所使用的版本
符號:
+
:Pass 代表允許,為預設的屬性
-
:Fail 代表拒絕
include
:表示授權給該郵件伺服器
a
:表示比對 DNS 紀錄中的"A"紀錄,允許在"A"紀錄裡面的 IP 為發送郵件來源 IP
mx
:表示比對 DNS 紀錄中的"MX"紀錄,允許在"MX"紀錄裡面的網域為發送郵件來源網域
ptr
:表示比對 DNS 紀錄中的"PTR",允許在"PTR"紀錄裡面的網域為發送郵件來源網域。
-all
表示除了有條列出來的主機允許其他都拒絕,標式為 Hard Fail 不會接受該信件
~
:SoftFail 代表拒絕
~all
表示除了有條列出來的主機允許其他都拒絕,標式為 Soft Fail 還是接收了該信件
?
:Neutral 代表可能還有其他網域,收件主機還是會接收該信件。
設定範例
ip4
: 僅允許這兩組IPv4可以用這個網域來送出信件
"v=spf1 ip4:139.162.80.137 ip4:139.162.40.12 -all"
ip4
: Class-C遮罩範例
"v=spf1 ip4:139.162.80.137/24 -all"
a
: A Record符合
"v=spf1 a:smtp1.domain.com a:smtp2.domain.com -all"
"v=spf1 a:domain.com/24 -all"
include
: 為觸發遞迴執行機制 check_host()
(常用於第三方寄件服務)
"v=spf1 include:example.com include:example.org -all"
SPF狀態表
Result | Explanation | Intended action |
---|---|---|
Pass | The SPF record designates the host to be allowed to send | accept |
Fail | The SPF record has designated the host as NOT being allowed to send | reject |
SoftFail | The SPF record has designated the host as NOT being allowed to send but is in transition | accept but mark |
Neutral | The SPF record specifies explicitly that nothing can be said about validity | accept |
None | The domain does not have an SPF record or the SPF record does not evaluate to a result | accept |
PermError | A permanent error has occured (eg. badly formatted SPF record) | unspecified |
TempError | A transient error has occured | accept or reject |
進階應用
TLS certificate
例如Gmail設定Sender會檢查SMTP server憑證: TLS Negotiation failed, the certificate doesn’t match the host
檢查指令:
$ openssl s_client -connect smtp.example.com:587 -starttls smtp
若depth=0的CN與server domain不一樣可能就會被拒絕
Shared host 解決方式:在 Gmail 設定 Relay 時可以直接用 Mail host 的 rDNS Domain name 設定即可。