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

posted @ 2021-03-30 20:23  -桃枝夭夭-  阅读(440)  评论(0编辑  收藏  举报