为什么 *.localhost 解析为 127.0.0.1 和 ::1?

l0b*_*0b0 5 arch-linux dns

我偶然发现(尝试使用主机上的 servicename.docker.localhost 访问 Vagrant 盒子上 Docker 容器中的代理服务),任何以“.localhost”结尾的主机名在我的计算机上解析为 127.0.0.1 或 ::1 :

\n\n
$ ping -4 -c1 -n foo.localhost\nPING localhost (127.0.0.1) 56(84) bytes of data.\n64 bytes from 127.0.0.1: icmp_seq=1 ttl=64 time=0.147 ms\n\n--- localhost ping statistics ---\n1 packets transmitted, 1 received, 0% packet loss, time 0ms\nrtt min/avg/max/mdev = 0.147/0.147/0.147/0.000 ms\n$ ping -6 -c1 -n foo.localhost\nPING foo.localhost(::1) 56 data bytes\n64 bytes from ::1: icmp_seq=1 ttl=64 time=0.072 ms\n\n--- foo.localhost ping statistics ---\n1 packets transmitted, 1 received, 0% packet loss, time 0ms\nrtt min/avg/max/mdev = 0.072/0.072/0.072/0.000 ms\n
Run Code Online (Sandbox Code Playgroud)\n\n

然而,没有为此的 DNS 条目:

\n\n
$ nslookup -type=AAAA foo.localhost\nServer:     192.168.2.82\nAddress:    192.168.2.82#53\n\n** server can\'t find foo.localhost: NXDOMAIN\n$ nslookup -type=A foo.localhost\nServer:     192.168.2.82\nAddress:    192.168.2.82#53\n\n** server can\'t find foo.localhost: NXDOMAIN\n
Run Code Online (Sandbox Code Playgroud)\n\n

/etc/hosts 看起来不是特别相关:

\n\n
127.0.0.1   my-machine-name.my-work-domain  my-machine-name localhost.localdomain   localhost\n::1     localhost.localdomain   localhost\n
Run Code Online (Sandbox Code Playgroud)\n\n

/etc/resolv.conf 也没有:

\n\n
domain my-work-domain\nsearch my-work-domain\nnameserver 192.[\xe2\x80\xa6]\nnameserver 192.[\xe2\x80\xa6]\n
Run Code Online (Sandbox Code Playgroud)\n\n

为什么 *.localhost 会神奇地解析?

\n\n

这与这个问题相似但可能不同。

\n\n
\n\n
$ getent hosts\n127.0.0.1       my-machine-name.my-work-domain my-machine-name localhost.localdomain localhost\n127.0.0.1       localhost.localdomain localhost\n$ getent hosts foo.localhost\n::1             localhost\n
Run Code Online (Sandbox Code Playgroud)\n

jdw*_*olf 3

这是由 NSS 模块引起的myhostname,该模块将主机名和任何以 .localhost 结尾的名称定义为 ipv4 中的 127.0.0.1 和 ipv6 中的 ::1。

https://www.freedesktop.org/software/systemd/man/nss-myhostname.html