tcpdump - 命令
tcpdump
导览:
1. 什么是 tcpdump
2. tcpdump 抓包前提 - 混杂模式
3. tcpdump 使用
3.1 命令格式
3.1.1 关键字
3.1.2 选项
4. 实际使用
5. 数据包分析
5.1 tcp 报文变量
1. 什么是 tcpdump
通俗地说:tcpdump 是一个抓包工具,用于抓取互联网上传输的数据包。
学术的说:tcpdump 是一种嗅探器 ( sniffer ),利用以太网的特性,通过将网卡适配器 ( NIC )置于混杂模式 ( promiscuous ) 来获取传输在网络中的信息包
2. tcpdump 抓包前提 - 混杂模式
要用 tcpdump 抓包,一定要切换到 root 用户下,因为只要 root 用户才有权限将网卡变更为适于抓包的 ‘ 混杂模式 ’
所谓混杂模式,简单来说就是让网卡抓取任何经过它的数据包,不管这个数据包是不是发给它或者是它发出的,一般而言,Linux 不会让普通用户设置混杂模式,因为这样可以看到别人的信息,比如别的用户名和密码,这样会引起一些安全上的问题,所以只有 root 用户可以开启混杂模式
开启混杂模式:
[root@localhost ~]# ifconfig ens33 promisc
关闭混杂模式:
[root@localhost ~]# ifconfig ens33 -promisc
开启后可通过 ifconfig
来查看,注意为大写的 PROMISC
[root@localhost ~]# ifconfig
ens33: flags=4419<UP,BROADCAST,RUNNING,PROMISC,MULTICAST> mtu 1500
inet 172.20.10.3 netmask 255.255.255.240 broadcast 172.20.10.15
inet6 fe80::a098:cae9:180a:e05f prefixlen 64 scopeid 0x20<link>
inet6 2408:8456:3420:ce2d:784b:3a24:cee3:9428 prefixlen 64 scopeid 0x0<global>
ether 00:0c:29:bf:9e:4b txqueuelen 1000 (Ethernet)
RX packets 221886 bytes 316347227 (301.6 MiB)
RX errors 0 dropped 0 overruns 0 frame 0
TX packets 73800 bytes 4907240 (4.6 MiB)
TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0
lo: flags=73<UP,LOOPBACK,RUNNING> mtu 65536
inet 127.0.0.1 netmask 255.0.0.0
inet6 ::1 prefixlen 128 scopeid 0x10<host>
loop txqueuelen 1000 (Local Loopback)
RX packets 25 bytes 2506 (2.4 KiB)
RX errors 0 dropped 0 overruns 0 frame 0
TX packets 25 bytes 2506 (2.4 KiB)
TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0
[root@localhost ~]# ifconfig | grep -i pro
ens33: flags=4419<UP,BROADCAST,RUNNING,PROMISC,MULTICAST> mtu 1500
3. tcpdump 使用
3.1 命令格式
[root@localhost ~]# tcpdump [选项] [关键字]
3.1.1 关键字
| 类型关键字 | 确定方向关键字 | 协议关键字(缺省值:监听所有协议) | 其他关键字 |
| ------------ | ------------ | ------------ | ------------ | ------------ |
| host(缺省类型):指明一台主机 | src:指明 IP 包源地址 | ip fddi | gateway |
| net:指明一个网络地址 | dst net:指明 IP 包目标网络地址 | tcp udp | broadcast |
| port:指明一个端口号 | dst or src(缺省值) | arp rarp | less greater |
如果条件特别复杂的时候可以使用括号,但是需要转译
- 非:!或者 not
- 且:&& 或者 and
- 或:|| 或者 or
3.1.2 选项
选项 | 含义 |
---|---|
-A | 以 ASCII 码打印每个报文(不包括链路层的头),对分析网页有一定帮助 |
-a | 将网络地址和广播地址转换成名字 |
-c <数据包数目> | 收到指定的数据包数目后,就停止进行倾倒操作 |
-d | 把编译过的数据包编码转换成可阅读的格式,并倾倒到标准输出 |
-dd | 把编译过的数据包编码转换成C语言的格式,并倾倒到标准输出 |
-ddd | 把编译过的数据包编码转换成十进制数字的格式,并倾倒到标准输出 |
-e | 在每列倾倒资料上显示连接层级的文件头 |
-f | 用数字显示网际网络地址 |
-F <表达文件> | 指定内含表达方式的文件 |
-i <网络界面> | 使用指定的网络截面送出数据包 |
-l | 使用标准输出列的缓冲区 |
-n | 不把主机的网络地址转换成名字 |
-nn | 指定将每个监听到的数据包中的域名转换成IP、端口从应用名称转换成端口号后显示 |
-N | 不列出域名 |
-O | 不将数据包编码最佳化 |
-p | 不让网络界面进入混杂模式 |
-q | 快速输出,仅列出少数的传输协议信息 |
-r <数据包文件> | 从指定的文件读取数据包数据 |
-s <数据包大小> | 设置每个数据包的大小 |
-S | 用绝对而非相对数值列出TCP关联数 |
-t | 在每列倾倒资料上不显示时间戳记 |
-tt | 在每列倾倒资料上显示未经格式化的时间戳记 |
-T <数据包类型> | 强制将表达方式所指定的数据包转译成设置的数据包类型 |
-v | 详细显示指令执行过程 |
-vv | 更详细显示指令执行过程 |
-x | 用十六进制字码列出数据包资料 |
-w <数据包文件> | 把数据包数据写入指定的文件 |
4. 实际使用
[root@localhost ~]# tcpdump -i ens33 -nn -X 'port 22' -c 1
tcpdump: verbose output suppressed, use -v or -vv for full protocol decode
listening on ens33, link-type EN10MB (Ethernet), capture size 262144 bytes
11:18:05.944556 IP 10.1.70.109.22 > 10.1.70.106.56980: Flags [P.], seq 3415398881:3415399093, ack 3590615396, win 274, length 212
0x0000: 4510 00fc 2c33 4000 4006 6ce0 0a01 466d E...,3@.@.l...Fm
0x0010: 0a01 466a 0016 de94 cb92 d9e1 d604 7164 ..Fj..........qd
0x0020: 5018 0112 a1c7 0000 0000 00b0 53ad 569d P...........S.V.
0x0030: ccfb ef25 7033 32e2 08de af36 bd93 0cbc ...%p32....6....
0x0040: 555b b6da a7fb e195 5d25 5980 5210 4599 U[......]%Y.R.E.
0x0050: a2b6 9e1c 3e73 ab49 6729 a623 8e0f b605 ....>s.Ig).#....
0x0060: e86e 7c72 79f2 1f24 d68d 2e38 dd26 9947 .n|ry..$...8.&.G
0x0070: c643 0d4f 8c63 8d2f 7dd3 8bea a7a6 5030 .C.O.c./}.....P0
0x0080: 4856 2d56 fc0f 34fb 8300 f670 df3f 0496 HV-V..4....p.?..
0x0090: 189f ef83 0bd7 92f1 f243 c9b5 33e4 589a .........C..3.X.
0x00a0: cda5 0cb6 a6d4 c1eb f08d 8fbb 8dc7 e5b3 ................
0x00b0: e02e 044d 83d0 80e4 b20f 3445 070e d37a ...M......4E...z
0x00c0: 04b7 de46 aea4 13c2 ba03 ae9a 21ad 3b89 ...F........!.;.
0x00d0: 42d5 8473 3cb3 8361 1f69 a1e1 155b 9c62 B..s<..a.i...[.b
0x00e0: 503a a330 3e60 7d35 ad50 f0e4 9d45 b2a1 P:.0>`}5.P...E..
0x00f0: 3cc6 4948 a144 de47 a53f 8ce3 <.IH.D.G.?..
1 packet captured
2 packets received by filter
0 packets dropped by kernel
-i : 即interface,用来指定网络接口,指定监控的网卡。
-nn : 当tcpdump遇到协议号或端口号时,不要将这些数字转换成对应的协议名称或端口名称。比如:希望显示 22 ,而不是 ssh。
-X :需要把协议头和包内容都原原本本地显示出来,tcpdump会同时以16进制和ASCII的形式显示,这在进行协议分析时是绝对的利器。
port 22 : 只抓取源端口或目的端口是22的数据包,其他的数据包就不要显示出来
-c : 是Count含义,设置抓取的包数
5. 数据包分析
[root@localhost ~]# tcpdump -i ens33 host 172.20.10.8 -c 10
tcpdump: verbose output suppressed, use -v or -vv for full protocol decode
listening on ens33, link-type EN10MB (Ethernet), capture size 262144 bytes
19:47:19.453680 IP localhost.localdomain.ssh > 172.20.10.8.50498: Flags [P.], seq 3798963494:3798963682, ack 1422720005, win 293, options [nop,nop,TS val 2308192355 ecr 513334436], length 188
19:47:19.454106 IP 172.20.10.8.50498 > localhost.localdomain.ssh: Flags [.], ack 188, win 2045, options [nop,nop,TS val 513334456 ecr 2308192355], length 0
19:47:19.487031 IP localhost.localdomain.ssh > 172.20.10.8.50498: Flags [P.], seq 188:576, ack 1, win 293, options [nop,nop,TS val 2308192388 ecr 513334456], length 388
19:47:19.487341 IP localhost.localdomain.ssh > 172.20.10.8.50498: Flags [P.], seq 576:780, ack 1, win 293, options [nop,nop,TS val 2308192388 ecr 513334456], length 204
19:47:19.487612 IP 172.20.10.8.50498 > localhost.localdomain.ssh: Flags [.], ack 576, win 2041, options [nop,nop,TS val 513334489 ecr 2308192388], length 0
19:47:19.487646 IP 172.20.10.8.50498 > localhost.localdomain.ssh: Flags [.], ack 780, win 2044, options [nop,nop,TS val 513334489 ecr 2308192388], length 0
19:47:19.488021 IP localhost.localdomain.ssh > 172.20.10.8.50498: Flags [P.], seq 780:1304, ack 1, win 293, options [nop,nop,TS val 2308192389 ecr 513334489], length 524
19:47:19.488334 IP localhost.localdomain.ssh > 172.20.10.8.50498: Flags [P.], seq 1304:1516, ack 1, win 293, options [nop,nop,TS val 2308192389 ecr 513334489], length 212
19:47:19.488657 IP localhost.localdomain.ssh > 172.20.10.8.50498: Flags [P.], seq 1516:1728, ack 1, win 293, options [nop,nop,TS val 2308192390 ecr 513334489], length 212
19:47:19.488908 IP 172.20.10.8.50498 > localhost.localdomain.ssh: Flags [.], ack 1304, win 2039, options [nop,nop,TS val 513334489 ecr 2308192389], length 0
10 packets captured
12 packets received by filter
0 packets dropped by kernel
- 第一列(19:47:19.487612):时 分 秒 微秒
- 第二列(IP):国际网络协议名称
- 第三列(localhost.localdomain.ssh > 172.20.10.8.50498):报文发送方以及接收方
- 第四列(Flags [P.])Flags 标识符:[S.] [.] [P.] [F.]
- 第五列:是 tcp 协议报文头的变量
5.1 tcp 报文变量值
- seq:请求同步的序列号
- ack:已经同步的序列号
- win:当前可用窗口大小
- length:tcp 协议报文文体的长度
tcp 连接需要经历三个过程:
1. tcp 三次握手
2. 数据传输
3. tcp 四次挥手
可用通过上面说过的 Flags 标识符来确认:
- Flags [S.]:发起连接标识(三次握手)
- Flags [P.]:传输数据标识(传输数据)
- Flags [F.]:关闭连接标识(四次挥手)
- Flags [.]:无标识
- RST:异常关闭连接
清醒是一种细小而有耐性的英雄主义 -Tzyy
希望这篇文章能对你有帮助哦~