前段时间尝试用PostgreSQL 作为BIND9的后端数据存储玩玩,发现真不错,需要的Postgresql数据库表结构简单,查询效率高、及时生效。SOA记录也是一条语句,但发送邮件需要的TXT记录出现了问题,按照SPF格式写入了以下TXT记录:“v=spf1 ip4:60.166.118.xxx include:xuplus.com -all”,结果使用nslookup查询出来的情况竟然是这样的:
服务器: google-public-dns-a.google.com
Address: 8.8.8.8非权威应答:
xuplus.com text ="v=spf1"
"ip4:60.166.118.xxx"
"include:xuplus.com"
"-all"
这样的记录是没有办法使用的,使用SPF记录测试工具(http://www.openspf.org/Tools)是没有办法通过。查阅了一番资料发现无法解决这个问题,翻阅bind9 源代码发现在rdata.c文件的dns_rdata_tofmttext函数中使用了的linebreak就是空格字符,那么向spf这种需要包含空格的记录怎么办呢?经过尝试可以添加斜线()作为转义字符,由于数据库记录中斜线也需要转义,所以将记录对应的rdata字段值改成 ‘v=spf1\ ip4:60.166.118.xxx\ include:xuplus.com\ -all’这样的即可,这样之后再次nslookup就可以发现结果正常了:
服务器: cache2.ahwhtel.net.cn
Address: 202.102.199.68非权威应答:
xuplus.com text ="v=spf1 ip4:60.166.118.xxx include:xuplus.com -all"
xuplus.com nameserver = dns2.xuplus.com
xuplus.com nameserver = dns1.xuplus.com
dns1.gi-rms.com internet address = 60.166.118.xxx
dns2.gi-rms.com internet address = 60.166.118.xxx
BIND 9也有转移字符:斜线()。