如何禁用AAAA查找?
...来弥补无法控制的DNS服务器损坏。 我们的问题:我们部署了嵌入式设备,这些设备在各种(主要是纯IPv4的)站点上收集传感器数据。一些站点的网络维护不佳,例如配置错误或其他原因破坏了DNS缓存和/或防火墙,它们要么完全忽略AAAA查询,要么以破碎的响应(例如错误的源IP!)对它们进行响应。作为设施部门的外部供应商,我们几乎对(有时是勉强的)IT部门毫无影响。他们在不久的将来修复DNS服务器/防火墙的机会微乎其微。 对我们的设备的影响是,对于每个gethostbyname(),进程必须等待直到AAAA查询超时,此时某些进程已经完全超时了其连接尝试。 我正在寻找的解决方案是... 系统范围内。我无法单独重新配置数十个应用程序 非永久性和可配置的。我们需要在修复/推出IPv6的地方/时间(重新)启用它。重新启动就可以了。 如果解决方案需要替换glibc之类的核心库,则应该从一个维护良好的已知存储库(例如Debian Testing,Ubuntu Universe,EPEL)中获得替换库包。出于多种原因,甚至我都不知道从何开始,所以无法进行自我构建,因此我根本不列出它们。 最明显的解决方案是配置解析器库,例如通过/ etc / { resolv,nsswitch,gai } .conf而不查询AAAA记录。中resolv.conf选项no-inet6建议作为这里会正是我所期待的。不幸的是,它没有实现,至少在我们的系统上没有实现(在Debian 7上为libc6-2.13-38 + deb7u4;在Ubuntu 14.04上为libc6-2.19-0ubuntu6.3) 那怎么办 人们发现了以下在SF和其他地方建议的方法,但它们都不起作用: 完全禁用IPv6,例如通过将ipv6 LKM列入/etc/modprobe.d/或中sysctl -w net.ipv6.conf.all.disable_ipv6=1。(出于好奇:解析器为什么要在禁用IPv6的情况下要求AAAA?) options inet6从/etc/resolv.conf中删除。它最初不存在,inet6这些天默认情况下只是启用了。 options single-request在/etc/resolv.conf中设置。这只能确保A和AAAA查询是顺序执行的,而不是并行执行的 precedence在/etc/gai.conf中进行更改。这不会影响DNS查询,只会影响如何处理多个答复。 使用外部解析器(或运行绕过损坏的DNS服务器的本地解析器守护程序)会有所帮助,但通常会被公司的防火墙策略所禁止。而且它会使内部资源无法访问。 替代的丑陋想法: 在本地主机上运行DNS缓存。将其配置为转发所有非AAAA查询,但以NOERROR或NXDOMAIN响应AAAA查询(取决于相应A查询的结果)。我不知道DNS缓存能够执行此操作。 使用一些巧妙的iptables u32匹配或Ondrej Caletka的iptables DNS模块来匹配AAAA查询,以便icmp拒绝它们(解析程序库对此有何反应?),或将它们重定向到响应该错误的本地DNS服务器带有空NOERROR的所有内容。 请注意,关于SE也有类似的相关问题。我的问题有所不同,因为它阐述了我要解决的实际问题,因为它列出了明确的要求,因为它将一些经常被建议的非工作解决方案列入了黑名单,并且它不是特定于单个应用程序的。在讨论之后,我发表了我的问题。 IPv6 DNS查找 没有IPv6地址时,如何禁用请求AAAA记录? 禁用libcurl中的AAAA查找