我有一个小型办公室网络,其中有几台不同版本的 Windows / Ubuntu 机器。几天前,一台 Windows 机器无法通过主机名访问 Ubuntu 机器上的任何服务。
我能使用 DNS 解析 Ubuntu 主机名:
C:\>nslookup gruit
Server: router.asus.com
Address: 192.168.73.1
Name: gruit
Address: 192.168.73.152
但是我不能使用诸如ping
、ftp
、ssh
等来表示主机名。例如:
C:\>ping gruit
Ping request could not find host gruit. Please check the name and try again.
我能使用以下任一命令成功使用 IP 地址:
C:\>ping 192.168.73.152
Pinging 192.168.73.152 with 32 bytes of data:
Reply from 192.168.73.152: bytes=32 time<1ms TTL=64
我能.
还可以使用以结尾的主机名:
C:\>ping gruit.
Pinging gruit [192.168.73.152] with 32 bytes of data:
Reply from 192.168.73.152: bytes=32 time<1ms TTL=64
这有点像 NetBIOS 问题。事实上,NET VIEW
失败:
C:\>net view \\gruit
System error 53 has occurred.
The network path was not found.
有趣的是,NBT 确实解析了主机名适当地:
C:\>nbtstat -c
Ethernet0:
Node IpAddress: [192.168.73.104] Scope Id: []
NetBIOS Remote Cache Name Table
Name Type Host Address Life [sec]
------------------------------------------------------------
GRUIT <20> UNIQUE 192.168.73.152 592
出于实际目的,我并不关心 Ubuntu 上的 NetBIOS/Samba/等;我只希望我的“正常”TCP/IP 东西能够正常工作(即 Postgres)。但不知何故,这台 Windows 10 机器上的每个客户端似乎都使用 NetBIOS。例如,如果我使用 清除缓存nbtstat -R
,然后使用某个 TCP/IP 客户端(例如ssh
,psql
...),NBT 缓存会立即再次显示 Ubuntu 主机名和 IP 地址。
[编辑:有些命令不会触发 NBT 缓存中的条目。nslookup
永远不会。ping
当我用点结尾主机名时,常见的违规者(例如)也不会触发。]
当然,真正的问题是,尽管通过两个都DNS 和 NBT,我实际上无法在任何客户端应用程序中使用主机名。我读过许多关于 Windows 上的名称解析顺序的相互矛盾的文档页面、博客和论坛帖子 - 以及客户端是否在确定解析方法方面发挥了作用。我不确定什么是正确的/最新的。
[nslookup
先前编辑中的行为表明客户端做在选择名称解析方法时发挥一定作用。不确定它是明确的还是偶然的 - 例如,它们恰好调用了几个 API 函数中的哪一个。]
上下文:
- 问题机器是 Windows 10;它没有
hosts
或lmhosts
文件 - Ubuntu 机器是 14.04 和 18.04
- 所有其他 Windows 计算机(所有 Windows 7)都可以通过主机名访问 Ubuntu 服务器,包括直接 TCP/IP 服务和 Samba 类型的服务
- 在整个过程中,我修复了大量其他问题(例如 DHCP/DNS 重新配置、操作系统升级、反恶意软件/防火墙升级和卸载、samba/systemd-resolved 重新配置……);除了这个遗留问题之外,网络状况比以前更好
有任何想法吗?
答案1
我以前发生过类似的错误,是 WINS/NBT 数据库损坏错误,而 DNS 解析正确。
重新启动主浏览器服务器,它对我来说就成功了。
wireshark 可能会识别出对 Windows 10 的 NBT 请求回复错误数据的罪魁祸首。