在我的程序中使用 DHCP Discovery 获取 DNS 服务器安全吗?

在我的程序中使用 DHCP Discovery 获取 DNS 服务器安全吗?

我正在尝试几种方法来检索可用的 DNS 服务器,例如,使用自定义配置文件、使用/etc/resolv.conf、使用命令行systemd-resolve --status

另外,我还实现了一个 dhcp 客户端,它向所有 nic 发送 DHCP Discovery 广播消息并收集 DHCP Offer 消息中包含的 DNS 服务器,它目前在我的测试环境中运行良好。

我的问题是:

  1. 我的主机已经使用 DHCP 检索到其 IP 后,发送 DHCP 发现是否安全?
  2. 有没有更好的方法,只检索域名服务器(或其他 DHCP 参数/选项)而无需 dhcp 服务器分配地址?
  3. 我应该多久发送一次 DHCP 发现来刷新 DNS?也许每 10 分钟一次?

我也想知道:

  1. 是否有其他独立于平台的方法来获取 DNS 服务器?

[编辑1]
回复“为什么不使用getaddrinfo”:
我正在尝试尽量减少平台/操作系统的依赖性。由于 DNS 协议使用 udp,因此我能够实现我的 DNS 客户端(我已经完成了)。因此在这种情况下,我必须发现可用的 DNS 服务器列表。我还对这些服务器运行健康检查,以判断哪些服务器可以正常运行,因此我的“get-dns-servers-list”函数可能会返回尽可能多的服务器。

[编辑2]
非常感谢您的回答和评论。
这是我不使用的另一个原因getaddrinfo
getaddrinfo会阻塞线程,这对非阻塞事件循环不利,实现 dns 客户端是网络库通常所做的。
此外,在网络库的事件循环上运行每个网络事件以减少上下文切换也很重要(通常一个逻辑或物理核心一个线程),所以我担心网络库之外的大多数 api 都不是最佳解决方案。dns
查询经常被调用(程序可能像 DNS 代理一样工作)。但是,get the list of dns servers很少调用到的函数,它可能在“控制”线程上运行而不会导致任何性能下降。
此外,我了解 DHCP 在某些网络中可能不起作用,因此我可能不得不在未来考虑其他协议,例如 Mahowald 的回答中指出的 IPv6RA。
考虑到评论/答案多次提到getaddrinfo,我将在我的程序中添加一个切换选项,以便getaddrinfo在所有策略都失败时回退到在控制线程上使用。

答案1

理论上,只要 (a) LAN 上的所有 DHCP 服务器和客户端都运行良好,并且 (b) DHCP 服务器报告了您想要了解的所有 DNS 服务器,您的 DHCP 方法就应该没问题。在某些 LAN 上,这些是合理的假设,但在其他 LAN 上则不然。质量差的 DHCP 客户端(其中许多由至少一个极其普及的供应商生产...)可能会损害您的结果。如果我需要每十分钟重新检测一次 LAN 上的 DNS,我会非常怀疑 DHCP 是否拥有这些数据。

一种高可靠性的直接方法可能是只编写一个简单的脚本,该脚本遍历 LAN 子网中的每个 IP,并尝试使用该 IP 运行“host”或“nslookup”。

每个 IP 只需尝试一次,除非您想在功能不佳的 DNS 服务器上获得肯定结果,但我完全不建议这样做。这是因为 DNS 协议的 TTL 非常短,因此要包含慢速 DNS 检测,您必须使脚本非常复杂,并带有等待和重试;这也是应该避免的,因为我们不想惊动可能存在的任何安全看门狗。我不认为每个 IP 一次 (1) 最简单尝试会惊动任何东西,它会为您提供一个可以使用的明确结果。根据脚本语言,您甚至可以并行运行查找,一次五个或十个,以加快整体速度。

如果您想要包含慢速 DNS 检测,请通过其他方式进行,也许事先了解 DNS 应该是什么,或者也许在服务器启动时运行脚本(或守护进程启动)为您构建列表。

事实上,这是我正在考虑的另一种方式。如果您有权访问所有可以运行 DNS 的服务器,请设置一个在所有服务器上运行的脚本,该脚本将写入中央服务器上的文本文件,构建当前 DNS 列表。

答案2

用一个getaddrinfo()基于库来解析名称。它适用于大量平台:Linux、Windows、UNIX、BSD、VMS、QNX、z/OS... 与您的方案相反,systemd 仅适用于 Linux,而且不适用于所有 Linux。

此外,大多数实现都很灵活。localhost可以硬编码在/etc/hosts文件中。系统库可以独立于您的应用程序进行升级,例如添加诸如 DNS over HTTPS 之类的功能。

不要假设系统正在使用 DHCP。IPv6 RA 上的 RDNSS 选项使某些网络完全无需 DHCP 即可运行。或者 DNS 可以静态配置。在我的网络脚本之外,我会认为发送 DHCP 广播的东西很麻烦,并会尝试禁用它。

也许您会遇到网络诊断软件的使用案例,其目的是深入研究名称解析失败。或者您对 DNS 的运作方式存在根本分歧,例如某些 DNS over HTTPS 实现自行其是。但是,大多数软件应该只使用系统解析器。

相关内容