我在 VPC 中的 AWS EC2 上运行 Ubuntu 14.04 实例。这些实例使用我们 VPC 提供的名称服务器。进程的每次 DNS 查找都会发送到 VPC 名称服务器。我们的进程进行多次查找,有些会失败,导致进程被阻止。
我希望通过在每台机器上安装本地缓存 DNS 解析器来解决这个问题。此解析器将监听127.0.0.1:53
,为本地进程提供服务。解析器将在中列出/etc/resolv.conf
,即我将使用nameserver 127.0.0.1
而不是通过 DHCP 动态提供的 VPC 名称服务器。
有很多替代程序可以实现这一点:,,,,bind9
等。但似乎有很多方法可以手动管理,例如将文件标记nscd
为只读,或编辑,或编辑。推荐哪一个?dnsmasq
dnscache
/etc/resolv.conf
/etc/network/interfaces
/etc/dhcp/dhclient.conf
我还有一个要求:本地解析器将查询转发到 VPC 名称服务器,这是我们信任的 DNS 信息权威机构。但是,我列出的程序似乎不这样做。相反,它们将查询转发到预配置的根名称服务器。
理论上,我可以通过自定义dhclient-script
、resolvconf
或类似的东西来实现这一点。我会添加一个钩子,它获取 DHCP 提供的名称服务器 IP,将其注入到我的本地 DNS 解析器的配置中,然后重新启动本地 DNS 解析器守护进程。但这很棘手,我想避免这样做。(Ubuntu 14.04 中的默认脚本似乎有一些内置的nscd
和知识dnscache
,可能可以做我想要的事情,但这很不清楚。)
在 Ubuntu 14.04 上运行本地缓存 DNS 解析器的“最佳”方法是什么?具体来说,如何让本地解析器转发到默认的 DHCP 名称服务器?
答案1
最简单的方法可能是 nscd。
安装 nscd,使用默认配置。
更新 /etc/nsswitch.conf 并将内容添加到 hosts 行cache
之前。dns
(编辑:此部分不适用于大多数 Linux 发行版中使用的 glibc,但 fbsd 需要)
hosts: files cache dns
测试
tcpdump -v -n 'port 53'
getent hosts superuser.com
您不需要修改 /etc/resolve.conf 或甚至捕获 dhcp 解析器来更新 nscd 的上游。nsswitch 将通过缓存服务器正确路由 gethost* 调用,因为它是 glibc 的一部分。