邮箱域名的spf记录添加方法

什么是SPF
就是Sender Policy Framework。SPF可以防止别人伪造你来发邮件,是一个反伪造性邮件的解决方案。当你定义了你的domain name的SPF记录之后,接收邮件方会根据你的SPF记录来确定连接过来的IP地址是否被包含在SPF记录里面,如果在,则认为是一封正确的邮件,否则 则认为是一封伪造的邮件。关于更详细的信息请参考RFC4408(http://www.ietf.org/rfc/rfc4408.txt

如何增加SPF记录
非常简单,在DNS里面添加TXT记录即可。登陆http://www.openspf.org/在里面输入你的域名,点击Begin,然后会自动得到你域名的一些相关信息。
a 你域名的A记录,一般选择yes,因为他有可能发出邮件。
mx 一般也是yes,MX服务器会有退信等。
ptr 选择no,官方建议的。

a: 有没有其他的二级域名?比如:mail.abc.com和www不在一台server上,则填入mail.abc.com。否则清空。
mx: 一般不会再有其他的mx记录了。
ip4: 你还有没有其他的ip发信?可能你的smtp服务器是独立出来的,那么就填入你的IP地址或者网段。
include: 如果有可能通过一个isp来发信,这个有自己的SPF记录,则填入这个isp的域名,比如:hichina.com
~all: 意思是除了上面的,其他的都不认可。当然是yes了。

好了,点击Continue…..
自动生成了一条SPF记录,比如abc.com的是
v=spf1 a mx ~all
并且在下面告诉你如何在你的bind里面添加一条
abc.com. IN TXT “v=spf1 a mx ~all”

加入你的bind,然后ndc reload即可。
检查一下:
dig -t txt extmail.org

如果您的域名是由万网的dns服务器进行解析的,万网的网页上没有设置TXT记录的地方,但是如果你的DNS主server是在Hichina的,可以在diy.hichina.com上设置。设置完毕后您即可以通过使用spf策略进行垃圾邮件验证了。

SPF 的 TXT 记录

SPF 记录包含在一个 TXT 记录之中,格式如下:

  v=spf1 [[pre] type [ext] ] ... [mod]

每个参数的含义如下表所示:

参数 描述
v=spf1 SPF 的版本。如果使用 Sender ID 的话,这个字段就应该是 v=spf2
pre 定义匹配时的返回值。

可能的返回值包括:

返回值 描述
+ 缺省值。在测试完成的时候表示通过。
- 表示测试失败。这个值通常是 -all,表示没有其他任何匹配发生。
~ 表示软失败,通常表示测试没有完成。
? 表示不置可否。这个值也通常在测试没有完成的时候使用。
type 定义使用的确认测试的类型。

可能的值包括:

候选值 描述
include 包含一个给定的域名的测试
以 include:domain 的形式书写。

all 终止测试序列。
比如,如果选项是 -all,那么到达这条记录也就意味着测试失败了。但是如果无法确定,可以使用"?all"来表示,这样,测试将被接受。

ip4 使用 IPv4 进行验证。
这个可以以 ip4:ipv4 或 ip4:ipv4/cidr 的形式使用。建议使用这个参数,以减少域名服务器的负荷。

ip6 使用 IPv6 进行验证。

a 使用一个域名进行验证。
这将引起对域名服务器进行一次 A RR 查询。
可以按照 a:domain, a:domain/cidr 或 a/cidr 的形式来使用。

mx 使用 DNS MX RR 进行验证。
MX RR 定义了收信的 MTA,这可能和发信的 MTA 是不同的,这种情况基于 mx 的测试将会失败。
可以用 mx:domain, mx:domain/cidr 或 mx/cidr 这些形式进行 mx 验证。

ptr 使用域名服务器的 PTR RR 进行验证。
这时,SPF 使用 PTR RR 和反向图进行查询。如果返回的主机名位于同一个域名之内,就验证通过了。
这个参数的写法是 ptr:domain

exist 验证域名的存在性。
可以写成 exist:domain 的形式。

ext 定义对 type 的可选扩展。如果没有这个字段,那么仅使用单个记录进行问询。
mod 这是最后的类型指示,作为记录的一个修正值。

修正值 描述
redirect 重定向查询,使用给出的域名的 SPF 记录。
以 redirect=domain 的方式使用。

exp 这条记录必须是最后一条,允许给出一条定制的失败消息。

IN TXT "v=spf1 mx -all exp=getlost.example.com"

getlost IN TXT "You are not authorized to send mail for the domain"

IP主动通报系统/自建个人花生壳服务器/ADSL动态IP绑定域名

不少人都有这样的想法:在动态获取的IP地址的网络里,搞一台电脑当服务器,但还要可以直接通过域名直接访问的。

这个要求实现起来难度确实比较高,但不是没有办法。有人专门提供这样的服务,比如花生壳,他们的市场应该还是很大的,不少路由器都内置了花生壳的客户端,可以方便不少需要有类似需求的人。

但是,使用他们服务大概是要花费人民币的(没用过,也没有仔细了解),对于习惯了free网络的我们(这里free是免费,不是GNU的自由!),连操作系统、办公软件、杀毒软件都清一色D版的free人士(恐怕我们大多数人都是这样的)

——要免费,把一毛不拔的精神发扬光大!

不过这里更多是要发扬DIY精神,自己打造!是一套由简单到复杂的网络环境下的花生壳方案详解。

废话少说,切入正题。

花生壳这样的工具-或者说服务-本质上就是自动通报本机IP地址到一台服务器上,由这台服务器把IP地址跟域名进行绑定,最终达到通过域名访问动态IP地址的功能。这里面的核心就是IP地址通报(再者才是服务器存储该IP地址,域名绑定,接受请求之类)。

原理及思路

服务器自动定期通报其IP地址给一台虚拟主机,虚拟主机根据请求获取服务器的IP地址,并作记录,使用域名访问虚拟主机上页面,由程序自动跳转到服务器IP地址上的页面。

自建花生壳必备工具

我们的工作重点就是搞出一套IP地址通报系统,让我们的主机主动的报告其IP地址。但IP地址报告给谁呢,当然要一台确定的主机,至少有固定的IP地址或域名。我们这里使用需要一台web服务器,虚拟主机就可以的,但要支持动态程序页面,如PHP,jsp,asp(.NET)之类。鉴于PHP是当前最流行的web程序,同时是free的GNU一员,我们这里以php为例。

一台运行windows的电脑,就是对外服务器,自然少不了的,软件配置在此不需多说了。(linux也可以,原理类似。)

要想让服务器定期主动向虚拟主机发请求,这里使用windows的计划任务实现。需要的一点是需要使用“任务计划”,相应的服务要记得打开。(如果是Linux服务器,可以使用cron等工具)

通报服务器IP地址,最简的就是使用基于字符界面浏览器,网上很多开源的,选择太多了,这里使用curl (官网http://curl.haxx.se/下载http://curl.haxx.se/download.html)。服务器根据浏览器发来的http请求,很容易得到客户端主机的IP地址。如果浏览器是局域网内部电脑上的,网页服务器获取的就是该局域网对外网关(一般是路由器)的对外IP地址。(注:本段所说的“浏览器”,对应于DIY花生壳而言,就是上上段所讲的对外的服务器)

我们先从最简单的网络环境说起详细架设方案。

服务器直接连在adsl猫上,使用服务器拨号上网。这种情况下,服务器拨号获取的ip地址是公网IP地址,直接使用该IP就可以连接服务器。

先在虚拟主机上创建合适的程序页面,以简单易记为佳,如www.path8.net/mypeanut/index.php  (把www.path8.net替换为你的主机地址,下同),核心代码如下(完整代码请参看文后附件):

if(isset($_GET['optype']) && $_GET['optype']=='report'){
application('pnip',$_SERVER["REMOTE_ADDR"]);
echo('crm ip received: '.$_SERVER['REMOTE_ADDR']."n<br>");
echo("crm server ip report successfull.");
}elseif(isset($_GET['optype']) && $_GET['optype']=='clear'){
application('pnip','');
echo("cleared");
}else{
$pnip=application('pnip');
header("Content-type: text/html; charset=gb2312");
echo("http://".$pnip."/nn<br><br><a href="http://".$pnip."/">猛点这里进入</a>");
}

这段代码整合一IP通报功能,及显示DIY花生壳链接入口(服务器正确的公网IP地址)的功能。IP通报就是http请求www.path8.net/mypeanut/index.php?optype=report
www.path8.net/mypeanut/index.php就是通过DIY花生壳获取服务器入口。如果需要,也可以改成直接服务器端跳转的形式,使用会更方便。(注:这里也没有身份验证,如果是隐密入口,建议加上适当身份验证代码。)

[注意] 同时这里没有认证IP通报是否是我们服务器发来的,也就是随便谁都可以直接请求该地址,这样虚拟主机获取到IP地址就不是服务器IP地址了。如果需要改进,请自行编写相应程序。

(这里十分感谢天才的刘春龙的博客的以session实现类似asp的application对象的代码;只记录一个IP地址,没必要动用其它庞大的application实现方案)

把下载来的字符界面浏览器,放到合适的位置,比如 D:toolscurl 目录下。再建一个bat批处理文件,作用为请求虚拟主机上接受IP通报的页面,放在D:toolsipreporter目录下。代码如下:

D:toolscurlcurl.exe http://www.path8.net/mypeanut/?optype=report

在服务器上添加一个任务计划,执行上述bat批处理,时间设置为每10分钟执行一次(可酌情增加或减少执行频率)。

这样就完成了整个DIY花生壳的架设。

手工运行一下任务计划,然后打开[你的域名]/mypeanut/index.php,不出意外就运行正常了。

以上是在最简单网络环境下的DIY花生壳服务器架高详细过程。实际应用中,一般不会直接一台电脑连在ADSL猫上,一般都是多台电脑连成局域网,通过路由器对外上网。引入路由器好处当然在于共享带宽,合理利用网络资源;路由器同时还起到一个简单防火墙功能,屏敝多数服务监听端口,除非你在路由器上将它们打开。

下载附件mypeanut_allfiles(含curl,.bat文件,服务器端php程序)

使用路由器(主要在于NAT配置)的具体方案下次再接着写。

(未完待续)