Tcpdump 是一个网络故障排除命令,也称为数据包嗅探器,用于捕获和显示来自网络的数据包。Tcpdump 允许用户捕获和显示通过计算机连接的网络传输或接收的 TCP/IP 和其他数据包(UDP、ARP 或 ICMP)。
您可以对数据包应用过滤器,并且可以避免您不想看到的流量。您可以捕获通过本地网络的所有数据,并将该数据放入文件中以供以后分析。要运行 tcpdump 命令,您需要 root 或具有sudo 权限的用户。
在本教程中,我们将学习如何使用 tcpdump 命令来分析 Linux 机器上的流量。
[root@kylinos ~]# yum install -y tcpdump
1. 捕获接口上的流量
当您使用不带任何选项的 tcpdump 时,它将分析所有接口上的流量,运行以下命令:
$ sudo tcpdump
您必须按 Ctrl + C 按钮才能停止它。
要捕获特定接口上的流量,请使用 -i选项并将数据包数量限制为-c选项:
以下 tcpdump 示例分析“ens160”接口并将数据包限制为 5:
$ sudo tcpdump -i ens160 -c 5
tcpdump: verbose output suppressed, use -v or -vv for full protocol decode
listening on ens160, link-type EN10MB (Ethernet), capture size 262144 bytes
22:37:57.488830 IP Ubuntu.ssh > static.vnpt.vn.50302: Flags [P.], seq 904499689:904499877, ack 2322684183, win 501, options [nop,nop,TS val 215651573 ecr 764510174], length 188
22:37:57.489727 IP Ubuntu.33256 > dns.google.domain: 5774+ [1au] PTR? 219.62.249.14.in-addr.arpa. (55)
22:37:57.496238 IP static.vnpt.vn.50302 > Ubuntu.ssh: Flags [.], ack 188, win 2045, options [nop,nop,TS val 764510247 ecr 215651573], length 0
22:37:57.546212 ARP, Request who-has 42.112.22.189 tell 42.112.22.254, length 46
22:37:57.549223 ARP, Request who-has 42.112.22.162 tell 42.112.22.254, length 46
5 packets captured
2)捕获特定主机上的流量
-host您可以使用选项捕获来自特定主机的传入和传出数据包。
$ sudo tcpdump -i ens160 -c 5 -ttttnnvvS host 14.249.62.219
现在,您可以看到请求和回复数据包:
tcpdump: listening on ens160, link-type EN10MB (Ethernet), capture size 262144 bytes
2020-06-22 06:07:36.407733 IP (tos 0x12,ECT(0), ttl 64, id 60196, offset 0, flags [DF], proto TCP (6), length 176)
100.9.8.40.22 > 14.249.62.219.49396: Flags [P.], cksum 0x60a7 (incorrect -> 0x8547), seq 296088568:296088692, ack 3491435441, win 501, options [nop,nop,TS val 242630491 ecr 673952638], length 124
2020-06-22 06:07:36.407905 IP (tos 0x12,ECT(0), ttl 64, id 60197, offset 0, flags [DF], proto TCP (6), length 208)
100.9.8.40.22 > 14.249.62.219.49396: Flags [P.], cksum 0x60c7 (incorrect -> 0xeed4), seq 296088692:296088848, ack 3491435441, win 501, options [nop,nop,TS val 242630492 ecr 673952638], length 156
2020-06-22 06:07:36.407967 IP (tos 0x12,ECT(0), ttl 64, id 60198, offset 0, flags [DF], proto TCP (6), length 288)
100.9.8.40.22 > 14.249.62.219.49396: Flags [P.], cksum 0x6117 (incorrect -> 0x82ca), seq 296088848:296089084, ack 3491435441, win 501, options [nop,nop,TS val 242630492 ecr 673952638], length 236
2020-06-22 06:07:36.408018 IP (tos 0x12,ECT(0), ttl 64, id 60199, offset 0, flags [DF], proto TCP (6), length 408)
100.9.8.40.22 > 14.249.62.219.49396: Flags [P.], cksum 0x618f (incorrect -> 0xebc8), seq 296089084:296089440, ack 3491435441, win 501, options [nop,nop,TS val 242630492 ecr 673952638], length 356
2020-06-22 06:07:36.408049 IP (tos 0x12,ECT(0), ttl 64, id 60200, offset 0, flags [DF], proto TCP (6), length 208)
100.9.8.40.22 > 14.249.62.219.49396: Flags [P.], cksum 0x60c7 (incorrect -> 0x3db7), seq 296089440:296089596, ack 3491435441, win 501, options [nop,nop,TS val 242630492 ecr 673952638], length 156
3) 按端口查找数据包
要查找到指定端口号的数据包,请使用-port选项。
假设您要分析“ens160”网络接口并将来自端口 22 的数据包数量限制为 5,让我们运行以下命令:
$ sudo tcpdump -i ens160 -c 5 -nn port 22
tcpdump: verbose output suppressed, use -v or -vv for full protocol decode
listening on ens160, link-type EN10MB (Ethernet), capture size 262144 bytes
22:55:11.567754 IP 100.9.8.40.22 > 14.249.62.219.50302: Flags [P.], seq 904502461:904502649, ack 2322684399, win 501, options [nop,nop,TS val 216685651 ecr 765506106], length 188
22:55:11.567973 IP 100.9.8.40.22 > 14.249.62.219.50302: Flags [P.], seq 188:408, ack 1, win 501, options [nop,nop,TS val 216685652 ecr 765506106], length 220
22:55:11.568102 IP 100.9.8.40.22 > 14.249.62.219.50302: Flags [P.], seq 408:604, ack 1, win 501, options [nop,nop,TS val 216685652 ecr 765506106], length 196
22:55:11.568184 IP 100.9.8.40.22 > 14.249.62.219.50302: Flags [P.], seq 604:800, ack 1, win 501, options [nop,nop,TS val 216685652 ecr 765506106], length 196
22:55:11.568262 IP 100.9.8.40.22 > 14.249.62.219.50302: Flags [P.], seq 800:996, ack 1, win 501, options [nop,nop,TS val 216685652 ecr 765506106], length 196
要在拦截数据包时忽略端口,请使用not port.
如果要分析 22 以外的“ens160”网络接口端口,请运行以下命令:
$ sudo tcpdump -i ens160 -nn not port 22
您可以使用一系列端口来捕获您的网络流量。
例如,如果要分析端口范围内的 ens160 网络接口:从端口 20 到端口 23,请运行以下命令:
$ sudo tcpdump -i ens160 -c 3 -nns 0 portrange 20-23
4) 从特定协议捕获数据包
您可以决定是仅捕获 ICMP(Internet 控制消息协议)还是 TCP(传输控制协议)数据包。以下命令将仅捕获 TCP 数据包:
$ sudo tcpdump -i ens160 -c 5 -nn tcp
Output
tcpdump: verbose output suppressed, use -v or -vv for full protocol decode
listening on ens160, link-type EN10MB (Ethernet), capture size 262144 bytes
23:13:04.283421 IP 10.9.8.40.22 > 14.249.62.219.50302: Flags [P.], seq 904505569:904505677, ack 2322684631, win 501, options [nop,nop,TS val 217758367 ecr 766570531], length 108
23:13:04.283512 IP 100.9.8.40.22 > 14.249.62.219.50302: Flags [P.], seq 108:144, ack 1, win 501, options [nop,nop,TS val 217758367 ecr 766570531], length 36
23:13:04.283588 IP 100.9.8.40.22 > 14.249.62.219.50302: Flags [P.], seq 144:260, ack 1, win 501, options [nop,nop,TS val 217758367 ecr 766570531], length 116
23:13:04.283642 IP 100.9.8.40.22 > 14.249.62.219.50302: Flags [P.], seq 260:296, ack 1, win 501, options [nop,nop,TS val 217758367 ecr 766570531], length 36
23:13:04.283863 IP 100.9.8.40.22 > 14.249.62.219.50302: Flags [P.], seq 296:508, ack 1, win 501, options [nop,nop,TS val 217758368 ecr 766570531], length 212
5)将日志保存到特定文件
可以将捕获的数据包保存在文件中。默认情况下,将数据包捕获到文件中时,它将仅保存每个数据包中 68 字节的数据。其余信息被忽略。
您可以使用-s选项告诉 tcpdump linux 每个数据包要保存多少字节,并指定0为数据包快照长度告诉 tcpdump 保存整个数据包,使用以下命令:
$ sudo tcpdump -i ens160 -c 5 -nn tcp -w
数据包-record.pcap -s 0
Output
tcpdump: listening on ens160, link-type EN10MB (Ethernet), capture size 262144 bytes
5 packets captured
6)读取tcpdump记录文件
使用'cat'或'less'等常用命令无法读取保存tcpdump数据包的文件内容,但需要使用-rtcpdump命令的参数:
$ sudo tcpdump -r packets-record.pcap
现在您可以读取 tcpdump 记录文件的内容:
reading from file packets-record.pcap, link-type EN10MB (Ethernet)
23:18:57.823581 IP Ubuntu.ssh > static.vnpt.vn.50302: Flags [P.], seq 904507573:904507617, ack 2322684767, win 501, options [nop,nop,TS val 218111907 ecr 766921765], length 44
23:18:57.823697 IP Ubuntu.ssh > static.vnpt.vn.50302: Flags [P.], seq 44:160, ack 1, win 501, options [nop,nop,TS val 218111907 ecr 766921765], length 116
23:18:57.823778 IP Ubuntu.ssh > static.vnpt.vn.50302: Flags [P.], seq 160:196, ack 1, win 501, options [nop,nop,TS val 218111907 ecr 766921765], length 36
23:18:57.832656 IP static.vnpt.vn.50302 > Ubuntu.ssh: Flags [.], ack 44, win 2047, options [nop,nop,TS val 766921826 ecr 218111907], length 0
23:18:57.832685 IP static.vnpt.vn.50302 > Ubuntu.ssh: Flags [.], ack 160, win 2045, options [nop,nop,TS val 766921826 ecr 218111907], length 0
您也可以使用此 pcap 文件与Wireshark 一起查看以分析.
7) 过滤来自特定来源的数据包
为了过滤来自特定源 IP 的数据包,您可以使用src选项。
$ sudo tcpdump src 100.9.8.40
如果您想查看其他方向的流量,请以同样的方式使用dst选项:
$ sudo tcpdump dst 14.249.62.219
8) 通过网络捕获数据包
从网络使用-net选项捕获传入和传出。以下命令捕获来自 192.168.0.0/24 网络的流量:
$ sudu tcpdump net 192.169.0.0/24
9) 以 ASCII 码捕获数据包
要以 ASCII 码显示捕获的数据包,请使用-A选项,这很方便捕获网页。
$ sudo tcpdump -A -i eth0
Tcpdump 还可以以 Hex 和 ASCII 格式显示数据包内容,然后使用-X选项:
$ sudo tcpdump -X -i eth0
10) 捕获 IPV6 数据包
我们可以使用ip6option 和 proto 来捕获 IPV6 流量,以指定 TCP 或 UDP 协议。
proto 6 - TCP
proto 17 - UDP
以下使用 tcp 协议捕获所有 ipv6 流量:
$ sudo tcpdump -nn ip6 proto 6
11)过滤Http用户代理
以下命令从 http 请求标头中过滤 Http 用户代理和主机:
$ sudo tcpdump -nn -A -s1500 -l | egrep -i 'User-Agent:|Host:'
要捕获 cookie,请使用以下命令:
$ sudo tcpdump -nn -A -s0 -l | egrep -i 'Set-Cookie|Host:|Cookie:'
12) 列出可用接口
您可以使用 tcpdump列出带有-D选项的可用接口。
例如:
$ sudo tcpdump -D
Output
1.ens160 [Up, Running]
2.any (Pseudo-device that captures on all interfaces) [Up, Running]
3.lo [Up, Running, Loopback]
4.docker0 [Up]
5.nflog (Linux netfilter log (NFLOG) interface)
6.nfqueue (Linux netfilter queue (NFQUEUE) interface)
7.usbmon1 (USB bus number 1)
8.usbmon2 (USB bus number 2)
13) 旋转捕获文件
如果您长时间使用 tcpdump 捕获流量,最好在达到一定的文件大小或时间时创建一个新文件。
以下命令将每 30 分钟 (-G 1800) 创建一个新的“network-02-30.pcap”文件,文件限制为 100MB (-C 100),文件数为 24 (-W 48)。
$ sudo tcpdump -i ens160 -w /tmp/network-%H-%M.pcap -W 48 -G 300 -C 100
Tcpdump 选项
Tcpdump 提供了几个选项来增强或修改其输出,让我们检查一下:
-i <interface>:监听指定接口。
-n: 不要解析主机名。您可以使用 -nn 不解析主机名或端口名。
-t:在每个转储行上打印人类可读的时间戳,-tttt:提供最大程度的人类可读的时间戳输出。
-X:以十六进制和ASCII显示数据包的内容。
-v, -vv, -vvv: 增加返回的数据包信息量。
-c N: 只得到 N 个数据包然后停止。
-s:以字节为单位定义捕获的 snaplength(大小)。用于-s0获取所有内容,除非您有意减少捕获量。
-S:打印绝对序列号。
-q:显示较少的协议信息。
-w <file name>:将原始数据包写入文件而不是
and, or and not 运算符的幂
Tcpdump 命令支持组合“and”、“or”和“not”运算符,以过滤出更准确的结果。
捕获来自 10.20.0.0/16 并进入网络 10.30.0.0/16 的流量,显示人类可读的时间戳 (tt),不解析主机名或端口号 (nn),详细输出 (vv) 并使用绝对序列数字(S):
$ sudo -ttnnvvS tcpdump src net 10.20.0.0/16 and dst net 10.30.0.0/16
显示来自非 UDP 协议的源 192.168.0.10 的流量:
$ sudo tcpdump src 192.168.0.10 and src net and not udp
要捕获特定主机的 arp 或 ping 流量并将输出保存到名为 packetfile.txt 的文件中:
$ sudo tcpdump -nnti eth0 arp or icmp and host 192.168.0.1 -w packetfile.txt
Tcpdump 输出格式
让我们从 tcpdump 输出中换行来了解它的格式。
10:31:13.440803 IP Ubuntu.ssh > 117.6.129.86.50736: Flags [P.], seq 188:400, ack 1, win 501, options [nop,nop,TS val 468736347 ecr 335665367], length 212
在哪里:
10:31:13.401128- 本地时间捕获数据包的时间。
IP- 表示包协议为IPV4。
Ubuntu.ssh- 这表示源 IP 地址或源主机名,.ssh 表示端口(此处为 22)。
117.6.129.86.50376- 这表示目标 IP 地址和点 (.),由端口号分隔。
标志:
[P.]- 这是 TCP 标志字段。
[.]- ACK(确认)。
[S]- SYN(开始连接)。
[P]- PSH(推送数据)。
[F]- FIN(完成连接)。
[R]- RST(重置连接)。
[S.]- SYN-ACK(SynAcK 数据包)。
seq 188:400- 序列号表示数据包包含字节“188”到“400”的数据。
win 501- 该字段是窗口大小,表示接收缓冲区中可用的字节数。
options [nop,nop,TS val 468736347 ecr 335665367]- 这些是 TCP 选项,例如 MSS(最大段大小)或窗口比例。length 212- 这表示有效载荷数据的长度(以字节为单位)。
结论
尽管数据包嗅探器是有用的诊断工具,但它们也可能被滥用。例如,不道德的人可以运行数据包嗅探器来捕获其他人通过网络发送的密码。根据您的网络配置,即使数据包嗅探器未在发送或接收计算机上运行,此技巧也可以工作。
出于这个原因,许多组织都有政策禁止使用数据包嗅探器,除非在有限的情况下。