DNS抓包请求详解

DNS的传输层使用的是UDP协议或者TCP协议。

DNS在某些情况下会使用TCP协议。DNS通常使用UDP协议(用户数据报协议)来进行域名查询,因为UDP速度快、效率高,而且查询数据包通常较小,适合在UDP上进行。但是,当DNS查询数据包的大小超过了UDP数据包的最大限制时(通常是512字节),DNS会使用TCP协议来进行查询。此外,某些DNS服务器也会将DNS查询请求强制转换为TCP协议,以增加安全性和可靠性。

Transaction ID

在DNS协议中,每个DNS请求报文都包含一个16位的Transaction ID字段,用于标识该DNS请求和对应的DNS响应。Transaction ID由客户端随机生成,并且在DNS响应报文中原样返回,以便客户端能够将响应与请求进行匹配。Transaction ID的生成没有特定的规律,通常是使用伪随机数生成算法来生成。

DNS解析过程

终端输出

执行dig +trace www.baidu.com返回的结果为:

展开/收起 dig +trace www.baidu.com

; <<>> DiG 9.10.6 <<>> +trace www.baidu.com
;; global options: +cmd
. 255946 IN NS f.root-servers.net.
. 255946 IN NS g.root-servers.net.
. 255946 IN NS h.root-servers.net.
. 255946 IN NS b.root-servers.net.
. 255946 IN NS j.root-servers.net.
. 255946 IN NS l.root-servers.net.
. 255946 IN NS k.root-servers.net.
. 255946 IN NS e.root-servers.net.
. 255946 IN NS a.root-servers.net.
. 255946 IN NS c.root-servers.net.
. 255946 IN NS m.root-servers.net.
. 255946 IN NS i.root-servers.net.
. 255946 IN NS d.root-servers.net.
. 255946 IN RRSIG NS 8 0 518400 20230305170000 20230220160000 951 . xU5kKOHDoGfyQVeW8Huv74NJxyAaKyuDUxli5P0K08z+vvLlA3N87OVL bhwoihWpKg+Of2S2nI6jx80n+S2Ty74PSOijnu9sW7vvTD30Wg1Vgtda rrOc2gf9UmDkT+mLda/IiX7DtAla76k9t+owykaxyPHfdkLH1cfZmGj6 0KPRJDf9gnopBomQIBa4/m3UqwJlefYA0Wr01Bs+BaCKHPQEnrBSsBYJ jBbFOkadtuXtVym5Bapg8TYJQQfJxlutIuuEyC1BDSqw33poKUcKzXg3 v7VIeHSq+wKaOyDt7m9wrCxOhj3uZurNO+b88xmtV4pX+HxRGs+Yx2QY kCGskQ==
;; Received 1097 bytes from 10.50.4.107#53(10.50.4.107) in 12 ms

com. 172800 IN NS m.gtld-servers.net.
com. 172800 IN NS k.gtld-servers.net.
com. 172800 IN NS c.gtld-servers.net.
com. 172800 IN NS i.gtld-servers.net.
com. 172800 IN NS h.gtld-servers.net.
com. 172800 IN NS b.gtld-servers.net.
com. 172800 IN NS e.gtld-servers.net.
com. 172800 IN NS f.gtld-servers.net.
com. 172800 IN NS d.gtld-servers.net.
com. 172800 IN NS g.gtld-servers.net.
com. 172800 IN NS j.gtld-servers.net.
com. 172800 IN NS a.gtld-servers.net.
com. 172800 IN NS l.gtld-servers.net.
com. 86400 IN DS 30909 8 2 E2D3C916F6DEEAC73294E8268FB5885044A833FC5459588F4A9184CF C41A5766
com. 86400 IN RRSIG DS 8 1 86400 20230308170000 20230223160000 951 . eiW76HnA6iWoL7HVQQlR5GwBc3QagvdHZJEH3d13ze+ukMwieArh0Ec2 pd10S4nFcW8S37ajG+u2tzLV09ZlXhpRNbXX84qD17QvWeh7IeT+vCFl lk4I/+55UcVdI3LfhHmJPF4cjMLQsIbKCB1Ryf+sWQsVKYE9XeoUR5Mp rV7W8I1UWn9e1yMs5C+ujrd/UFPb/Uw4QS6RZ7Q0K39XOUqFRqUuSnFQ Klg5fExB7I6/dARBqK4lnOzMssrF97HmGtGNUkpb3CgBMIwSDGriM+Uf vQVRzFyhGNHD3KigUV18uYw8Yqq48By+BKJmzMd4IQGiy0e0WNavs2vd 9Ph/+A==
;; Received 1176 bytes from 192.5.5.241#53(f.root-servers.net) in 27 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 20230227052255 20230220041255 36739 com. YJw2xFEhDVUfIlym8yUrXw8rVYLxS+e/EkIJVmOkBANnfCmNPVATcGuM /DIrUz8PTWTezM5z6f2tM+KnzzXYMNL1ScDIgO/jaJUrs4aOz1EOPwD4 hk5rJ/pRSY9C87vRoxqdryDIHxg3TwwEfQglqQ9hk+P1qvU7qY5nd0yc tO+IV8Vqd0sRiteg/P1h6Bpp79v/kZNjntRTdnWLI2oW2g==
HPVV07LPQ3T8RQS9HETLBJF268LK3OQ2.com. 86400 IN NSEC3 1 1 0 - HPVV8SARM2LDLRBTVC5EP1CUB1EF7LOP NS DS RRSIG
HPVV07LPQ3T8RQS9HETLBJF268LK3OQ2.com. 86400 IN RRSIG NSEC3 8 2 86400 20230301070223 20230222055223 36739 com. Z4AFqvwBHDHfzuf37WTbdeC0SMt15I4qG2MUUhjv14m7MJ6AwDCHVXAZ tqi9T+xttD0xo0wgL5pRciXRTdNPUFBq/mu5Fimp/tfosWjcshv50+4c TNdbMXubTw4yr7DLDlQGO5a2cSa6T/HrDnpdDjZJcfVYLGZP1k5nFXhc +TKjOrScSPq9lG3hH7n7SGxCTrp7j+tCjzrHjH8egq2tKg==
;; Received 849 bytes from 192.5.6.30#53(a.gtld-servers.net) in 187 ms

www.baidu.com. 1200 IN CNAME www.a.shifen.com.
;; Received 72 bytes from 110.242.68.134#53(ns1.baidu.com) in 29 ms

抓包

下面是对应的执行抓到的包:

首先访问192.5.5.241,192.5.5.241返回了13台通用顶级域名.com服务器的信息,如下:

pSz3zXn.png

ID 81中Additional records比Authoritative nameservers多了返回addr,他们的IP地址包括IPv4和IPv6,这俩可以通过type区分,type分别为A和AAAA。ID81对应的请求为ID80:Standard query. 0x2935 A www.baidu.com OPT

然后选择了其中的一台,这里选择了a.gtld-servers.net,地址为192.5.6.30,192.5.6.30返回的内容如下:

pSzGdM9.png

然后选择了其中的一台,这里选择了ns1.baidu.com,地址为110.242.68.134,110.242.68.134返回的内容如下:

pSzGxZq.png

DNS响应时间

响应和请求相邻时

首先调整下wireshark的显示设置:

pSzaS8f.png

因为发现本次的dns查询的请求和响应都是相邻的,所以响应包里这个设置显示的时间就是响应时间。

wireshark抓到的包中可以看到响应时间(发出包和接收到这个包的时间差),wireshark抓到的包结果是这样的:

pSza6it.png

命令行返回的结果为:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
dig +trace csdn.com +time=1 +noall +stats

; <<>> DiG 9.10.6 <<>> +trace csdn.com +time=1 +noall +stats
;; global options: +cmd
;; Query time: 51 msec
;; SERVER: 8.8.8.8#53(8.8.8.8)
;; WHEN: Fri Feb 24 15:11:09 CST 2023
;; MSG SIZE rcvd: 525

;; Query time: 193 msec
;; SERVER: 198.41.0.4#53(198.41.0.4)
;; WHEN: Fri Feb 24 15:11:09 CST 2023
;; MSG SIZE rcvd: 1168

;; Query time: 195 msec
;; SERVER: 192.54.112.30#53(192.54.112.30)
;; WHEN: Fri Feb 24 15:11:09 CST 2023
;; MSG SIZE rcvd: 946

;; Query time: 12 msec
;; SERVER: 47.118.199.202#53(47.118.199.202)
;; WHEN: Fri Feb 24 15:11:09 CST 2023
;; MSG SIZE rcvd: 53

可以看到4个DNS请求的响应时间在wireshark都有对应的结果,包括SERVER字段和wireshark里的也是一致的。

响应和请求分隔时

试着执行了下命令:

1
2
dig +trace csdn.com +time=1 +noall +stats &
dig +trace zhihu.com +time=1 +noall +stats

运行结果为:

展开/收起 ; <<>> DiG 9.10.6 <<>> +trace zhihu.com +time=1 +noall +stats
;; global options: +cmd

; <<>> DiG 9.10.6 <<>> +trace csdn.com +time=1 +noall +stats
;; global options: +cmd
;; Query time: 45 msec
;; SERVER: 8.8.8.8#53(8.8.8.8)
;; WHEN: Fri Feb 24 16:50:14 CST 2023
;; MSG SIZE rcvd: 525

;; Query time: 46 msec
;; SERVER: 8.8.8.8#53(8.8.8.8)
;; WHEN: Fri Feb 24 16:50:14 CST 2023
;; MSG SIZE rcvd: 525

;; Query time: 29 msec
;; SERVER: 199.7.83.42#53(199.7.83.42)
;; WHEN: Fri Feb 24 16:50:14 CST 2023
;; MSG SIZE rcvd: 1168

;; Query time: 81 msec
;; SERVER: 202.12.27.33#53(202.12.27.33)
;; WHEN: Fri Feb 24 16:50:14 CST 2023
;; MSG SIZE rcvd: 1169

;; Query time: 212 msec
;; SERVER: 192.48.79.30#53(192.48.79.30)
;; WHEN: Fri Feb 24 16:50:14 CST 2023
;; MSG SIZE rcvd: 946

;; Query time: 5 msec
;; SERVER: 139.224.142.121#53(139.224.142.121)
;; WHEN: Fri Feb 24 16:50:14 CST 2023
;; MSG SIZE rcvd: 53

;; Query time: 211 msec
;; SERVER: 192.52.178.30#53(192.52.178.30)
;; WHEN: Fri Feb 24 16:50:14 CST 2023
;; MSG SIZE rcvd: 909

;; Query time: 8 msec
;; SERVER: 183.192.164.119#53(183.192.164.119)
;; WHEN: Fri Feb 24 16:50:14 CST 2023
;; MSG SIZE rcvd: 108

wireshark抓到的包为:

pSzgIPg.png

共16个包。

因为加了&,两个dig命令是同一时刻执行的,而且每个DNS请求的响应不全是请求的下一个包。如图响应包和请求包之间就有2个包。我整理了一下:

请求包序号 响应包序号 响应时间 第几个dig命令产生的包 对应dig命令的输出
23 25 0.045652 不确定,我好像看不出来。。 ;; Query time: 45 msec
;; SERVER: 8.8.8.8#53(8.8.8.8)
;; WHEN: Fri Feb 24 16:50:14 CST 2023
;; MSG SIZE rcvd: 525
24 26 0.046427 不确定,我好像看不出来。。 ;; Query time: 46 msec
;; SERVER: 8.8.8.8#53(8.8.8.8)
;; WHEN: Fri Feb 24 16:50:14 CST 2023
;; MSG SIZE rcvd: 525
27 34 0.08078 2 ;; Query time: 29 msec
;; SERVER: 199.7.83.42#53(199.7.83.42)
;; WHEN: Fri Feb 24 16:50:14 CST 2023
;; MSG SIZE rcvd: 1168
28 29 0.028015 1 ;; Query time: 81 msec
;; SERVER: 202.12.27.33#53(202.12.27.33)
;; WHEN: Fri Feb 24 16:50:14 CST 2023
;; MSG SIZE rcvd: 1169
32 48 0.212717 1 ;; Query time: 212 msec
;; SERVER: 192.48.79.30#53(192.48.79.30)
;; WHEN: Fri Feb 24 16:50:14 CST 2023
;; MSG SIZE rcvd: 946
35 51 0.210875 2 ;; Query time: 5 msec
;; SERVER: 139.224.142.121#53(139.224.142.121)
;; WHEN: Fri Feb 24 16:50:14 CST 2023
;; MSG SIZE rcvd: 53
49 50 0.004978 1 ;; Query time: 211 msec
;; SERVER: 192.52.178.30#53(192.52.178.30)
;; WHEN: Fri Feb 24 16:50:14 CST 2023
;; MSG SIZE rcvd: 909
52 53 0.007501 2 ;; Query time: 8 msec
;; SERVER: 183.192.164.119#53(183.192.164.119)
;; WHEN: Fri Feb 24 16:50:14 CST 2023
;; MSG SIZE rcvd: 108

根据之前所说,每次DNS请求的transaction id都是无序的,在本次抓包结果可以验证。

DNS解析这里是2个命令同时执行的,我理解的就是2个进程分别对应着2个命令的执行,这2个进程分别生成随机的Transaction ID,然后请求,DNS的响应中会有请求的Transaction ID,这2个进程只会处理自己生成的Transaction ID对应的响应,根据响应的结果判断出下一个请求该如何发送。这样发送几次请求后,得到对应的结果。2个进程也不会互相干扰,只会处理跟自己生成的Transaction ID相关的内容。


DNS抓包请求详解
https://nrbackback.github.io/2023/02/24/DNS请求抓包详解/
作者
John Doe
发布于
2023年2月24日
许可协议