记一次dns找不到ip的问题的解决方法

539 阅读7分钟

背景

上周去某公司参与一个项目联调,联调方给了一个地址,于是我打开了postman,兴奋地准备试一下该接口是否可以调通,得到了如下的错误:
Error: getaddrinfo ENOTFOUND xxx-test-drcn.inner.cloud.xxx.com。
于是乎,我便想用自己蹩脚的网络知识去找到这个问题的原因,由于不太熟悉dns解析的流程,加上粗心各种搞错,导致花费较长的时间才找到这个问题的解决方法,所以利用周末时间回顾了一下这个问题。

解决过程回顾

看到这种问题,首先我的第一反应就是dns有问题,所以我就使用dig去看一下是否能拿到这个域名对应的IP地址,操作结果如下(当时没有截图,这个是我回家重试的结果)

;; global options: +cmd
;; Got answer:
;; ->>HEADER<<- opcode: QUERY, status: NXDOMAIN, id: 46346
;; flags: qr rd ra; QUERY: 1, ANSWER: 0, AUTHORITY: 1, ADDITIONAL: 1

;; OPT PSEUDOSECTION:
; EDNS: version: 0, flags:; udp: 4000
;; QUESTION SECTION:
;xxx-test-drcn.inner.cloud.xxx.com. IN A

;; AUTHORITY SECTION:
xxxx.com.		180	IN	SOA	ns3.dnsv5.com. enterprise3dnsadmin.dnspod.com. 1676017540 3600 180 1209600 180

;; Query time: 142 msec
;; SERVER: 192.168.168.168#53(192.168.168.168)
;; WHEN: Sun Feb 12 16:49:34 CST 2023
;; MSG SIZE  rcvd: 146

一看确实这个域名没有对应的ip,所以我就坚定的认为dns解析有问题。于是我就去查dns的解析过程,由于一直听过dns的解析过程,也有简单的了解,但是在实际使用中很少遇到问题,所以其实并没有深刻理解过dns过程。

dns解析过程

打开谷歌随便一搜,就会发现很多讲dns,很容易发现类似这张图:
其实这张图很好地表达了dns的解析的过程,为了更好的理解dns的解析过程,借助dig工具,我们可以详细的trace一次dns解析的全过程,这里用百度的域名举例:

➜  ~ dig www.baidu.com +trace
; <<>> DiG 9.10.6 <<>> www.baidu.com +trace
;; global options: +cmd
.			146893	IN	NS	g.root-servers.net.
.			146893	IN	NS	e.root-servers.net.
.			146893	IN	NS	i.root-servers.net.
.			146893	IN	NS	k.root-servers.net.
.			146893	IN	NS	a.root-servers.net.
.			146893	IN	NS	f.root-servers.net.
.			146893	IN	NS	l.root-servers.net.
.			146893	IN	NS	b.root-servers.net.
.			146893	IN	NS	j.root-servers.net.
.			146893	IN	NS	m.root-servers.net.
.			146893	IN	NS	d.root-servers.net.
.			146893	IN	NS	h.root-servers.net.
.			146893	IN	NS	c.root-servers.net.
;; Received 239 bytes from 192.168.168.168#53(192.168.168.168) in 10 ms
com.			172800	IN	NS	a.gtld-servers.net.
com.			172800	IN	NS	b.gtld-servers.net.
com.			172800	IN	NS	c.gtld-servers.net.
com.			172800	IN	NS	d.gtld-servers.net.
com.			172800	IN	NS	e.gtld-servers.net.
com.			172800	IN	NS	f.gtld-servers.net.
com.			172800	IN	NS	g.gtld-servers.net.
com.			172800	IN	NS	h.gtld-servers.net.
com.			172800	IN	NS	i.gtld-servers.net.
com.			172800	IN	NS	j.gtld-servers.net.
com.			172800	IN	NS	k.gtld-servers.net.
com.			172800	IN	NS	l.gtld-servers.net.
com.			172800	IN	NS	m.gtld-servers.net.
com.			86400	IN	DS	30909 8 2 E2D3C916F6DEEAC73294E8268FB5885044A833FC5459588F4A9184CF C41A5766
com.			86400	IN	RRSIG	DS 8 1 86400 20230225050000 20230212040000 951 . BqKDCFIVRIR2PB4cKfyY+nM25ZhVmer5gVXLRC2pXiUnWG7GufxkR1xK DbMtL5/P98e6WnQyGXCJvyWnqe3s/KvXkdGfBFFHzZ2b508u00ABbITI xwmQB8bVXfKg9pkPEgGevH2UwSqohux63buuwv3Q/HNnikacXf36bivs YLz7Lx0WwymBBy1mrc+0xeZIJzh25jye55Ckx6OqnN5VTgXSI9rUec6G mAAIjfh54JiYRiLv+Iw1/dyeeEcDeZyafUiE9p9q/Pcp9GpbnTYEBnnk NJsi0v+xweeNlA8FQICWS/zbAaQuhihuIUQVQgTYyBZtUhBEsAMQYdbt Q9T0ig==
;; Received 1173 bytes from 193.0.14.129#53(k.root-servers.net) in 35 ms

baidu.com.		172800	IN	NS	ns2.baidu.com.
baidu.com.		172800	IN	NS	ns3.baidu.com.
baidu.com.		172800	IN	NS	ns4.baidu.com.
baidu.com.		172800	IN	NS	ns1.baidu.com.
baidu.com.		172800	IN	NS	ns7.baidu.com.
CK0POJMG874LJREF7EFN8430QVIT8BSM.com. 86400 IN NSEC3 1 1 0 - CK0Q2D6NI4I7EQH8NA30NS61O48UL8G5  NS SOA RRSIG DNSKEY NSEC3PARAM
CK0POJMG874LJREF7EFN8430QVIT8BSM.com. 86400 IN RRSIG NSEC3 8 2 86400 20230219052251 20230212041251 36739 com. LMcgMQFLQOrC5eZ8lT/w3zfy938o3HvnXbZ79glQ3tceud7s3FSaxbFl E6faNre/oHe273TfuUur69LMn456aELFsigub9aprgTzSVMLLR1uLo9S ikIpps4OSakJD/sxrIQR1KG+4gzfi0j6U+u1h8NZwbNJFBxEe2jnajl3 OSAQkcRYrubFQYXbxh0mmdur0UcZ0pl+NBsBltSbCf9MHw==
HPVV07LPQ3T8RQS9HETLBJF268LK3OQ2.com. 86400 IN NSEC3 1 1 0 - HPVV8SARM2LDLRBTVC5EP1CUB1EF7LOP  NS DS RRSIG
HPVV07LPQ3T8RQS9HETLBJF268LK3OQ2.com. 86400 IN RRSIG NSEC3 8 2 86400 20230217070330 20230210055330 36739 com. oAEa+/2R65UEnV68++Qql4d7zA/uEufF/sNjpCXKTCOFNhwFGYqJaajh QVYcUF+wDpTv9PmusFM2RvhQBtDqrqNv7zWpyeEHZiUaFa90EA+4UOg4 5w65J7ghCBaemlyeQ2Pg4OEP5LpIzsC1mVIQzMjNzAlU/pbXnBG66g0k o/7PG/6xPbrsA0Akfxajlhgfc/M9uoZg2O63uxggV+EwiQ==
;; Received 849 bytes from 192.12.94.30#53(e.gtld-servers.net) in 229 ms

www.baidu.com.		1200	IN	CNAME	www.a.shifen.com.
;; Received 72 bytes from 220.181.33.31#53(ns2.baidu.com) in 32 ms

我们看到第一次返回如下,对应的是我们拿到的全部的根域名服务器地址:

.			146893	IN	NS	g.root-servers.net.
.			146893	IN	NS	e.root-servers.net.
.			146893	IN	NS	i.root-servers.net.
.			146893	IN	NS	k.root-servers.net.
.			146893	IN	NS	a.root-servers.net.
.			146893	IN	NS	f.root-servers.net.
.			146893	IN	NS	l.root-servers.net.
.			146893	IN	NS	b.root-servers.net.
.			146893	IN	NS	j.root-servers.net.
.			146893	IN	NS	m.root-servers.net.
.			146893	IN	NS	d.root-servers.net.
.			146893	IN	NS	h.root-servers.net.
.			146893	IN	NS	c.root-servers.net.
;; Received 239 bytes from 192.168.168.168#53(192.168.168.168) in 10 ms

第二次返回对应如下,表示我们从k.root-servers.net拿到对应的一级域名gtld(generic top level domain)的所有的服务器:

com.			172800	IN	NS	a.gtld-servers.net.
com.			172800	IN	NS	b.gtld-servers.net.
com.			172800	IN	NS	c.gtld-servers.net.
com.			172800	IN	NS	d.gtld-servers.net.
com.			172800	IN	NS	e.gtld-servers.net.
com.			172800	IN	NS	f.gtld-servers.net.
com.			172800	IN	NS	g.gtld-servers.net.
com.			172800	IN	NS	h.gtld-servers.net.
com.			172800	IN	NS	i.gtld-servers.net.
com.			172800	IN	NS	j.gtld-servers.net.
com.			172800	IN	NS	k.gtld-servers.net.
com.			172800	IN	NS	l.gtld-servers.net.
com.			172800	IN	NS	m.gtld-servers.net.
;; Received 1173 bytes from 193.0.14.129#53(k.root-servers.net) in 35 ms

第三次返回,表示我们从e.gtld-servers.net拿到对应这个二级域名的nameserver服务器:

baidu.com.		172800	IN	NS	ns2.baidu.com.
baidu.com.		172800	IN	NS	ns3.baidu.com.
baidu.com.		172800	IN	NS	ns4.baidu.com.
baidu.com.		172800	IN	NS	ns1.baidu.com.
baidu.com.		172800	IN	NS	ns7.baidu.com.
;; Received 849 bytes from 192.12.94.30#53(e.gtld-servers.net) in 229 ms

第四次返回,表示我们从nameserver返回的域名的别名,我们也是从namesever解析到对应的真实的ip:

www.baidu.com.		1200	IN	CNAME	www.a.shifen.com.
;; Received 72 bytes from 220.181.33.31#53(ns2.baidu.com) in 32 ms

所以总结下来,就是从根服务器找到gtld的服务器,然后选择其中的一个gtld服务器找到这个二级域名的一组nameserver服务器,最终从其中nameserver服务器中找到域名对应的真实ip,即为图中表示的过程。
至此我觉得就是对方公司没有申请这个域名,所以我们找不到,于是我就找对方沟通了这个问题。但是我发现他们文档中对应这个域名还有一个ip地址,这个ip对应的是10.xxx,对应一个局域网地址,于是我就很好奇局域网地址也可以有域名,搜索一下便很快理解了原理。

公司内搭建自己的dns解析

由于公司内部需要通过http相互调用,ip又是很难记住,所以可以搭建公司内部的dns server,这样在dns server上配置公司内部的域名对应的ip即可,这样在公司内网即可用域名相互访问。常见的dns server有,bind9dnsmasq,感兴趣的同学可以自己尝试,至此我遇到的这个问题解决方案是在内网的域名服务器上加上对应映射关系即可,于是我就催促对方帮忙加上。

一点延伸

周末在家查看了一下本机的dns配置,发现本机的dns配置是对应一个局域网地址,如这里对应的server地址是192.168.168.168,这个是本地的局域网地址,后查询相关资料,了解到家里router也可以作为一个dns server,这样有可以起到一个缓存的作用。然后router配置上游的dns server可以是本地isp默认的地址。这样router没有找到的话,可以让它的上游server去找,上游server执行上述的trace过程,拿到后返回给router的dns server,然后router dns 缓存对应的结果并返回给客户端。

  ~ nslookup www.google.com
Server:		192.168.168.168
Address:	192.168.168.168#53

Non-authoritative answer:
Name:	www.google.com
Address: 64.13.192.76

这里还发现另外两个个问题,

  1. 发现家里路由器默认的dns server地址是192.168.1.1;0.0.0.0(如下图),但是我连上wifi后默认配置的dns对应的192.168.168.168,
  2. 我手动把dns改为192.168.1.1 发现也是可以的,然后又尝试把dns改为192.168.1.2,发现也是可以的。

image.png
路由器配置界面没有找到哪里配置的,原理还不清楚,也没有找到对应的解释,后续如果找到对应的答案,再来回答。

参考文档:

【1】www.catchpoint.com/blog/domain…