FQDN 是如何确定的?

Fra*_*eil 7 domain-name-system ubuntu

我正在使用 Ubuntu,并使用 Puppet 管理我的主机。直到一两台机器之前,我的主机解析为 hostname.backend.example.com。最后两台机器解析为 hostname.staging.internal。我对这些名字是如何得出的感到有些困惑。

# /etc/resolv.conf
nameserver 173.203.4.8
nameserver 173.203.4.9

domain backend.example.com
Run Code Online (Sandbox Code Playgroud)

# /etc/hosts
10.182.230.38  web01.staging.internal web01
127.0.0.1     localhost localhost.localdomain
Run Code Online (Sandbox Code Playgroud)

/bin/hostname 回复如下:

# hostname -a
web01

# hostname -A
108-166-97-91.static.cloud-ips.com web01.staging.internal 

# hostname -I
108.166.97.91 10.182.230.38
Run Code Online (Sandbox Code Playgroud)

存在将 108.166.97.91 映射到 web01.backend.example.com 的 DNS 记录。主机名为何、在何处以及如何获取 web01.staging.internal 而不是公共 DNS 记录?

phe*_*mer 16

hostname命令从 DNS 和/etc/hosts.

hostname是equivilant到uname -n,是真正的“主机名”或盒子的“节点名”。
所有其他hostname参数都使用此节点名来查找信息。

所以在继续之前,我应该解释一下/etc/hosts文件格式。
第一个字段相当明显,它是该行上所有主机名都应解析为的 IP 地址。第二个字段是该 IP 的主要主机名。其余字段是别名。

因此,如果您运行hostname -f它,它将首先尝试为您的节点名解析 IP。根据您hosts:/etc/nsswitch.conf此方法中配置条目的方式会有所不同。

  • 如果您将其配置为使用 dns,它将使用配置的搜索域,/etc/resolv.conf直到它从 DNS 获取 IP。
  • 如果您将其配置为使用文件,它会查找/etc/hosts一行,其中主要主机名或别名是您当前的节点名 ( uname -n),然后在该行中返回主要主机名。

一旦它拥有 IP,它将尝试对该 IP 进行反向查找。同样,它会为此使用 DNS 和基于您的 .hosts 文件的主机文件nsswitch.conf。在使用您的主机文件的情况下,它将返回主要条目(这是文件中 IP 之后的第一个字段)。

hostname -a仅适用于主机文件,因为在 DNS 中进行反向查找只会给您 1 个结果。对于主机文件,它返回匹配行中的别名(这是第一个条目之后的所有内容,主要主机名)。

示例
如果您的节点名称是“foobar”,并且您有这样的条目/etc/hosts

127.0.0.1 foobar.example.com foobar localhost.localdomain localhost
Run Code Online (Sandbox Code Playgroud)

然后你会得到如下命令结果:

# hostname
foobar
# uname -n
foobar

# hostname -f
foobar.example.com

# hostname -a
foobar localhost.localdomain localhost
Run Code Online (Sandbox Code Playgroud)