题 如何为服务器上的多个域配置SPF? (也允许gmail作为发件人)


SPF(发件人策略框架)似乎是打击垃圾邮件发送者/欺骗的好方法。

然而,尽管多次阅读解释,我还不太了解如何正确配置它。


假设我有我的服务器 a.x.com 主持人 www.x.com 和 b.x.com 和 c.x.com 等等。

我也有 a.co.uk  b.net  c.info 等等,每一个都有各种各样的子域,全部托管在上面 x.com

对于所有这些域和子域,我想允许发送邮件 a.x.com

我还希望他们都允许从Gmail发送所有这些域的邮件。

如何使用SPF进行设置?


9
2018-05-04 22:15




事实上,它被证明是减少垃圾邮件的绝望无效方式。事实上,可以说,无论如何,它只是真正意味着解决发件人地址欺骗问题。 - Christopher Edwards
“它只是真正意味着解决发件人地址欺骗问题” - 确切地说,是为了阻止垃圾邮件发送者发送来自其他域名的邮件。 - Peter Boughton


答案:


您无法避免必须更改x.com以外的域的区域文件,但通过定义托管在一个域上的公共策略并使用该域,您可以省去很多麻烦。 redirect 其他域上的SPF关键字。例:

  • 在区域文件中 x.com 域:
_policy1 IN TXT“v = spf1 a:a.x.com -all”
_policy2 IN TXT“v = spf1 include:_spf.google.com a:a.x.com -all”

_spf.google.com 是保存Gmail SPF记录的记录。不确定是否记录在案。理论上你应该 include:gmail.com 但这是一个重定向 _spf.google.com 并且至少有一个广泛使用的qmail补丁SPF补丁没有正确地遵循它(在2008年8月修复但可能仍然部署。)这两个政策当然是例子 - 有多个不同级别的严格性在调试时非常有用,因为您只需要更改目标域中的短名称而不是容易出错的copypasting。

  • 在其他域的区域文件中:
@ IN TXT“v = spf1 redirect = _policy1.x.com”

要么

@ IN TXT“v = spf1 redirect = _policy2.x.com”

我正在使用 redirect不是 include,使SPF检查完全替换当前评估的记录与我重定向到的记录。 include 不这样做 - 例如,一个 -all 在一个结束时 include 不会导致评估停止(include 这是一个很大的用词。)你应该避免使用 include 当你想要从另一个域“别名”SPF记录时,因为它非常脆弱 - 如果你不小心忘记了尾随 - 所有你可能会使该域上的整个SPF无效。

编辑:请注意,如果您想允许Gmail的服务器作为发件人,您需要保持警惕。 Gmail chaptcha已被破解,这意味着可以自动化帐户注册,这意味着Gmail可以(间接)用作开放中继(我的公司讨论论坛每周都会收到数十个spambot注册请求,全部使用gmail.com电子邮件地址 - 这些地址是实时的,我允许一些人进行检查。)此外,如果您熟悉域中电子邮件地址的uwsername部分,那么拥有Gmail帐户的任何人都可以绕过SPF检查。


7
2018-05-09 08:34



谢谢,这是一个有用的答案。我上次检查时,Gmail需要电子邮件验证才能从其他地址发送电子邮件 - 所以一旦该地址的收件箱安全,一切正常吗?在bortzmeyer的答案中,有没有'www'线有多重要? - Peter Boughton
没错,但是一旦在基金会出现裂缝,我相信有人会找到一种方法来挤压半边河:)不是说你不应该,我只是建议你做脚趾并定期检查Gmail是否是被利用,即请不要无限期放弃对Gmail的授权。我更信任他们,而不是信任更多的在线实体,但这只是一点信任而不是信任。 - Mihai Limbăşan
我不知道为什么bortzmeyer包含www条目。它们完全无用,除非你实际上从@ www.x.com发送邮件(除了没有太多使用之外)看起来很奇怪并且在技术上比较精明的人中引起混淆。 - Mihai Limbăşan
另外,我不会使用SPF记录类型。我建议你坚持使用TXT。根据您的RFC,SPF记录类型仅受BIND 9.4及更高版本支持 必须 还保留TXT记录的副本,即你必须复制东西(坏),你必须保持同步(硬)。由于TXT将成为可预见的未来的主要SPF交付机制,因此不存在增益,quoth openspf.org。 - Mihai Limbăşan
@Mihai Limbasan:非常好的回答,感谢分享。如果您认为有必要更新您的答案,谷歌似乎更喜欢 v=spf1 include:_spf.google.com ~all 代替 -all,假设我理解得当,参考。 google.com/support/a/bin/answer.py?answer=178723 - Marco Demaio


是的,您可以在所有其他域的SPF记录中包含您的某个域中的配置。将其他域的SPF记录设置为以下应该可以解决问题:

v=spf1 include:x.com -all

4
2018-05-04 22:51



这会“正常工作”,还是需要_spf子域或类似? - Peter Boughton
我很确定如果您最初在x.com上直接定义了SPF记录,其他域的包含也可以直接指向x.com。如果你在_spf.x.com路由中定义你的SPF记录,那么,你需要更改包含一点以指向该FQDN。 - womble♦


您是否尝试过使用网络工具? http://www.openspf.org/?它可能会让你更容易处理这个......

只需在右上角的框中输入您的域名,然后点击“转到”按钮即可。从那里,你应该能够匆忙做好准备。


2
2018-05-04 22:32



我已经尝试了几次这个工具,但解释不够明确。 - Peter Boughton


标准, RFC 4408,提供了一些非常接近你想要的例子。这是x.com的zonefile的摘录:

@ IN TXT“v = spf1 a:a.x.com -all”
      在SPF“v = spf1 a:a.x.com -all”

www IN TXT“v = spf1 a:a.x.com -all”
      在SPF“v = spf1 a:a.x.com -all”

笔记:

  • 我没有添加Gmail电子邮件服务器,因为我不了解它们,请问Gmail用户
  • 'a'代表'地址'(它是  一个DNS A记录,它包括IPv6)
  • 我根据RFC添加了SPF记录,尽管几乎所有实现都只使用TXT记录

2
2018-05-09 06:33





是的,您需要单独为每个域添加特定的SPF记录。

原因是DNS中唯一(有用的)别名类型记录是 CNAME 记录。然而 CNAME 记录会导致别名发生 所有 RRset中的RRtypes - 没有办法说“CNAME SPF记录但不是 MX 记录


1
2018-05-04 22:35



我明白我必须补充一下 一个 每个域的SPF记录,但我希望只是存储一个 简单 指向主域的指针,其中所有更复杂的命令都可以存在。 Womble建议我可以使用include:{domain},但是我还不清楚这是否只包含/指向其他域的SPF记录,或者我是否需要托管_spf.x.com子域? - Peter Boughton
是的,请看womble的答案 - Alnitak