学习分析网络数据包是一项强大的技能。
当连接到网络后,大多数情况下我们不会去考虑实现这一切的底层网络协议。现在,当你阅读本文时,计算机正在交换大量数据包并通过Internet进行传输。
要了解这些协议,需要一个可以捕获并帮助你分析这些数据包的工具。Wireshark是一种流行的开源图形用户界面(GUI)工具,用于分析数据包。但是,它还为喜欢在Linux命令行上工作的人们提供了一个称为TShark的强大命令行实用程序。
若要尝试本文中的示例,需要连接到Internet。有关TShark命令行选项或标志的任何更改,请参考相应的手册页和在线文档。另外,我将用Fedora来做示范。
[gaurav@testbox ~]$ cat/etc/fedora-release
Fedora release 30 (Thirty)
[gaurav@testbox ~]$
点击阅读原文
首先,确保已安装必需的软件包:
[gaurav@testbox ~] r p m − q a ∣ g r e p − i w i r e s h a r k w i r e s h a r k − c l i − 3.0.1 − 1. f c 30. x 8 6 6 4 [ g a u r a v @ t e s t b o x ] rpm -qa | grep -i wireshark wireshark-cli-3.0.1-1.fc30.x86_64 [gaurav@testbox ~] rpm−qa∣grep−iwiresharkwireshark−cli−3.0.1−1.fc30.x8664[gaurav@testbox ]
如果安装了Wireshark软件包,请检查是否安装了TShark实用程序,如果已安装,则检查软件版本:
[gaurav@testbox ~]$tshark -v
TShark (Wireshark) 3.0.1 (23f278e2)
Built using gcc 9.0.1 20190312 (Red Hat9.0.1-0.10).
[gaurav@testbox ~]$
如果以非root用户身份登录,则需要sudo权限才能使用TShark实用程序。超级用户可以跳过sudo并直接运行tshark命令。
在TShark可以分析数据包之前,它需要捕获这些数据包。网络数据包通过服务器,工作站或台式机上的网络接口卡(NIC)或笔记本电脑上的WiFi卡进行处理。首先确定用于连接互联网的NIC或WiFi卡。
要确定哪些网络设备可用于TShark,请运行以下命令。我的笔记本电脑显示如下:
[gaurav@testbox ~]$sudo tshark -D
Running as user “root” and group"root". This could be dangerous.
我正在使用WiFi卡连接到家庭路由器以访问Internet。可以使用ifconfig -a命令查看系统上的所有网络接口。如果未安装ifconfig命令,则可以改用较新的ip addr show命令。
其中某个接口应该有一个分配给它的IP地址。对于特定的接口,可以使用ifconfig
ifconfig wlp61s0
既然知道正在使用哪个接口连接到Internet,就可以开始使用它捕获数据包。-i参数可用于捕获此特定接口上的数据包。你将看到一堆输出,显示通过接口传输的网络数据包,但是可以使用Ctrl + C命令停止它:
*[gaurav@testbox ~]$sudo tshark -i wlp61s0
Running as user “root” and group"root". This could be dangerous.
Capturing on ‘wlp61s0’
1 0.000000000 192.168.1.9→ 192.168.1.1 DNS 77 Standard query 0xa02b AAAA fedoraproject.org
2 0.000128115 192.168.1.9→ 192.168.1.1 DNS 77 Standard query 0xcc47 A fedoraproject.org
3 0.000316195 192.168.1.9→ 192.168.1.1 DNS 77 Standard query 0xe29d A fedoraproject.org
4 0.000616019 192.168.1.9→ 192.168.1.1 DNS 77 Standard query 0xac7c AAAA fedoraproject.org
5 0.007963200 192.168.1.1→ 192.168.1.9 DNS 93 Standard query response 0xcc47 A fedoraproject.org A185.141.165.254
6 0.009171815 192.168.1.1→ 192.168.1.9 DNS 93 Standard query response 0xe29d A fedoraproject.org A185.141.165.254
7 0.011075350 192.168.1.1 →192.168.1.9 DNS 322 Standard query response 0xa02b AAAA fedoraproject.orgAAAA 2610:28:3090:3001:dead:beef:cafe:fed3 AAAA2605:bc80:3010:600:dead:beef:cafe:fed9 AAAA2604:1580:fe00:0:dead:beef:cafe:fed1 NS ns04.fedoraproject.org NSns05.fedoraproject.org NS ns02.fedoraproject.org A 152.19.134.139 AAAA2610:28:3090:3001:dead:beef:cafe:fed5 A 209.132.181.17 A 85.236.55.10 AAAA2001:4178:2:1269:dead:beef:cafe:fed5
8 0.012458151 192.168.1.1→ 192.168.1.9 DNS 322 Standard query response 0xac7c AAAA fedoraproject.orgAAAA 2605:bc80:3010:600:dead:beef:cafe:fed9 AAAA2610:28:3090:3001:dead:beef:cafe:fed3 AAAA 2604:1580:fe00:0:dead:beef:cafe:fed1NS ns05.fedoraproject.org NS ns02.fedoraproject.org NS ns04.fedoraproject.org A152.19.134.139 AAAA 2610:28:3090:3001:dead:beef:cafe:fed5 A 209.132.181.17 A85.236.55.10 AAAA 2001:4178:2:1269:dead:beef:cafe:fed5
^C8 packets captured
[gaurav@testbox~]$*
查看上面的前两个数据包,它们在行的开头用数字表示:
*1 0.000000000 192.168.1.9 → 192.168.1.1 DNS 77 Standard query 0xa02b AAAAfedoraproject.org
2 0.000128115 192.168.1.9 → 192.168.1.1 DNS 77 Standard query 0xcc47 A fedoraproject.org*
在箭头的两侧的两个IP地址是交换数据包的主机。箭头的方向指示数据包的前进方向。因此,192.168.1.9→192.168.1.1表示该数据包来自于主机192.168.1.9(我的笔记本电脑),并且到达目的地192.168.1.1(我的家庭路由器)。在目标IP地址之后,看到的是DNS,即域名系统协议,然后是DNS查询,稍后再详细介绍。
可以使用-c(计数)参数限制屏幕上显示的数据包数量。以下示例显示了捕获的10个数据包。注意协议,在上面看到了DNS,这里还有其他协议,例如NTP和TCP:
*[gaurav@testbox ~]$sudo tshark -i wlp61s0 -c 10
Running as user “root” and group"root". This could be dangerous.
Capturing on ‘wlp61s0’
1 0.000000000 192.168.1.9→ 10.5.26.10 NTP 90 NTP Version 4, client
2 0.803303963 192.168.1.9→ 10.5.27.10 NTP 90 NTP Version 4, client
3 3.524867645 192.168.1.9→ 192.168.1.1 DNS 69 Standard query 0x3837 A testbox
4 6.227373094 192.168.1.9→ 192.168.1.1 DNS 89 Standard query 0x0814 Alocation.services.mozilla.com
5 6.227395145 192.168.1.9→ 192.168.1.1 DNS 89 Standard query 0x5e1c AAAAlocation.services.mozilla.com
6 6.234878912 192.168.1.1→ 192.168.1.9 DNS 105 Standard query response 0x0814 Alocation.services.mozilla.com A 34.253.23.107
7 6.238110416 192.168.1.1→ 192.168.1.9 DNS 223 Standard query response 0x5e1c AAAAlocation.services.mozilla.com CNAME locprod1-elb-eu-west-1.prod.mozaws.net SOAns-1260.awsdns-29.org
8 6.238446999 192.168.1.9→ 34.253.23.107 TCP 74 35326 → 443 [SYN] Seq=0 Win=64240 Len=0 MSS=1460SACK_PERM=1 TSval=2832002333 TSecr=0 WS=128
9 6.438833991 34.253.23.107 →192.168.1.9 TCP 74 443 → 35326 [SYN, ACK] Seq=0 Ack=1 Win=26847 Len=0MSS=1440 SACK_PERM=1 TSval=2056252981 TSecr=2832002333 WS=256
10 6.438947001 192.168.1.9→ 34.253.23.107 TCP 66 35326 → 443 [ACK] Seq=1 Ack=1 Win=64256 Len=0TSval=2832002533 TSecr=2056252981
10 packets captured
[gaurav@testbox ~]$*
DNS协议将主机名转换为IP地址,或将IP地址转换为主机名。有专用的DNS(或名称)服务器,便可以使用主机名或IP地址进行查询。下面的示例使用nslookup命令查询名称服务器,以将主机名解析为IP地址。在继续之前,请确保已安装bind-utils软件包:
[gaurav@testbox ~] r p m − q a ∣ g r e p − i b i n d − u t i l s b i n d − u t i l s − 9.11.5 − 13. P 4. f c 30. x 8 6 6 4 [ g a u r a v @ t e s t b o x ] rpm -qa | grep -i bind-utils bind-utils-9.11.5-13.P4.fc30.x86_64 [gaurav@testbox ~] rpm−qa∣grep−ibind−utilsbind−utils−9.11.5−13.P4.fc30.x8664[gaurav@testbox ]
为了查询名称服务器,要找出你的计算机正在与哪个服务器进行通信。可以在/etc/resolv.conf文件中找到该信息。在我的例子中,名称服务器指向1.1.1.1,这是Cloudflare提供的公共DNS服务:
[gaurav@testbox ~]KaTeX parse error: Expected 'EOF', got '#' at position 23: …c/resolv.conf *#̲ Generated by N…*
诸如Opensource.com这样的主机名对于人类来说很容易理解,但是机器使用IP地址通过网络或互联网连接到其他机器。为了使你的计算机连接到opensource.com,需要找到该站点的IP地址。可以使用以下命令找到它:
nslookupopensource.com
如果计算机上没有nslookup,则可以改用dig命令:
dig opensource.com
但是,在按下Enter键之前,请打开另一个终端,然后键入以下命令,告诉TShark捕获去往名称服务器的所有流量(例如1.1.1.1):
sudo tshark -iwlp61s0 host 1.1.1.1
保持该终端运行并返回到另一个终端,然后运行nslookup(或dig)。命令完成后,它将提供Opensource.com的IP地址,即54.204.39.132。这是nslookup的输出:
[gaurav@testbox ~]KaTeX parse error: Expected 'EOF', got '#' at position 72: … 1.1.1.1#̲53 Non-authorit…
Dig的输出:
[gaurav@testbox ~]KaTeX parse error: Expected 'EOF', got '#' at position 499: …SERVER: 1.1.1.1#̲53(1.1.1.1) ;; …
到目前为止,一切都没问题,但是在数据包级别发生了什么?移至执行tshark命令的终端。看到捕获了一些数据包:
[gaurav@testbox ~] s u d o t s h a r k − i w l p 61 s 0 h o s t 1.1.1.1 R u n n i n g a s