【问题标题】:How to create SPF record for many IPs (SPF longer than 255 characters)如何为多个 IP 创建 SPF 记录(SPF 超过 255 个字符)
【发布时间】:2016-12-07 22:08:26
【问题描述】:

例如,我有一个包含此 ips 的数组,并想用我的代码创建一个长 spf 记录:

$array_ips = array();
$array_ips[] = "32.16.8.133"; 
$array_ips[] = "32.16.4.247";
$array_ips[] = "35.16.8.184";
$array_ips[] = "32.16.8.127";
$array_ips[] = "32.16.8.134";
$array_ips[] = "32.16.2.154";
$array_ips[] = "32.16.2.153";
$array_ips[] = "32.16.2.150";
$array_ips[] = "39.16.2.190";
$array_ips[] = "32.16.2.128";
$array_ips[] = "32.16.0.128";
$array_ips[] = "32.16.8.187";
$array_ips[] = "43.16.8.185";
$array_ips[] = "32.16.8.192";
$array_ips[] = "32.16.4.249";
$array_ips[] = "52.16.4.252";
$array_ips[] = "32.16.4.238";
$array_ips[] = "32.16.4.232";

$ips = implode(' ip4:', $array_ips);

echo "v=spf1 +a +mx".$ips." -all";

spf 记录为:

v=spf1 +a +mx ip4:32.16.8.133 ip4:32.16.4.247 ip4:32.16.8.184 ip4:32.16.8.127 ip4:32.16.8.134 ip4:32.16.2.154 ip4:32.16.2.153 ip4:32.16.2.150 ip4:32.16.2.190 ip4:32.16.2.128 ip4:32.16.0.128 ip4:32.16.8.187 ip4:32.16.8.185 ip4:32.16.8.192 ip4:32.16.4.249 ip4:32.16.4.252 ip4:32.16.4.238 ip4:32.16.4.232 -all 

字符:307

问题是,SPF 只能是最大值。 255 个字符长。不可能在 txt dns 记录中的 plesk 或 cpanel 中添加这么长的字符串。我听说如果可以这样做"v=spf1 .... first" "spf second string..."

但它真的有效吗? 如何通过在我上面的示例中生成它来做到这一点?

【问题讨论】:

  • 你可以添加多条记录
  • @Dagon 你是什么意思?
  • @Dagon 多条记录???
  • 不,我错了,这是不允许的
  • Kitson88 有一个很好的答案,但你可以再保存几个字符; + 是默认操作,因此您可以从 amx 子句中删除它们。另请注意,如果您还使用 DKIM 签名,则 SPF 不需要那么准确(例如,您可以使用 32.16.0.0/20 来表示您的范围而不会暴露太多)。

标签: php arrays dns implode spf


【解决方案1】:

如果您愿意为几个 IP 允许 /24 子网,您可以执行以下操作。如果您愿意,您甚至可以正确地对其进行子网划分。无论如何,它大大减少了你的名单。

<?php

$array_ips = array();
$array_ips[] = "32.16.8.133"; 
$array_ips[] = "32.16.4.247";
$array_ips[] = "35.16.8.184";
$array_ips[] = "32.16.8.127";
$array_ips[] = "32.16.8.134";
$array_ips[] = "32.16.2.154";
$array_ips[] = "32.16.2.153";
$array_ips[] = "32.16.2.150";
$array_ips[] = "39.16.2.190";
$array_ips[] = "32.16.2.128";
$array_ips[] = "32.16.0.128";
$array_ips[] = "32.16.8.187";
$array_ips[] = "43.16.8.185";
$array_ips[] = "32.16.8.192";
$array_ips[] = "32.16.4.249";
$array_ips[] = "52.16.4.252";
$array_ips[] = "32.16.4.238";
$array_ips[] = "32.16.4.232";


$subnetArr = [];

foreach ($array_ips as $k=>$v ) {

    $i = strrpos($v, '.');
    $testSub = substr($v, 0, -(strlen($v) - $i));

    if (in_array("ip4:" . $testSub . ".1/24", $subnetArr)) {

        //Do something here or change condition

    } else {

        array_push($subnetArr,"ip4:" . $testSub . ".1/24");

    }
}


$ips = implode(' ', $subnetArr);
echo "v=spf1 +a +mx ".$ips." -all";

输出

v=spf1 +a +mx ip4:32.16.8.1/24 ip4:32.16.4.1/24 ip4:35.16.8.1/24 ip4:32.16.2.1/24 ip4:39.16.2.1/24 ip4:32.16.0.1/24 ip4:43.16.8.1/24 ip4:52.16.4.1/24 -all

编辑:

刚刚更改,所以它实际上与 SPF 相呼应!

【讨论】:

  • 感谢此解决方案有效。如果这是我不知道的最佳解决方案。因为也有可能使用具有范围内 IP 的人使用我的域进行发送。
【解决方案2】:

你可以把它分成多个包含的..

"v=spf1 mx a include:iprange1.example.com include:iprange2.example.com -all"

然后在每个包含 DNS 下,您将拥有

iprange1.example.com = "v=spf1 ip4:32.16.8.133 ... -all"
iprange2.example.com = "v=spf1 ip4:32.16.4.238 ... -all"

这将为您提供更多空间,因为您将能够包含 8 个包含以及您的 mx 和一个

然后每个包含可以容纳 16 个 ip4 地址,这些地址将获得大约 128 个您无法使用 CIDR 的 IP 地址。

编辑 - iprange1 --> iprange2 在第二个代码 sn-p 的第 2 行

【讨论】:

  • 但是,如果 1 IP = 1 域是什么?比你的解决方案行不通。
  • 我不明白你在问什么,请举个例子。
【解决方案3】:

您需要通过子网进行。使用标准 IP4 子网表示法:

“v=spf1 ip4:192.168.0.1/16 -all”

允许 192.168.0.1 和 192.168.255.255 之间的任何 IP 地址。

【讨论】:

  • 但是我们没有所有的ip。我们随机获得它们。所以添加所有变体不是最佳解决方案还是?
  • 是的 - 从您的示例中我不确定 IP 的随机性,但您没有其他解决方案,只能允许您无法控制的某些 IP。您问题中的示例您可以执行 32.16.0.1/16 并将它们全部覆盖,或者您可以添加 32.16.2.1/24 32.16.4.1/24 32.16.8.1/24 以缩小范围。但是您需要一些算法来涵盖您需要的所有内容。
  • 否则可以为域添加多条A记录吗?我假设不是,但我想我会提到你有 +a 这意味着它会检查那些。
  • 如 [RFC1035] 第 3.3.14 和 3.3 节中定义的,单个文本 DNS 记录(TXT 或 SPF RR 类型)可以由多个字符串组成。如果发布的记录包含多个字符串,则必须将记录视为这些字符串连接在一起而不添加空格。例如:IN TXT "v=spf1 .... first" "second string..." 但是怎么做呢?
  • 还有...?不知道这与它有什么关系?
【解决方案4】:

我找到了解决办法:

 echo "v=spf1 +a +mx ( "'.implode('" "',$array_ips).' " ) -all";

但我发现它的页面不是英文的。 (需要空格和()

http://www.nullpointer.at/keyword/spf/

翻译:

TXT 记录太长。在此示例中,TXT 记录被分成几行。其语法是:大括号(然后在引号“第一部分”中的下一行引号“第二部分”等,最后是括号)。重要提示:不要忘记用引号括起来的每个部分中的空白:“第一部分”“第二部分”然后组成“第一部分第二部分”。

【讨论】:

  • 您的解决方案将不起作用 echo 将输出 v=spf1 +a +mx ( "32.16.8.133" "32.16.4.247" "32.16.8.184" "32.16.8.127" "32.16.8.134" " 32.16.2.154" "32.16.2.153" "32.16.2.150" "32.16.2.190" "32.16.2.128" "32.16.0.128" "32.16.8.187" "32.16.8.185" "32.16.8.192" "32.16.4.29" 32.16.4.252" "32.16.4.238" "32.16.4.232")-全部
  • 你必须在 ip 后面加上空格而不是 "32.16.8.133" 而是这样做 "32.16.8.133 "
猜你喜欢
  • 2011-08-31
  • 1970-01-01
  • 1970-01-01
  • 2015-12-02
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多