ping, ssh, ... 使用的 IP 与 nslookup、host 解析的 IP 不同,

ping, ssh, ... uses different IP than one resolved by nslookup, host,

新安装 Ubuntu15.10 后,我的命令(ping、ssh 等)使用的 IP 地址与 nslookup、host、dig 等解析的 IP 地址不同。 怎么会这样?

user@ubuntu-15-10:~$ nslookup foobar.com
 Server:        127.0.1.1
 Address:   127.0.1.1#53

 Non-authoritative answer:
 foobar.com canonical name = foobar.homeip.net.
 Name:  foobar.homeip.net
 Address: 12.34.56.78

user@ubuntu-15-10:~$ host foobar.com
 foobar.com is an alias for foobar.homeip.net.
 foobar.homeip.net has address 12.34.56.78

user@ubuntu-15-10:~$ ping foobar.com
 PING foobar.com (192.168.1.3) 56(84) bytes of data.
 64 bytes from foobar.localdomain.home (192.168.1.3): icmp_seq=1 ttl=64 time=0.245 ms
 64 bytes from foobar.localdomain.home (192.168.1.3): icmp_seq=2 ttl=64 time=0.285 ms
 64 bytes from foobar.localdomain.home (192.168.1.3): icmp_seq=3 ttl=64 time=0.269 ms
 ^C
 --- foobar.com ping statistics ---
 3 packets transmitted, 3 received, 0% packet loss, time 2000ms
 rtt min/avg/max/mdev = 0.245/0.266/0.285/0.021 ms

user@ubuntu-15-10:~$

我的/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 127.0.1.1
search localdomain.home

我的/etc/nsswitch.conf

# /etc/nsswitch.conf
#
# Example configuration of GNU Name Service Switch functionality.
# If you have the `glibc-doc-reference' and `info' packages installed, try:
# `info libc "Name Service Switch"' for information about this file.

passwd:         compat
group:          compat
shadow:         compat

hosts:          files mdns4_minimal [NOTFOUND=return] wins dns
networks:       files

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

netgroup:       nis

foobar.com /etc/hosts

中没有条目

有人知道吗?

经过一些调查,我找到了修复 myslef 的方法... 问题出在 /etc/nsswitch.conf 中: 在 "hosts" 行:"dns" 条目应该在 "wins" 条目之前... 我不明白背后是什么,但现在它像预期的那样工作

抱歉,配置的服务器是一些奇怪的假服务器,可能在您自己的机器上。服务器地址 [127.0.1.1] 通常保留给本地主机接口(这很奇怪,因为本地主机地址实际上是 127.0.0.1,而不是 127.0.1.1

您收到不同响应的最可能原因是 nslookup(1) 是一个 BIND 实用程序来测试 dns 访问(它 仅使用 dns 查找 )并且 ping(1) 使用 gethostbyname(3) 库例程(它考虑了在 /etc/nsswitch.conf 文件中配置的所有可能性以获取有关如何继续的信息,在这种情况下,作为 dns 部分是最后的手段)

另一方面,主机foobar.com的实际地址不是那个地址(见下文)。

最后,ping(1) 解析的地址 foobar.com 如您的输出所示是一个私人地址(不是实际地址,请参阅 RFC-1918),您无法通过互联网找到该主机。

最有可能的是您没有请求任何官方 Internet 名称服务器的 DNS 解析,所以一切都是本地 dns 配置的问题。

造成差异的可能原因:

  • mdns4_minimal 是一些不询问实际名称服务器的虚假程序。
  • dns/etc/nsswitch.conf 中的最后一个选项,因此官方 DNS 协议最后(当所有其他协议都失败时)
  • 您的 dns 没有在地址 127.0.1.1 中侦听,并且您有一些 ssh 端口重定向或隧道到其他名称服务器给出了错误的答案。地址 127.0.1.1 通常由 tap* 网络设备使用,例如用于配置 openvpn(1) 客户端连接。
  • 您没有在您的机器上显示名称服务器配置文件 运行。也许你得到的地址的来源就在那里。查找 named(8) 配置文件并在这些配置文件中搜索域 foobar.com
您显示的

None 个地址是真实的互联网地址(127.0.0.0/810.0.0.0/8172.16-31.0.0/16192.168.0-255.0/24169.254.0.0/16都是出于某种或其他原因保留的互联网地址,并且您不会在来自互联网的数据包中看到这些地址中的任何一个)原因多种多样,但事实是您的所有流量都在您的专用网络中本地,什么都没有,除了您机器上的名称服务器 运行 可以访问互联网。

抱歉,根据您提供的信息,这是我唯一可以尝试解决您的错误的方法。

您可以执行以下操作(以获得干净的 dns 解析):

  • /etc/nsswitch.conf 中的 files 之后配置 dns。这将在 mdns4_minimalwins 解析之前给予 dns 优先权)
  • 使用您的名称服务器的实际地址配置 nameserver <ip>(它们应该由您的互联网提供商传达给您。如果您不知道该放什么,只需尝试 nameserver 8.8.8.8 这意味着使用google域名服务器解析地址。幸运的是,它对所有人开放)

这些步骤将使 dns 解析完全超越您的本地名称服务器,您会得到类似

的东西
$ nslookup foobar.com
Server:     46.183.73.1
Address:    46.183.73.1#53

Non-authoritative answer:
Name:   foobar.com
Address: 69.89.31.56

$ ping foobar.com
PING foobar.com (69.89.31.56): 56 data bytes
64 bytes from 69.89.31.56: icmp_seq=0 ttl=50 time=173.196 ms
64 bytes from 69.89.31.56: icmp_seq=1 ttl=50 time=175.091 ms
64 bytes from 69.89.31.56: icmp_seq=2 ttl=50 time=208.612 ms
64 bytes from 69.89.31.56: icmp_seq=3 ttl=50 time=177.145 ms
^C
--- foobar.com ping statistics ---
4 packets transmitted, 4 packets received, 0.0% packet loss
round-trip min/avg/max/stddev = 173.196/183.511/208.612/14.559 ms
$ _

如果您安装了 ubuntu 并且在安装时没有配置 Internet 连接,最可能的原因是它在本地配置了一个允许您进行实验的虚假数据库的 dns,然后再配置它真正的互联网接入。