我正在尝试用 C 编写一个简单的程序来通过 TCP/IP 连接到主机名,但在 Ubuntu 上很难让 DNS 正常工作。
实际上,我在 Windows 上运行得很好。在 IP 为 192.168.1.189 的 Windows Server 2022 上,我设置了一个简单的 DNS 服务器,将我的主机名 TESTHOSTNAME 指向我的 IP 192.168.1.157。在 Windows 10 PC 上,我将 DNS 指向 192.168.1.189,然后使用 Putty 与 TESTHOSTNAME 建立原始连接。从 Putty 发送的数据在 TESTHOSTNAME 上接收时没有出现问题。
我无法在 Ubuntu 上实现此功能。我将 DNS 指向 192.168.1.189 并确认可以 ping 通它。但当我运行“nc TESTHOSTNAME 10000”时,它失败了:nc:主机“TESTHOSTNAME”端口 10000 的 getaddrinfo:名称或服务未知 Ubuntu 客户端、Windows Server DNS 计算机和 TESTHOSTNAME PC 上的防火墙已关闭。
我在 Windows Server 事件查看器上完全看不到任何显示成功或失败的有用日志。我在 Windows Server DNS 服务器上启用了调试日志记录,但确实出现了此故障:
9/27/2024 12:42:48 PM 017C PACKET 00000252C1073130 UDP Snd 192.168.1.168 93c7 R Q [8281 DR SERVFAIL] A (7)TESTHOSTNAME(0)
UDP response info at 00000252C1073130
Socket = 936
Remote addr 192.168.1.168, port 50201
Time Query=13247, Queued=0, Expire=0
Buf length = 0x0fa0 (4000)
Msg length = 0x0019 (25)
Message:
XID 0x93c7
Flags 0x8182
QR 1 (RESPONSE)
OPCODE 0 (QUERY)
AA 0
TC 0
RD 1
RA 1
Z 0
CD 0
AD 0
RCODE 2 (SERVFAIL)
QCOUNT 1
ACOUNT 0
NSCOUNT 0
ARCOUNT 0
QUESTION SECTION:
Offset = 0x000c, RR count = 0
Name = (7)TESTHOSTNAME(0)
QTYPE A (1)
QCLASS 1
我是 DNS 新手,正在努力排除一些似乎只是设计为“正常工作”的问题:
错误日志中是否有任何可能有帮助的内容?还有其他日志或诊断可以尝试吗?
我越来越担心我无法配置 Windows DNS 服务器来与 Linux 客户端配合使用(至少就我的经验水平而言)。有没有一个非常简单的 Ubuntu DNS 服务器可以代替我安装?
编辑 2:nslookup 和 ping 尝试:
在 Windows 和 Ubuntu 上:
Server: 192.168.1.189
Address: 192.168.1.189#53
Name: TESTHOSTNAME.yourdomain.local
Address: 192.168.1.157
在 Ubuntu 上,对 testhostname 和 testhostname.yourdomain.local 进行 ping 操作均失败,但在 Windows 上则成功。
编辑 3:全新安装的 Ubuntu 的视频显示 nslookup 运行良好,但仍然无法以某种方式解决问题: https://youtu.be/IQTwdfAAWJ0
您的 DNS 客户端询问了错误的问题,因此 DNS 服务器没有答案。退后一步,使用一些 DNS 工具来识别问题
首先让我们确认一下场景
使用 Windows 和 Ubuntu 系统,使用此命令确保每个系统上都有有效的 DNS 结果:
这应该会返回一个地址
192.168.1.157
。如果它返回类似Can't find testhostname.yourdomain.local: No answer
“您的 Windows Server 没有提供 DNS 服务”的内容,您需要对此进行调查。现在在两个系统上再次尝试此操作:
(它不会在 Ubuntu 系统上自动停止;您必须Ctrl C中断它。)
最后试试这个
您可能会发现这有效,也可能无效。如果出现错误,我预计的错误是
testhostname
无法找到。如果是这种情况,问题在于您的客户端不知道要使用的完全限定域名。DNS 服务器知道testhostname.yourdomain.local
但不知道testhostname
(它们是不同的)。如果客户端知道域,它可以自动将其后缀到任何不合格的查询中,因此当您询问testhostname
DNS 服务器时,问题实际上是testhostname.yourdomain.local
。但显然,如果客户端不知道域,它就无法附加它,因此它会提出错误的问题并且得不到有用的答案。Ubuntu 系统的解决方案很大程度上取决于您如何配置它。通常,域名是作为 DHCP 响应的一部分提供的 - 以及 IP 地址、默认网关和 DNS 服务器,这就是我开始解决问题的地方。
一旦 DNS 解析正常工作,你会发现依赖于它的其他应用程序(即你的
nc
)也可以按预期解析名称