如何为许多IP创建SPF记录(SPF超过255个字符)

时间:2016-12-07 22:08:26

标签: php arrays dns implode spf

例如,我有一个带有此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..."

但它真的有效吗? 如何在上面的示例中生成它?

4 个答案:

答案 0 :(得分:1)

如果你愿意允许一个/ 24个子网用于几个IP,你可以做类似下面的事情。如果你想象,你甚至可以正确地对其进行子网划分。无论如何,它大大削减了你的清单。

<?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!

答案 1 :(得分:1)

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

"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和

然后每个include都可以容纳16个ip4地址,这些地址将获得大约128个无法CIDR的IP地址。

编辑 - iprange1 - &gt;第二个代码片段第2行的iprange2

答案 2 :(得分:0)

你需要通过子网做。使用标准IP4子网表示法:

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

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

答案 3 :(得分:-2)

我找到了解决方案:

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

但是我发现它并不是很有用的页面。 (需要空格和()

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

翻译:

  

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