为什么“ping undefinedhost”和“curl undefinedhost”(例如 libc“gethostbyname”)可以 ping / 连接本地主机而不会失败?

为什么“ping undefinedhost”和“curl undefinedhost”(例如 libc“gethostbyname”)可以 ping / 连接本地主机而不会失败?

我有一个旧的 Ubuntu 16.04 (LTS) 安装,今天注意到,ping 和 curl 被告知(我假设是 libc 所为),任何未知主机的 IP 与本地主机的 IP 相同(例如“nslookup $(</etc/hostname)”)。

“nslookup”和“dig”正确报告“NXDOMAIN”。

/etc/nsswitch.conf,我有

passwd:         compat
group:          compat
shadow:         compat
gshadow:        files

hosts:          files dns
networks:       files

protocols:      db files
services:       db files
ethers:         db files
rpc:            db files

netgroup:       nis

/etc/hosts看起来像这样:

127.0.0.1 localhost.localdomain localhost

# The following lines are desirable for IPv6 capable hosts
::1 ip6-localhost ip6-loopback
fe00::0 ip6-localnet
ff00::0 ip6-mcastprefix
ff02::1 ip6-allnodes
ff02::2 ip6-allrouters
ff02::3 ip6-allhosts

/etc/hostname:host1.mydomain.net

(与实际值有差异)

看起来/etc/resolv.conf像:

# Dynamic resolv.conf(5) file for glibc resolver(3) generated by resolvconf(8)
#     DO NOT EDIT THIS FILE BY HAND -- YOUR CHANGES WILL BE OVERWRITTEN
nameserver 213.133.98.98
nameserver 213.133.99.99
nameserver 213.133.100.100

今天我完全糊涂了,当curl https://undefinedhost打印出来的时候,

curl: (51) SSL: certificate subject name (host1.mydomain.net) does not match target host name 'undefinedhost'

只有当我看到输出时ping undefinedhost我才开始明白似乎发生了什么:

$ ping unknownhost
PING host1.mydomain.net (138.201.175.226) 56(84) bytes of data.
64 bytes from host1.mydomain.net (138.201.175.226): icmp_seq=1 ttl=63 time=0.237 ms

最后,dig也表现如预期:

$ dig unresolvedhost @213.133.98.98
; <<>> DiG 9.10.3-P4-Ubuntu <<>> unresolvedhost @213.133.98.98
;; global options: +cmd
;; Got answer:
;; ->>HEADER<<- opcode: QUERY, status: NXDOMAIN, id: 28972

有人能解释一下哪里出了问题吗?

答案1

解释是存在一个隐式主机名查找域搜索列表与我在此机器所在的本地域下配置的通配符子域,例如 mydomain.net。

引用man resolv.conf

搜索列表一般由本地域名确定;默认情况下,它包含仅有的本地域名

我有一个正在运行的本地绑定服务器,并且我的域已注册并处于活动状态。我的/etc/bind/local/db.mydomain.net看起来如下:

...
@   IN  SOA mydomain.net. ....
...
host1   IN  A   138.201.175.226
*   IN  CNAME   host1.mydomain.net.
....

因此,这种行为是完全正确且符合预期的。我只是感到困惑。:-)

相关内容