用Postgresql作为BIND9 数据存储情况下TXT等包含空格记录的处理

前段时间尝试用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也有转移字符:斜线()。