Domain-Name-System

DNS MX 記錄和 SMTP 伺服器

  • November 28, 2020

我有一個 SMTP 伺服器。DKIM 已設置並正常工作,並且還設置了 SPF。

SMTP 主機是smtp.domain.com

在 DNS 上,我有一個smtp指向 IPv4 的 A 記錄和一個smtp指向 IPv6 的 AAAA 記錄。

關於 MX 記錄,我有一個用於 IMAP 伺服器的 MX 記錄 target mail。我也有一個帶有目標的 MX 記錄smtp

一切都與 SPF 和 DKIM 完美配合

然後有一天,我認為smtp不需要帶有目標的 MX 記錄 - 所以我刪除了它。但後來我的 SPF 身份驗證停止工作

SMTP 真的需要 MX 還是我做錯了什麼?

smtp             IN A 192.0.2.2
smtp             IN AAAA 2001:DB8::2
@                IN TXT "v=spf1 a mx -all"
@                IN MX 10 mail
@                IN MX 11 smtp <--- If this record is deleted SPF auth fails

您的 SPF 記錄指定了兩種機制,並且郵件的源 IP 必須至少匹配其中一種:

  • 域的A記錄(在本例中為頂點,因為您在 之後沒有指定任何內容a)和/或
  • 其中一條MX記錄必須解析為源 IP。

假設mailsmtp解析到不同的 IP 地址,刪除MX記錄smtp意味著它不再滿足mx機制。

SPF 沒有繼承,這對您的設置意味著兩個不同的事情。


首先,SPF 記錄允許或拒絕 IP 地址和 CIDR 子網,因此除了ip4ip6機制(和all)之外的所有內容實際上都是對其他 DNS 記錄的引用。

  • 沒有and/or的a機制(RFC 7208, 5.3 )指的是目標的 IP 地址(和記錄)。:<domain>``/<prefix-length>``A``AAAA
  • 沒有and/or的mx機制 ( RFC 7208, 5.4 )指的​​是記錄的 IP 地址,例如=> & 。:<domain>``/<prefix-length>``MX``MX 11 smtp.example.com.``A 192.0.2.2``AAAA 2001:DB8::2

對於兩者,example.comexample.com,不是*.example.com。這種繼承也是不可能的,因為它需要無限量的額外 DNS 查詢。應盡可能避免使用除ip4/以外的任何ip6機制以最小化 DNS 上的負載,因此,還有 10 個查詢的硬 DNS 查找限制,之後 SPF 實現必須返回permerror(RFC 7208, 4.6.4)。

**TL;DR:直接用相應的and替換所有aandmx``ip4``ip6**機制,例如

example.com. IN TXT "v=spf1 +ip4:192.0.2.2 +ip6:2001:DB8::2 -all"

此外,沒有從example.comto繼承sub.example.com。這意味著 SPF 記錄example.com不保護具有A記錄的子域。因此,對於每條A記錄,您都需要一個額外的 SPF 記錄,否則有人可以user@smtp.example.com用作信封發件人。

  • 如果您想將主機名本身用作信封發件人:
smtp.example.com. IN TXT "v=spf1 +ip4:192.0.2.2 +ip6:2001:DB8::2 -all"
  • 或者,如果您不需要它:
smtp.example.com. IN TXT "v=spf1 -all"

讓我們擴展您的配置以獲得更好的範例,並刪除不必要的MX記錄,假設smtp.example.com專用於出站郵件。在這裡,A域頂點的 也指向 Web 伺服器:

mail    IN A      192.0.2.1
mail    IN AAAA   2001:DB8::1
smtp    IN A      192.0.2.2
smtp    IN AAAA   2001:DB8::2
www     IN A      192.0.2.3
www     IN AAAA   2001:DB8::3

@       IN A      192.0.2.3
@       IN AAAA   2001:DB8::3
@       IN MX 10  mail.example.com.

讓我們添加 SPF 記錄,每個主機都可以在其中發送郵件example.com

@       IN TXT    "v=spf1 +ip4:192.0.2.0/30 +ip6:2001:DB8::0/126 -all"
mail    IN TXT    "v=spf1 +ip4:192.0.2.1 +ip6:2001:DB8::1 -all"
smtp    IN TXT    "v=spf1 +ip4:192.0.2.2 +ip6:2001:DB8::2 -all"
www     IN TXT    "v=spf1 +ip4:192.0.2.3 +ip6:2001:DB8::3 -all"

引用自:https://serverfault.com/questions/1043996