+host-9998.example.com:192.168.1.14:120
+host-9999.example.com:192.168.1.15:120
:hwinfo.example.com:13:\003abc\003def:120
-:ipv6.example.com:28:\040\001\006\250\000\000\000\001\002\020K\377\376KLa:120
+3ipv6.example.com:200106a80000000102104bfffe4b4c61:120
&italy.example.com::italy-ns1.example.com.:120
&italy.example.com::italy-ns2.example.com.:120
+italy-ns1.example.com:192.168.5.1:120
+b.c.test.com:5.6.7.8:3600
+\052.a.b.c.test.com:8.7.6.5:3600
+counter.test.com:1.1.1.5:3600
+:d.test.com:39:\002d2\005test2\003com\000:3600
:_double._tcp.dc.test.com:33:\000\000\000d\001\205\007server1\004test\003com\000:3600
:_double._tcp.dc.test.com:33:\000\001\000d\001\205\007server1\004test\003com\000:3600
:_ldap._tcp.dc.test.com:33:\000\000\000d\001\205\007server2\007example\003net\000:3600
::arg().set("retrieval-threads", "Number of AXFR-retrieval threads for slave operation")="2";
::arg().setSwitch("experimental-json-interface", "If the webserver should serve JSON data")="no";
::arg().setSwitch("experimental-api-readonly", "If the JSON API should disallow data modification")="no";
+ ::arg().setSwitch("experimental-dname-processing", "If we should support DNAME records")="no";
::arg().setCmd("help","Provide a helpful message");
::arg().setCmd("version","Output version and compilation date");
g_anyToTcp = ::arg().mustDo("any-to-tcp");
g_addSuperfluousNSEC3 = ::arg().mustDo("add-superfluous-nsec3-for-old-bind");
+
DNSPacket::s_udpTruncationThreshold = std::max(512, ::arg().asNum("udp-truncation-threshold"));
DNSPacket::s_doEDNSSubnetProcessing = ::arg().mustDo("edns-subnet-processing");
{
boilerplate_conv(NS, ns_t_ns, conv.xfrLabel(d_content, true));
boilerplate_conv(PTR, ns_t_ptr, conv.xfrLabel(d_content, true));
boilerplate_conv(CNAME, ns_t_cname, conv.xfrLabel(d_content, true));
+boilerplate_conv(DNAME, ns_t_dname, conv.xfrLabel(d_content));
boilerplate_conv(MR, ns_t_mr, conv.xfrLabel(d_alias, true));
boilerplate_conv(MINFO, ns_t_minfo, conv.xfrLabel(d_rmailbx, true); conv.xfrLabel(d_emailbx, true));
boilerplate_conv(TXT, ns_t_txt, conv.xfrText(d_text, true));
void reportOtherTypes()
{
AFSDBRecordContent::report();
+ DNAMERecordContent::report();
SPFRecordContent::report();
NAPTRRecordContent::report();
LOCRecordContent::report();
string d_content;
};
+class DNAMERecordContent : public DNSRecordContent
+{
+public:
+ includeboilerplate(DNAME)
+
+private:
+ string d_content;
+};
+
+
class MRRecordContent : public DNSRecordContent
{
public:
/*
PowerDNS Versatile Database Driven Nameserver
- Copyright (C) 2002-2012 PowerDNS.COM BV
+ Copyright (C) 2002-2014 PowerDNS.COM BV
This program is free software; you can redistribute it and/or modify
it under the terms of the GNU General Public License version 2 as
{
++s_count;
d_doFancyRecords = (::arg()["fancy-records"]!="no");
+ d_doDNAME=::arg().mustDo("experimental-dname-processing");
d_doRecursion= ::arg().mustDo("recursor");
d_logDNSDetails= ::arg().mustDo("log-dns-details");
d_doIPv6AdditionalProcessing = ::arg().mustDo("do-ipv6-additional-processing");
return ret;
}
+vector<DNSResourceRecord> PacketHandler::getBestDNAMESynth(DNSPacket *p, SOAData& sd, string &target)
+{
+ vector<DNSResourceRecord> ret;
+ DNSResourceRecord rr;
+ string prefix;
+ string subdomain(target);
+ do {
+ DLOG(L<<"Attempting DNAME lookup for "<<subdomain<<", sd.qname="<<sd.qname<<endl);
+
+ B.lookup(QType(QType::DNAME), subdomain, p, sd.domain_id);
+ while(B.get(rr)) {
+ ret.push_back(rr); // put in the original
+ rr.qtype = QType::CNAME;
+ rr.qname = prefix + rr.qname;
+ rr.content = prefix + rr.content;
+ target= rr.content;
+ ret.push_back(rr);
+ }
+ if(!ret.empty())
+ return ret;
+ string::size_type pos = subdomain.find('.');
+ if(pos != string::npos)
+ prefix+= subdomain.substr(0, pos+1);
+ if(subdomain == sd.qname) // stop at SOA
+ break;
+
+ } while( chopOff( subdomain ) ); // 'www.powerdns.org' -> 'powerdns.org' -> 'org' -> ''
+ return ret;
+}
+
+
// Return best matching wildcard or next closer name
bool PacketHandler::getBestWildcard(DNSPacket *p, SOAData& sd, const string &target, string &wildcard, vector<DNSResourceRecord>* ret)
{
}
}
+bool PacketHandler::tryDNAME(DNSPacket *p, DNSPacket*r, SOAData& sd, string &target)
+{
+ if(!d_doDNAME)
+ return false;
+ DLOG(L<<Logger::Warning<<"Let's try DNAME.."<<endl);
+ vector<DNSResourceRecord> rrset = getBestDNAMESynth(p, sd, target);
+ if(!rrset.empty()) {
+ BOOST_FOREACH(DNSResourceRecord& rr, rrset) {
+ rr.d_place = DNSResourceRecord::ANSWER;
+ r->addRecord(rr);
+ }
+ return true;
+ }
+ return false;
+}
bool PacketHandler::tryWildcard(DNSPacket *p, DNSPacket*r, SOAData& sd, string &target, string &wildcard, bool& retargeted, bool& nodata)
{
retargeted = nodata = false;
return r;
}
-
string target=p->qdomain;
// catch chaos qclass requests
// see what we get..
B.lookup(QType(QType::ANY), target, p, sd.domain_id);
rrset.clear();
- weDone = weRedirected = weHaveUnauth = 0;
+ weDone = weRedirected = weHaveUnauth = false;
while(B.get(rr)) {
if (p->qtype.getCode() == QType::ANY) {
rrset.push_back(rr);
}
+
DLOG(L<<"After first ANY query for '"<<target<<"', id="<<sd.domain_id<<": weDone="<<weDone<<", weHaveUnauth="<<weHaveUnauth<<", weRedirected="<<weRedirected<<endl);
if(p->qtype.getCode() == QType::DS && weHaveUnauth && !weDone && !weRedirected && d_dk.isSecuredZone(sd.qname)) {
DLOG(L<<"Q for DS of a name for which we do have NS, but for which we don't have on a zone with DNSSEC need to provide an AUTH answer that proves we don't"<<endl);
}
}
+
DLOG(L<<Logger::Warning<<"Found nothing in the by-name ANY, but let's try wildcards.."<<endl);
bool wereRetargeted(false), nodata(false);
string wildcard;
goto sendit;
}
+ else if(tryDNAME(p, r, sd, target)) {
+ retargetcount++;
+ goto retargeted;
+ }
else
{
if (!(((p->qtype.getCode() == QType::CNAME) || (p->qtype.getCode() == QType::ANY)) && retargetcount > 0))
void makeNXDomain(DNSPacket* p, DNSPacket* r, const std::string& target, const std::string& wildcard, SOAData& sd);
void makeNOError(DNSPacket* p, DNSPacket* r, const std::string& target, const std::string& wildcard, SOAData& sd, int mode);
vector<DNSResourceRecord> getBestReferralNS(DNSPacket *p, SOAData& sd, const string &target);
+ vector<DNSResourceRecord> getBestDNAMESynth(DNSPacket *p, SOAData& sd, string &target);
+ bool tryDNAME(DNSPacket *p, DNSPacket*r, SOAData& sd, string &target);
bool tryReferral(DNSPacket *p, DNSPacket*r, SOAData& sd, const string &target);
bool getBestWildcard(DNSPacket *p, SOAData& sd, const string &target, string &wildcard, vector<DNSResourceRecord>* ret);
bool d_doRecursion;
bool d_logDNSDetails;
bool d_doIPv6AdditionalProcessing;
+ bool d_doDNAME;
int d_sendRootReferral;
AuthLua* d_pdl;
#
# experimental-api-readonly=no
+#################################
+# experimental-dname-processing If we should support DNAME records
+#
+# experimental-dname-processing=no
+
#################################
# experimental-json-interface If the webserver should serve JSON data
#
// more solaris fun
#undef DS
enum typeenum {A=1, NS=2, CNAME=5, SOA=6, MR=9, PTR=12, HINFO=13, MX=15, TXT=16, RP=17, AFSDB=18, SIG=24, KEY=25, AAAA=28, LOC=29, SRV=33, NAPTR=35, KX=36,
- CERT=37, A6=38, OPT=41, DS=43, SSHFP=44, IPSECKEY=45, RRSIG=46, NSEC=47, DNSKEY=48, DHCID=49, NSEC3=50, NSEC3PARAM=51,
+ CERT=37, A6=38, DNAME=39, OPT=41, DS=43, SSHFP=44, IPSECKEY=45, RRSIG=46, NSEC=47, DNSKEY=48, DHCID=49, NSEC3=50, NSEC3PARAM=51,
TLSA=52, SPF=99, EUI48=108, EUI64=109, TSIG=250, IXFR=251, AXFR=252, MAILB=253, MAILA=254, ANY=255, URL=256, MBOXFW=257, CURL=258, ADDR=259, DLV=32769} types;
typedef pair<string,uint16_t> namenum;
static vector<namenum> names;
qtype_insert("KX", 36);
qtype_insert("CERT", 37);
qtype_insert("A6", 38);
+ qtype_insert("DNAME", 39);
qtype_insert("OPT", 41);
qtype_insert("DS", 43);
qtype_insert("SSHFP", 44);
case QType::NS:
case QType::CNAME:
+ case QType::DNAME:
case QType::PTR:
case QType::AFSDB:
rr.content=stripDot(toCanonic(d_zonename, rr.content));
4bc48a8d9b8d04b553be67639e5656e8 ../regression-tests/zones/example.com
-4e9eed426f0cd123c08dffb9e715824a ../regression-tests/zones/test.com
+38f421f6dd6c842f6f4f8a5a996cdb7d ../regression-tests/zones/test.com
005b3381db2a7dc70b690484f6ab7770 ../regression-tests/zones/test.dyndns
21213b4e8cd56e4184696a1bafd987d7 ../regression-tests/zones/wtest.com
42b442de632686e94bde75acf66cf524 ../regression-tests/zones/nztest.com
24514dc104b22206daeb973ff9303545 ../regression-tests/zones/minimal.com
0b20d7a0250576451135483b863750bf ../regression-tests/zones/tsig.com
b1f775045fa2cf0a3b91aa834af06e49 ../regression-tests/zones/stest.com
-a691ba21cde91f1b9f3cc92c7a078636 ../modules/tinydnsbackend/data.cdb
+11085cc884e2db8bbd5a4710aad23604 ../modules/tinydnsbackend/data.cdb
--no-shuffle --launch=bind --bind-config=./named.conf \
--send-root-referral \
--allow-2136-from=127.0.0.0/8 --experimental-rfc2136=yes \
- --cache-ttl=$cachettl --no-config \
+ --cache-ttl=$cachettl --no-config --experimental-dname-processing \
--bind-ignore-broken-records=yes &
skipreasons="nodnssec nodyndns nometa"
bindwait
--bind-dnssec-db=./dnssec.sqlite3 \
--send-root-referral \
--allow-2136-from=127.0.0.0/8 --experimental-rfc2136=yes --direct-dnskey=yes \
- --cache-ttl=$cachettl --no-config \
+ --cache-ttl=$cachettl --no-config --experimental-dname-processing \
--bind-ignore-broken-records=yes $lua_prequery &
bindwait
;;
--no-shuffle --launch=bind --bind-config=./named-slave.conf --slave \
--send-root-referral --retrieval-threads=1 --config-name=bind-slave \
--allow-2136-from=127.0.0.0/8 --experimental-rfc2136=yes \
- --cache-ttl=$cachettl --no-config --bind-dnssec-db=./dnssec-slave.sqlite3 &
+ --cache-ttl=$cachettl --no-config --experimental-dname-processing --bind-dnssec-db=./dnssec-slave.sqlite3 &
echo 'waiting for zones to be loaded'
bindwait bind-slave
--no-shuffle --launch=gmysql \
--master --send-root-referral \
--allow-2136-from=127.0.0.0/8 --experimental-rfc2136=yes --direct-dnskey=yes \
- --cache-ttl=$cachettl --no-config \
+ --cache-ttl=$cachettl --experimental-dname-processing --no-config \
--gmysql-dbname="$GMYSQLDB" \
--gmysql-user="$GMYSQLUSER" \
--gmysql-host="$GMYSQLHOST" \
--no-shuffle --launch --launch+=random --launch+=gmysql --launch+=random --gmysql-dnssec \
--send-root-referral \
--allow-2136-from=127.0.0.0/8 --experimental-rfc2136=yes --direct-dnskey=yes \
- --cache-ttl=$cachettl --no-config \
+ --cache-ttl=$cachettl --experimental-dname-processing --no-config \
--gmysql-dbname="$GMYSQLDB" \
--gmysql-user="$GMYSQLUSER" \
--gmysql-host="$GMYSQLHOST" \
--no-shuffle --launch=gmysql --gmysql-dnssec \
--send-root-referral \
--allow-2136-from=127.0.0.0/8 --experimental-rfc2136=yes \
- --cache-ttl=$cachettl --query-cache-ttl=$cachettl --no-config --slave --retrieval-threads=4 \
+ --cache-ttl=$cachettl --query-cache-ttl=$cachettl --experimental-dname-processing --no-config --slave --retrieval-threads=4 \
--gmysql-dbname="$GMYSQL2DB" \
--gmysql-user="$GMYSQL2USER" \
--gmysql-host="$GMYSQL2HOST" \
--no-shuffle --launch=gpgsql \
--send-root-referral \
--allow-2136-from=127.0.0.0/8 --experimental-rfc2136=yes \
- --cache-ttl=$cachettl --no-config \
+ --cache-ttl=$cachettl --experimental-dname-processing --no-config \
--gpgsql-dbname="$GPGSQLDB" \
--gpgsql-user="$GPGSQLUSER" &
skipreasons="nodnssec nodyndns"
--no-shuffle --launch=gpgsql --gpgsql-dnssec \
--send-root-referral \
--allow-2136-from=127.0.0.0/8 --experimental-rfc2136=yes \
- --cache-ttl=$cachettl --no-config \
+ --cache-ttl=$cachettl --experimental-dname-processing --no-config \
--gpgsql-dbname="$GPGSQLDB" \
--gpgsql-user="$GPGSQLUSER" $lua_prequery &
if [ $context = gpgsql-nsec3 ]
--no-shuffle --launch=gsqlite3 \
--send-root-referral \
--allow-2136-from=127.0.0.0/8 --experimental-rfc2136=yes \
- --cache-ttl=$cachettl --no-config \
+ --cache-ttl=$cachettl --experimental-dname-processing --no-config \
--gsqlite3-database=pdns.sqlite3 &
skipreasons="nodnssec nodyndns"
;;
--no-shuffle --launch=gsqlite3 --gsqlite3-dnssec \
--send-root-referral \
--allow-2136-from=127.0.0.0/8 --experimental-rfc2136=yes \
- --cache-ttl=$cachettl --no-config \
+ --cache-ttl=$cachettl --experimental-dname-processing --no-config \
--gsqlite3-database=pdns.sqlite3 $lua_prequery &
if [ $context = gsqlite3-nsec3 ]
then
$RUNWRAPPER $PDNS2 --daemon=no --local-port=$port --socket-dir=./ \
--no-shuffle --launch=gsqlite3 --gsqlite3-dnssec \
--fancy-records --send-root-referral \
- --cache-ttl=0 --query-cache-ttl=0 --no-config --slave --retrieval-threads=4 \
+ --cache-ttl=0 --query-cache-ttl=0 --experimental-dname-processing --no-config --slave --retrieval-threads=4 \
--gsqlite3-database=pdns.sqlite31 --gsqlite3-pragma-synchronous=0 \
--config-name=gsqlite32 &
echo 'waiting for zones to be slaved'
$RUNWRAPPER $PDNS --daemon=no --local-port=$port --socket-dir=./ \
--no-shuffle --launch=mydns \
--master --send-root-referral \
- --cache-ttl=0 --no-config \
+ --cache-ttl=0 --experimental-dname-processing --no-config \
--mydns-rr-active=no --mydns-soa-active=no --mydns-use-minimal-ttl=no \
--mydns-dbname="$MYDNSDB" \
--mydns-user="$MYDNSUSER" \
$RUNWRAPPER $PDNS --daemon=no --local-port=$port --socket-dir=./ \
--no-shuffle --launch=opendbx \
--send-root-referral \
- --cache-ttl=$cachettl --no-config \
+ --cache-ttl=$cachettl --experimental-dname-processing --no-config \
--opendbx-backend=sqlite3 --opendbx-host-read=./ --opendbx-host-write=./ \
--opendbx-database=pdns-opendbx.sqlite3 &
skipreasons="nodnssec noent nodyndns nometa"
$RUNWRAPPER $PDNS --daemon=no --local-port=$port --socket-dir=./ \
--no-shuffle --launch=remote \
- --query-logging --loglevel=9 --cache-ttl=$cachettl --no-config \
+ --query-logging --loglevel=9 --cache-ttl=$cachettl --experimental-dname-processing --no-config \
--send-root-referral --distributor-threads=1 \
--allow-2136-from=127.0.0.0/8 --experimental-rfc2136=yes \
--remote-connection-string="$connstr" $remote_add_param &
tinydns)
$RUNWRAPPER $PDNS --daemon=no --local-port=$port --socket-dir=./ \
--no-shuffle --launch=tinydns \
- --cache-ttl=$cachettl --no-config \
+ --cache-ttl=$cachettl --experimental-dname-processing --no-config \
--send-root-referral \
--allow-2136-from=127.0.0.0/8 --experimental-rfc2136=yes \
--tinydns-dbfile=../modules/tinydnsbackend/data.cdb &
--- /dev/null
+#!/bin/sh
+cleandig d.test.com A
--- /dev/null
+Make sure a DNAME does not synthesise for its own owner name.
--- /dev/null
+1 test.com. IN SOA 3600 ns1.test.com. ahu.example.com. 2005092501 28800 7200 604800 86400
+Rcode: 0, RD: 0, QR: 1, TC: 0, AA: 1, opcode: 0
+Reply to question for qname='d.test.com.', qtype=A
--- /dev/null
+#!/bin/sh
+cleandig www.d.test.com A
--- /dev/null
+Check that we synthesise a CNAME from a DNAME.
--- /dev/null
+0 d.test.com. IN DNAME 3600 d2.test2.com.
+0 www.d.test.com. IN CNAME 3600 www.d2.test2.com.
+1 . IN NS 518400 a.root-servers.net.
+1 . IN NS 518400 b.root-servers.net.
+1 . IN NS 518400 c.root-servers.net.
+1 . IN NS 518400 d.root-servers.net.
+1 . IN NS 518400 e.root-servers.net.
+1 . IN NS 518400 f.root-servers.net.
+1 . IN NS 518400 g.root-servers.net.
+1 . IN NS 518400 h.root-servers.net.
+1 . IN NS 518400 i.root-servers.net.
+1 . IN NS 518400 j.root-servers.net.
+1 . IN NS 518400 k.root-servers.net.
+1 . IN NS 518400 l.root-servers.net.
+1 . IN NS 518400 m.root-servers.net.
+2 a.root-servers.net. IN A 3600000 198.41.0.4
+2 b.root-servers.net. IN A 3600000 192.228.79.201
+2 c.root-servers.net. IN A 3600000 192.33.4.12
+2 d.root-servers.net. IN A 3600000 199.7.91.13
+2 e.root-servers.net. IN A 3600000 192.203.230.10
+2 f.root-servers.net. IN A 3600000 192.5.5.241
+2 g.root-servers.net. IN A 3600000 192.112.36.4
+2 h.root-servers.net. IN A 3600000 128.63.2.53
+2 i.root-servers.net. IN A 3600000 192.36.148.17
+2 j.root-servers.net. IN A 3600000 192.58.128.30
+2 k.root-servers.net. IN A 3600000 193.0.14.129
+2 l.root-servers.net. IN A 3600000 199.7.83.42
+Rcode: 0, RD: 0, QR: 1, TC: 0, AA: 1, opcode: 0
+Reply to question for qname='www.d.test.com.', qtype=A
aland.test.com. IN NSEC 86400 blah.test.com. TXT RRSIG NSEC
b.c.test.com. IN NSEC 86400 *.a.b.c.test.com. A RRSIG NSEC
blah.test.com. IN NSEC 86400 b.c.test.com. NS RRSIG NSEC
-counter.test.com. IN NSEC 86400 _double._tcp.dc.test.com. A RRSIG NSEC
+counter.test.com. IN NSEC 86400 d.test.com. A RRSIG NSEC
+d.test.com. IN NSEC 86400 _double._tcp.dc.test.com. DNAME RRSIG NSEC
enum.test.com. IN NSEC 86400 hightxt.test.com. NAPTR RRSIG NSEC
hightxt.test.com. IN NSEC 86400 ns1.test.com. TXT RRSIG NSEC SPF
ns1.test.com. IN NSEC 86400 ns2.test.com. A RRSIG NSEC
0bh8di769i8vvtkdds8efjda19abigo5.test.com. IN NSEC3 86400 1 0 1 abcd 2EU2GULBU53H9UVHFALSHPBO2A83T6L2 TXT RRSIG SPF
2eu2gulbu53h9uvhfalshpbo2a83t6l2.test.com. IN NSEC3 86400 1 0 1 abcd 2GKS2N3JPQF62QOHAVFQ1PHOLM3HR7RA NS SOA MX RRSIG DNSKEY NSEC3PARAM
-2gks2n3jpqf62qohavfq1pholm3hr7ra.test.com. IN NSEC3 86400 1 0 1 abcd 53L445R26RG1CSBI4TS1K3I3EL1F30VM TXT RRSIG
+2gks2n3jpqf62qohavfq1pholm3hr7ra.test.com. IN NSEC3 86400 1 0 1 abcd 4UL8F3M96VCONEA85U93DH9SG570J4FU TXT RRSIG
+4ul8f3m96vconea85u93dh9sg570j4fu.test.com. IN NSEC3 86400 1 0 1 abcd 53L445R26RG1CSBI4TS1K3I3EL1F30VM DNAME RRSIG
53l445r26rg1csbi4ts1k3i3el1f30vm.test.com. IN NSEC3 86400 1 0 1 abcd 79RA8K3G5KAI1HG9JLHBR6P0TP933M7V SRV RRSIG
79ra8k3g5kai1hg9jlhbr6p0tp933m7v.test.com. IN NSEC3 86400 1 0 1 abcd 79U3DAS6UCCTNS1BR3TVD8QKANNI351L A RRSIG
79u3das6ucctns1br3tvd8qkanni351l.test.com. IN NSEC3 86400 1 0 1 abcd 7MMURA8H40BE5N4KOAN7RNMKURSAMH99
0bh8di769i8vvtkdds8efjda19abigo5.test.com. IN NSEC3 86400 1 1 1 abcd 2EU2GULBU53H9UVHFALSHPBO2A83T6L2 TXT RRSIG SPF
2eu2gulbu53h9uvhfalshpbo2a83t6l2.test.com. IN NSEC3 86400 1 1 1 abcd 2GKS2N3JPQF62QOHAVFQ1PHOLM3HR7RA NS SOA MX RRSIG DNSKEY NSEC3PARAM
-2gks2n3jpqf62qohavfq1pholm3hr7ra.test.com. IN NSEC3 86400 1 1 1 abcd 53L445R26RG1CSBI4TS1K3I3EL1F30VM TXT RRSIG
+2gks2n3jpqf62qohavfq1pholm3hr7ra.test.com. IN NSEC3 86400 1 1 1 abcd 4UL8F3M96VCONEA85U93DH9SG570J4FU TXT RRSIG
+4ul8f3m96vconea85u93dh9sg570j4fu.test.com. IN NSEC3 86400 1 1 1 abcd 53L445R26RG1CSBI4TS1K3I3EL1F30VM DNAME RRSIG
53l445r26rg1csbi4ts1k3i3el1f30vm.test.com. IN NSEC3 86400 1 1 1 abcd 79RA8K3G5KAI1HG9JLHBR6P0TP933M7V SRV RRSIG
79ra8k3g5kai1hg9jlhbr6p0tp933m7v.test.com. IN NSEC3 86400 1 1 1 abcd 79U3DAS6UCCTNS1BR3TVD8QKANNI351L A RRSIG
79u3das6ucctns1br3tvd8qkanni351l.test.com. IN NSEC3 86400 1 1 1 abcd 7MMURA8H40BE5N4KOAN7RNMKURSAMH99
aland IN TXT "\195\133LAND ISLANDS"
hightxt IN TXT "v=spf1 mx ip4:78.46.192.210 –all"
hightxt IN SPF "v=spf1 mx ip4:78.46.192.210 –all"
+d IN DNAME d2.test2.com.