介绍

tcpdump 即dump traffic on network,它是根据使用者的定义对网络上的数据包进行截获并分析的工具。
tcpdump支持网络层、协议、主机、网络或端口的过滤,并提供and、or、not等逻辑语句过滤不必要的信息
ps:Linux系统下普通用户不能执行tcpdump,一般root用户执行。

参数

  1. [root@lhuan ~]# tcpdump -h
  2. tcpdump version 4.9.2
  3. libpcap version 1.5.3
  4. OpenSSL 1.0.2k-fips 26 Jan 2017
  5. Usage: tcpdump [-aAbdDefhHIJKlLnNOpqStuUvxX#] [ -B size ] [ -c count ]
  6. [ -C file_size ] [ -E algo:secret ] [ -F file ] [ -G seconds ]
  7. [ -i interface ] [ -j tstamptype ] [ -M secret ] [ --number ]
  8. [ -Q|-P in|out|inout ]
  9. [ -r file ] [ -s snaplen ] [ --time-stamp-precision precision ]
  10. [ --immediate-mode ] [ -T type ] [ --version ] [ -V file ]
  11. [ -w file ] [ -W filecount ] [ -y datalinktype ] [ -z postrotate-command ]
  12. [ -Z user ] [ expression ]
参数 说明
-A 以ASCII码方式显示每一个数据包,在程序调试的时候便于查看数据
-a 将网络地址和广播地址变成名字
-c tcpdump工具将在接收到指定数据的数据包后退出
-d 将匹配信息包的代码转换成人们能够理解的汇编格式
-dd 将匹配到的信息包的代码转换成C语言程序段的格式
-ddd 将匹配到的信息转换成10进制的形式
-e 在输出行打印初数据链路层的头部信息
-f 将百度的Internet地址以数字的形式打印出来
-F 使用文件作为过滤条件表达式的输入,此时命令上的输入将被忽略
-i 指定监听的网络接口
-l 使标准输出变为缓冲行形式
-n 不把网络地址转换成名字
-N 不打印host的域名部分
-q 打印很少的协议相关信息,从而使输出行都比较简短
-r 从文件file中读取包数据
-s 设置tcpdump的数据包抓取长度,如果不设置默认为68字节
-t 在输出的每一行不打印时间戳
-tt 不对每行输出的时间进行格式处理
-ttt tcpdump输出的时候,每两行打印之间会延迟一个时间段,以毫秒为单位
-c 输出一个稍微详细的信息
eg:在IP包中可以包括TTL和服务类型的信息
-vv 输出详细的报文信息
-vvv 产生比-vv更详细的输出
-x 当分析和打印的时候,tcpdump会打印每个包的头部数据,同时会以16进制打印出每一个包的数据,但不包括连接层的头部
-xx tcpdump会打印每个包的头部数据,同时会以16进制打印出每一个包的数据,但不包括连接层的头部
-X tcpdump会打印每一个包的头部数据,同时会以16进制和ASCII码形式打印出每个包的数据,其中不包括数据链路层的头部
-XX tcpdump会打印每一个包的头部数据,同时会以16进制和ASCII码形式打印出每个包的数据,其中包括数据链路层的头部

使用

  1. [root@lhuan ~]# tcpdump
  2. tcpdump: verbose output suppressed, use -v or -vv for full protocol decode
  3. listening on eth0, link-type EN10MB (Ethernet), capture size 262144 bytes
  4. 13:55:22.248362 IP lhuan.ssh > 114.229.154.98.64232: Flags [P.], seq 3417176744:3417176956, ack 385250539, win 251, length 212
  5. 13:55:22.248665 IP lhuan.54574 > 183.60.83.19.domain: 22715+ PTR? 98.154.229.114.in-addr.arpa. (45)
  6. 13:55:22.249517 IP 183.60.83.19.domain > lhuan.54574: 22715 NXDomain 0/1/0 (94)
  7. 13:55:22.250598 IP lhuan.42142 > 183.60.83.19.domain: 57067+ PTR? 3.0.17.172.in-addr.arpa. (41)
  8. 13:55:22.251304 IP 183.60.83.19.domain > lhuan.42142: 57067 NXDomain* 0/1/0 (100)
  9. 13:55:22.251658 IP lhuan.34740 > 183.60.83.19.domain: 38112+ PTR? 19.83.60.183.in-addr.arpa. (43)
  10. 13:55:22.252219 IP 183.60.83.19.domain > lhuan.34740: 38112 NXDomain 0/1/0 (107)
  11. 13:55:22.261084 IP 114.229.154.98.64232 > lhuan.ssh: Flags [.], ack 212, win 514, length 0
  12. 13:55:22.721914 IP lhuan.37534 > 169.254.0.55.lsi-bobcat: Flags [.], seq 1224411396:1224412820, ack 3380290971, win 49376, length 1424
  13. 13:55:22.721930 IP lhuan.37534 > 169.254.0.55.lsi-bobcat: Flags [P.], seq 1424:2651, ack 1, win 49376, length 1227

tcpdump不跟任何参数,tcpdum会从系统接口列表中搜寻编号最小的已配置好的接口,不包括loopback接口,一旦找到第一个符合条件的接口,搜寻立马结束,并将获取的数据包打印处理
tcpdump利用表达式(可以是正则表达式)作为过滤数据包的条件。
表达式关键字:
1.关于类型的关键字。eg:host、net、port
2.确定数据包传输方向的关键字。eg:src、dst、dst or src 、dst and src
如果没有指明方向关键字,默认是dst or src 关键字
3.协议的关键字,指明是TCP还是UDP协议
三种逻辑运算:
非运算:not 或 !
与运算:and 或 &&
或运算: or 或 ||

监视指定网络接口的数据包

[root@lhuan ~]# tcpdump -i eth0
tcpdump: verbose output suppressed, use -v or -vv for full protocol decode
listening on eth0, link-type EN10MB (Ethernet), capture size 262144 bytes
15:13:12.448881 IP lhuan.ssh > 114.229.154.98.62930: Flags [P.], seq 3367461942:3367462154, ack 3383878235, win 251, length 212
15:13:12.449218 IP lhuan.53350 > 183.60.83.19.domain: 40703+ PTR? 98.154.229.114.in-addr.arpa. (45)
15:13:12.502408 IP 114.229.154.98.62930 > lhuan.ssh: Flags [.], ack 212, win 516, length 0
15:13:12.541185 IP 183.60.83.19.domain > lhuan.53350: 40703 NXDomain 0/1/0 (94)
15:13:12.542450 IP lhuan.60889 > 183.60.83.19.domain: 24216+ PTR? 3.0.17.172.in-addr.arpa. (41)

监视指定主机的数据包,例如所有进入或离开node1的数据包

tcpdump -i ens33  host node1

打印node1<—>node2或node1<—>node3之间通信的数据

tcpdump -i ens33 host node1 and \(node2 or node3\)

抓取ping包

tcpdump -c 5 -nn -i ens33 

==指定主机抓ping包==
tcpdump -c 5 -nn -i eth0 icmp and src 192.168.100.62

解析包数据

tcpdump -c 2 -q -XX -vvv -nn -i ens33 tcp dst port 22

抓取到本机22端口包

tcpdump -c 10 -nn -i eth0 tcp dst port 22

[root@lhuan ~]# tcpdump -c 10 -nn -i eth0 tcp dst port 22
tcpdump: verbose output suppressed, use -v or -vv for full protocol decode
listening on eth0, link-type EN10MB (Ethernet), capture size 262144 bytes
15:16:37.582784 IP 114.229.154.98.62930 > 172.17.0.3.22: Flags [P.], seq 3383880899:3383880951, ack 3367466426, win 516, length 52
\15:16:37.597057 IP 114.229.154.98.62930 > 172.17.0.3.22: Flags [.], ack 409, win 515, length 0
15:16:37.648695 IP 114.229.154.98.62930 > 172.17.0.3.22: Flags [.], ack 557, win 514, length 0
15:16:37.709879 IP 114.229.154.98.62930 > 172.17.0.3.22: Flags [.], ack 705, win 514, length 0
15:16:37.761094 IP 114.229.154.98.62930 > 172.17.0.3.22: Flags [.], ack 853, win 513, length 0
15:16:37.811901 IP 114.229.154.98.62930 > 172.17.0.3.22: Flags [.], ack 1001, win 513, length 0
15:16:37.863025 IP 114.229.154.98.62930 > 172.17.0.3.22: Flags [.], ack 1149, win 512, length 0
15:16:37.915769 IP 114.229.154.98.62930 > 172.17.0.3.22: Flags [.], ack 1297, win 511, length 0
15:16:37.969612 IP 114.229.154.98.62930 > 172.17.0.3.22: Flags [.], ack 1445, win 517, length 0
15:16:38.022445 IP 114.229.154.98.62930 > 172.17.0.3.22: Flags [.], ack 1593, win 516, length 0
10 packets captured
10 packets received by filter
0 packets dropped by kernel