我正在使用 NSD3,但尝试在域名中使用大写字母失败。
你的 DNS 中怎么可能有大写字母?
在各种 OSS 文档中,经常看到大写的 Berkeley.EDU,而且他们的 DNS 至今仍然是大写的:
% traceroute www.berkeley.edu
…
15 t1-3.inr-201-sut.Berkeley.EDU (128.32.0.65) 168.794 ms 169.906 ms 168.714 ms
16 t5-5.inr-210-srb.Berkeley.EDU (128.32.255.37) 168.850 ms 168.912 ms t5-4.inr-210-srb.Berkeley.EDU (128.32.255.125) 168.886 ms
在正向 DNS 中,它们也具有各种大写的域名:
% dig @ns.cs.berkeley.edu. cs.berkeley.edu.
…
;; AUTHORITY SECTION:
cs.berkeley.edu. 86400 IN NS cgl.UCSF.edu.
cs.berkeley.edu. 86400 IN NS adns1.berkeley.edu.
cs.berkeley.edu. 86400 IN NS ns.cs.berkeley.edu.
cs.berkeley.edu. 86400 IN NS vangogh.cs.berkeley.edu.
cs.berkeley.edu. 86400 IN NS adns2.berkeley.edu.
cs.berkeley.edu. 86400 IN NS ns.EECS.berkeley.edu.
…
答案1
如(一个不起眼的地方)所述NSD 的文档,
NSD 将名称规范化为小写。
如果您希望名称以大小写混合的形式显示,并保留区域文件中的内容,则需要使用其他名称服务器,例如 BIND。毕竟,伯克利互联网名称守护进程...
虽然有可能破解 NSD 源代码以使其保留大小写,但您应该谨慎行事,因为可能无法预测这种更改可能引入什么错误或意外后果,并且您的名称服务器是您最不希望出现神秘错误的地方之一。
答案2
您的 DNS3 服务器似乎正在破坏(规范化)其权威记录。请查看源代码http://www.nlnetlabs.nl/svn/nsd/trunk/dname.c特别是 dname_make 和 DNAME_NORMALIZE,它们只是 tolower。从http://www.nlnetlabs.nl/svn/nsd/trunk/dname.h
#if defined(NAMEDB_UPPERCASE) || defined(USE_NAMEDB_UPPERCASE)
#define DNAME_NORMALIZE toupper
#else
#define DNAME_NORMALIZE tolower
#endif
拉取 SVN 存储库、更改 dname.h 并重新编译,然后获得所需内容应该相当容易。当然,在执行此操作时,您需要自行获得支持。
正如 Michael Hampton 指出的,此功能
const dname_type *
dname_make_from_packet(region_type *region, buffer_type *packet,
int allow_pointers, int normalize)
{
uint8_t buf[MAXDOMAINLEN + 1];
if(!dname_make_wire_from_packet(buf, packet, allow_pointers))
return 0;
return dname_make(region, buf, normalize);
}
是用硬编码参数调用的,normalize
因此您需要追踪它并修复它。
答案3
他们只是在反向区域中设置了它。当您跟踪路由时,它会命中 IP,然后您的解析器会询问 IP 的反向是什么。它将类似于
$ORIGIN 0.32.128.in-addr.arpa.
65 IN PTR t1-3.inr-201-sut.Berkeley.EDU.