【问题标题】:How to prevent gethostid from doing DNS lookups on linux如何防止gethostid在linux上做DNS查找
【发布时间】:2012-02-13 09:33:45
【问题描述】:

我们的应用程序 (RHEL 5/c++) 使用 gethostid 返回的 hostid 进行日志记录。由于某种原因,本地网络环境的主 DNS 服务器下线。这导致gethostid 出现大量问题:函数调用挂起超过 60 秒,导致我们的应用程序内部超时。几分钟后,在命令行上对hostid 的调用也没有返回。一旦 DNS 服务器再次启动,应用程序和 hostid 命令行工具中的超时/问题就会消失。

我的问题是:如何防止 gethostid 进行 DNS 查找?答案有一些边界条件:

  • 文件/etc/hostid 不得存在。
  • 不允许拨打sethostid
  • 无法更改/etc/hosts

我很惊讶会发生这种情况。据我了解gethostid 它是这样工作的:

  1. 如果是手动设置的,则返回最后一个sethostid 的值。
  2. 如果文件存在,则以 /etc/hostid 形式返回 hostid。
  3. 如果已设置,则返回主机的主 IP。
  4. 其他情况失败。

我认为不需要 DNS 查询。

要验证 gethostid 实际上是否依赖于正常工作的 DNS 服务器,请尝试以下操作:

  • 以 root 身份创建/更改您的 /etc/reslov.conf,使其仅包含无效的 nameserver 条目。
  • 在命令行调用hostid

在我的 debian/squeeze 安装中,这会导致主机 ID 为 00000000,而没有任何挂起。我假设 hostid 的 RedHat 版本不同/较旧,结果挂起。

【问题讨论】:

  • 一些我忘记的小细节:/etc/nsswitch.conf 包含hosts: files dns。系统主 IP 的主机名不在/etc/hosts 中。这是由设计和客户要求决定的。
  • 只是从/etc/nsswitch.conf 中删除dns 是一个可接受的解决方案吗?
  • 我不这么认为。这将阻止所有 DNS 查找,对吗?绝对是不受欢迎的副作用。

标签: linux dns


【解决方案1】:

我认为在不破坏系统或违反边界条件之一的情况下,阻止来自 gethostid 的 DNS 查找实际上是不可能的。在gnu.org 上,我在sethostid 函数上找到了这条评论:

建立系统主 IP 地址的正确方法是配置 IP 地址解析器,以将该 IP 地址与 gethostname 返回的系统主机名相关联。例如,将系统的记录放在 /etc/hosts 中。

由此我得出结论,gethostid 确定 IP 如下:

  • gethostname获取主机名。
  • 通过gethostbyname(或类似方法)确定IP。

在主机名未与/etc/hosts 中的IP 地址关联且/etc/nsswitch.conf 允许DNS 查找的条件下,将由gethostid 进行DNS 查找。

【讨论】:

    猜你喜欢
    • 2017-08-12
    • 2010-11-10
    • 1970-01-01
    • 1970-01-01
    • 2012-12-14
    • 1970-01-01
    • 1970-01-01
    • 2015-12-01
    • 1970-01-01
    相关资源
    最近更新 更多