我有一个域名,比如 example.com,以及许多服务器(可能有数百台),每台服务器都有一个公共 IP 和一个子域(sub1.example.com、sub2.example.com 等)。每台服务器都托管一个 Postfix 安装。这里的目标是能够从任何服务器发送电子邮件(而不是接收电子邮件)。但是,主域本身(example.com)没有附加任何电子邮件服务器
现在我尝试在 DNS 中设置 SPF 条目,但有点卡住了。我尝试了很多组合,但每次尝试向 gmail 发送电子邮件时,它们总是以 SPF SOFTFAIL 告终。此外,对于这么多服务器/IP,如何解决 SPF 记录长度的限制对我来说并不清楚。
添加更多背景信息(尽管我已经接受了鲍勃的回答)。
这个想法是拥有一个高度冗余的架构,其中任何服务器都可能出现故障,但整个系统仍将继续工作(至少对于发送电子邮件而言)。我无法控制 IP 地址的范围:服务器将配置在多个国家/地区和多个提供商。我尝试过仅为主域名定义 SPF 条目。
600 IN TXT "v=spf1 mx ~all"
发送到 Gmail 时,我收到 SPF 验证的 SOFTFAIL 错误,该电子邮件是从子域发送的(例如 sub1.domain.com)
然后我尝试在记录中添加发件人的 IP 地址:
600 IN TXT "v=spf1 mx ip4:server_ip ~all"
但最终还是出现了相同的 SOFTFAIL 错误。还尝试为子域添加另一个 SPF 条目,但据我所知,只应创建一个 SPF 条目 :-/ 我还尝试包含:域名,结果相同。
任何帮助或指导都将不胜感激:-)
答案1
您对用例的描述不够完整。但如果您的目标是从*@example.com
这些服务器中的任何一个发送电子邮件,那么 SPFptr
机制正是为这种用例而设计的。
您需要为每个子域服务器设置适当的反向 DNS 1.2.3.4 → sub1.example.com → 1.2.3.4。
然后,您将在主域 example.com 安装以下 SPF 记录:
v=spf1 ptr -all
就这些。
与其他方法相比,这种方法的优势在于易于设置、不会遇到查找限制,并且可以扩展到任意数量的子域主机。
缺点是它与 SPF RFC 的规定有些不一致:RFC 7208 不鼓励使用该ptr
机制。但是,有人认为那里的措辞太严厉了,考虑到您的用例,使用是ptr
可以接受的。另请参阅我的问题1063826。
答案2
这有点取决于你的目标是什么,以及你遇到了什么问题。
有几种 SPF 机制可以匹配主机类别,而无需在 SPF 记录中直接枚举所有主机,例如:
当您的所有服务器都属于一个或多个专属于您的 IP 地址范围时,匹配子网的机制
ip4
和等效机制:ip6
ip4:<ip4-network>/<prefix-length> ip6:<ip6-network>/<prefix-length>
您可以创建一个单独的 A 记录(例如
bob.example.com
),其中包含您希望允许直接通过 IPv4 和 IPv6 发送邮件的服务器的所有 IPv4 A 和/或 IPv6 AAAA 记录(以循环方式)。并在您的 SPF 记录中引用它:“v=spf1 a:bob.example.com. ~all” bob.example.com. IN A 10.0.0.1 bob.example.com. IN A 192.168.0.1 bob.example.com. IN A 172.16.0.2 bob.example.com. IN AAAA 2001:db8:ffff:ffff:ffff:ffff:ffff:fff1
include
当您的 SPF 记录太长而无法容纳在单个 DNS 记录中时,可以使用该关键字。例如,当前的 Gmail/Google SPF 记录不直接包含任何 IP 范围,但包含来自三个附加记录的 IP 范围:_spf.google.com. 300 IN TXT "v=spf1 include:_netblocks.google.com include:_netblocks2.google.com include:_netblocks3.google.com ~all" _netblocks.google.com. 300 IN TXT "v=spf1 ip4:35.190.247.0/24 ip4:64.233.160.0/19 ip4:66.102.0.0/20 ip4:66.249.80.0/20 ip4:72.14.192.0/18 ip4:74.125.0.0/16 ip4:108.177.8.0/21 ip4:173.194.0.0/16 ip4:209.85.128.0/17 ip4:216.58.192.0/19 ip4:216.239.32.0/19 ~all" _netblocks2.google.com. 300 IN TXT "v=spf1 ip6:2001:4860:4000::/36 ip6:2404:6800:4000::/36 ip6:2607:f8b0:4000::/36 ip6:2800:3f0:4000::/36 ip6:2a00:1450:4000::/36 ip6:2c0f:fb50:4000::/36 ~all" _netblocks3.google.com. 300 IN TXT "v=spf1 ip4:172.217.0.0/19 ip4:172.217.32.0/20 ip4:172.217.128.0/19 ip4:172.217.160.0/20 ip4:172.217.192.0/19 ip4:172.253.56.0/21 ip4:172.253.112.0/20 ip4:108.177.96.0/19 ip4:35.191.0.0/16 ip4:130.211.0.0/22 ~all"
另一种方法是禁止所有主机直接发送电子邮件。将一台或多台服务器设置为专用邮件中继,并仅授权 SPF 中的服务器。然后配置所有其他服务器使用这些中继主机。