BIND /命名:禁用recursion,客户端使用替代服务器

我正在build立一个简单的DNS服务器(BIND / Named),它在OSX Laptop上本地运行。

其目的是将“* .laptop.example.com”的所有请求都parsing为“192.168.2.2” – 这是手动分配的虚拟networking接口的IP地址(不是DHCP)。

我使用虚拟networking接口(由Parallels提供)来确保IP地址始终保持不变(eth0将在连接到不同networking时更改其IP地址),并确保始终可用(eth0已禁用/不可用当网线未插入时)。

我一直在使用以下设置:

options { ... forwarders { 192.168.1.1; }; forward only; }; 

但是,这需要每次笔记本电脑更换networking时更新configuration(因为大多数networking都使用不同的DNS地址)。

我想放弃这个要求,所以如果BIND / Named不能识别域名(即它不是“laptop.example.com”的子域),那么它返回一个错误,所以笔记本电脑可以尝试第二个logging的DNS地址(从DHCP获取的地址)。

一种可能性是使用:

 options { ... forwarders { }; forward only; recursion no; }; 

它阻止它花费3+秒钟来查询ROOT服务器…然而客户端将该响应解释为“域不存在”,而不是通过尝试下一个服务器来解决的错误。

感谢Alnitak,duffbeer703,John Gardeniers,都非常好的反馈。

我用于解决问题的解决scheme是使用launchd来检测/etc/resolv.conf中的更改,然后更新转发器列表。

通过创build文件:

 /Library/LaunchDaemons/myname.update.plist 

内容:

 <?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd"> <plist version="1.0"> <dict> <key>Disabled</key> <false/> <key>Label</key> <string>myname.update</string> <key>ProgramArguments</key> <array> <string>[PATH]/update.sh</string> </array> <key>WatchPaths</key> <array> <string>/var/run/resolv.conf</string> </array> </dict> </plist> 

并加载这个:

 launchctl load /Library/LaunchDaemons/myname.update.plist launchctl start myname.update 

剧本在:

 [PATH]/update.sh 

可以运行类似于:

 DST="/var/named/forwarders.conf"; echo "forwarders {" > $DST cat /etc/resolv.conf | \ grep -v -E "(127.0.0.1|localhost)" | \ awk '{ sub("^nameserver ", "\t"); sub("$", ";"); print }' >> $DST echo "};" >> $DST 

然后在命名的configuration中,它可以使用它:

 options { directory "[PATH]/conf/"; listen-on { 127.0.0.1; [IP_ADDRESS_HOST]; }; include "/var/named/forwarders.conf"; forward only; }; 

如果您想查看或使用完整的实现,请转至我的BIND设置页面并使用下载表单…它会创build一个ZIP包,其中包含一个安装脚本,因此希望安装和使用它非常简单。

为什么不只是添加一个条目的主机文件,并保存所有这些麻烦?

你可能想进一步了解你想做什么 – 这没有多大意义。 我的build议是不要与DNS基础调整 – 你打破了一些正常工作。

主要和辅助DNS服务器在您的networkingconfiguration可用性。 如果DNS服务器不能提供答案,客户端不会去辅助服务器 – 发明DNS的人实现了“recursion”的概念来解决这个问题。

如果你使用Mac,你可能会发现使用Bonjour / mDNS是一条更有效率的path。

尝试使用unbound

虽然它主要是一个recursion服务器,但我相信它有能力提供您需要的通配符覆盖,以及从/etc/resolv.conf自动学习到的所有其他内容转发到当前上游DNS服务器。