文章目录
网络包的五元组
在网络中,一个五元组确定一种网络包,五元组包括:
- 协议,tcp或者udp等等
- 源IP
- 目的IP
- 源端口
- 目的端口
那么tcpdump在抓包的时候也是围绕这几个参数设置来过滤需要的数据包。下面来逐步学习tcpdump的使用。
包输入
网络数据是通过网卡来收发数据,但是一台计算机有可能有多个网卡,到底监听哪个网卡的数据呢?所以需要指定网口。
需要用参数-i来指定,i表示interface。
sudo tcpdump -i eth0 # 抓取eth0上的数据包
sudo tcpdump -i lo # 抓取lo上的数据包
这里需要强调两点:
- 使用tcpdump,需要sudo权限
- 测试本地通信的程序,数据经过lo网口,要监听lo网口,不要监听eth0端口
网络数据包非常多,需要过滤自己需要的数据包,下面介绍过滤的方法。
包过滤
因为一个网口的数据包很多,但是我只想要我需要的,我要把我需要的过滤出来,这就叫过滤。
1、IP过滤
sudo tcpdump -i eth0 host 192.168.202.92 # 过滤包括192.168.202.92的数据包
sudo tcpdump -i eth0 src host 192.168.202.92 # 过滤包括源IP为192.168.202.92的数据包
sudo tcpdump -i eth0 dst host 192.168.202.92 # 过滤包括目的IP为192.168.202.92的数据包
host表示五元组的中的IP,如果进一步限制,就继续在前面加 src 或者 dst进行修饰限制。
2、端口过滤
sudo tcpdump -i eth0 port 19648
sudo tcpdump -i eth0 src port 19648
sudo tcpdump -i eth0 dst port 19648
这个和上面的IP过滤是相似的格式,不用多解释。
3、IP和端口组合过滤
与
sudo tcpdump -i eth0 dst host 192.168.202.92 and port 80 # 既包含特定的IP又要包含特定的端口
sudo tcpdump -i eth0 dst src host 192.168.202.92 and port 80 # 既包含特定的源IP又要包含特定的端口
sudo tcpdump -i eth0 dst host 192.168.202.92 and dst port 80 # 既包含特定的源IP又要包含特定的目的端口
这个组合就是对上面的IP和端口过滤的方式进行组合,这里使用 and 关键字,表示与的意思。
或
同时还有 or 关键字,or表示或的意思。
sudo tcpdump -i eth0 dst host 192.168.202.92 or port 19761 # 满足条件之一即可
非
sudo tcpdump -i eth0 not dst host 192.168.202.92 # 过滤目的IP不是192.168.202.92的数据包
sudo tcpdump -i eth0 not dst host 192.168.202.92 and not port 80 # 过滤目的IP不是192.168.202.92同时端口不是80的
sudo tcpdump -i eth0 dst host 192.168.202.92 or not src port 80 # 过滤目的IP是192.168.202.92 或者 源端口不是80的
4、协议过滤
协议过滤,常用的协议有ip,arp,tcp,udp,icmp等等,只需要和上面的方式进行组合即可。
sudo tcpdump -i eth0 udp # 过滤所有UDP包
sudo tcpdump -i eth0 udp and host 192.168.202.92 # 过滤ip是192.168.202.92的udp包
sudo tcpdump -i eth0 udp and host 192.168.202.92 and port 40948 # 过滤ip是192.168.202.92且端口是40948的udp包
其他的组合方式类似。
以上的包过滤方式,我认为已经可以解决大多数问题了。下面介绍一下其他的参数使用。
包输出
1、保存包到文件
有时候需要将抓到的包写入文件,然后再用wireshark打开分析。
sudo tcpdump -w udp.pacp -i eth0 udp
这里使用 -w 参数,将过滤到包保存到udp.pcap文件中。
2、指定包的数量
- -c 指定过滤一定数量的包
[KentZhang@local103-122 ~]$ sudo tcpdump -c 2 -i eth0 udp
tcpdump: verbose output suppressed, use -v or -vv for full protocol decode
listening on eth0, link-type EN10MB (Ethernet), capture size 96 bytes
11:39:01.511005 IP server.ha.xss.com.syslog > 10.10.100.252.syslog: SYSLOG cron.info, length: 97
11:39:01.511415 IP server.ha.boyaa.com.42251 > dc01.boyaa.com.domain: 18958+ PTR? 252.100.10.10.in-addr.arpa. (44)
2 packets captured
7 packets received by filter
0 packets dropped by kerne
3、显示IP和端口号
[KentZhang@local103-122 ~]$ sudo tcpdump -i eth0 udp
tcpdump: verbose output suppressed, use -v or -vv for full protocol decode
listening on eth0, link-type EN10MB (Ethernet), capture size 96 bytes
11:26:34.504652 IP server.ha.com.syslog > 10.10.100.252.syslog: SYSLOG daemon.info, length: 50
11:26:34.505276 IP server.ha.com.syslog > 10.10.100.252.syslog: SYSLOG user.info, length: 43
11:26:34.505788 IP server.ha.com.syslog > 10.10.100.252.syslog: SYSLOG user.info, length: 44
11:26:34.506273 IP server.ha.com.syslog > 10.10.100.252.syslog: SYSLOG user.info, length: 43
上面的过滤效果可以看到,源IP、源端口、目的端口,均没有显示出来,显示是域名和进程名。所以需要使用 -n参数,
- -n 显示IP
- -nn 显示IP和端口
[KentZhang@local103-122 ~]$ sudo tcpdump -nn -i eth0 udp
tcpdump: verbose output suppressed, use -v or -vv for full protocol decode
listening on eth0, link-type EN10MB (Ethernet), capture size 96 bytes
11:30:35.397586 IP 192.168.202.92.514 > 10.10.100.252.514: SYSLOG kernel.info, length: 48
11:30:35.397717 IP 192.168.202.92.514 > 10.10.100.252.514: SYSLOG kernel.notice, length: 108
11:30:37.290627 IP 192.168.202.92.35260 > 192.168.100.51.53: 2401+ AAAA? jobs123.com. (32)
4、显示时间戳
- -tttt 显示时间戳
[KentZhang@local103-122 ~]$ sudo tcpdump -nn -tttt -i eth0 udp
tcpdump: verbose output suppressed, use -v or -vv for full protocol decode
listening on eth0, link-type EN10MB (Ethernet), capture size 96 bytes
2018-11-10 11:32:51.202533 IP 192.168.202.92.514 > 10.10.100.252.514: SYSLOG kernel.info, length: 48
2018-11-10 11:32:51.202683 IP 192.168.202.92.514 > 10.10.100.252.514: SYSLOG kernel.notice, length: 108
5、以ASCII码打印
- -A 以ASCII码打印
[KentZhang@local103-122 ~]$ sudo tcpdump -nn -A -tttt -i eth0 udp
tcpdump: verbose output suppressed, use -v or -vv for full protocol decode
listening on eth0, link-type EN10MB (Ethernet), capture size 96 bytes
2018-11-10 11:33:30.306305 IP 192.168.202.92.514 > 10.10.100.252.514: SYSLOG kernel.notice, length: 108
E.....@.@.@Z...\
d......t..<5>kernel: type=1700 audit(1541820810.269:155): dev=et
2018-11-10 11:33:37.386001 IP 192.168.202.92.52124 > 192.168.100.51.53: 55230+ AAAA? jobs.com. (32)
E..<.a@.@..n...\..d3...5.(...............jobs.xss.com.....
2018-11-10 11:33:37.386405 IP 192.168.100.51.53 > 192.168.202.92.52124: 55230* 1/1/0 CNAME[|domain]
...d3...\.5.....n.............jobs.com..............X...ops-uploa
2018-11-10 11:33:37.386476 IP 192.168.202.92.64472 > 192.168.100.51.53: 45448+ A? jobs.com. (32)
E..<.a@.@..n...\..d3...5.(...............jobs.xss.com.....
2018-11-10 11:33:37.386796 IP 192.168.100.51.53 > 192.168.202.92.64472: 45448* 2/0/0 CNAME[|domain]
E..o=.@.......d3...\.5...[...............jobs.xss.com..............X...ops-uploa
6、以ASCII和二进制同时打印
- -XX 以ASCII和十六进制同时打印
[KentZhang@local103-122 ~]$ sudo tcpdump -nn -XX -tttt -i eth0 udp
tcpdump: verbose output suppressed, use -v or -vv for full protocol decode
listening on eth0, link-type EN10MB (Ethernet), capture size 96 bytes
2018-11-10 11:36:35.697994 IP 192.168.202.92.514 > 10.10.100.252.514: SYSLOG kernel.notice, length: 108
0x0000: 0cda 4118 a65c f01f afe1 f61b 0800 4500 ..A..\........E.
0x0010: 0088 0000 4000 4011 405a c0a8 ca5c 0a0a ....@.@.@Z...\..
0x0020: 64fc 0202 0202 0074 fa90 3c35 3e6b 6572 d......t..<5>ker
0x0030: 6e65 6c3a 2074 7970 653d 3137 3030 2061 nel:.type=1700.a
0x0040: 7564 6974 2831 3534 3138 3230 3939 352e udit(1541820995.
0x0050: 3636 343a 3135 3729 3a20 6465 763d 6574 664:157):.dev=et
2018-11-10 11:36:37.516281 IP 192.168.202.92.55188 > 192.168.100.51.53: 29533+ AAAA? jobs.xss.com. (32)
0x0000: 0cda 4118 a65c f01f afe1 f61b 0800 4500 ..A..\........E.
0x0010: 003c 9c03 4000 4011 eecc c0a8 ca5c c0a8 .<..@.@......\..
0x0020: 6433 d794 0035 0028 b01a 735d 0100 0001 d3...5.(..s]....
0x0030: 0000 0000 0000 046a 6f62 7305 626f 7961 .......jobs.boya
0x0040: 6103 636f 6d00 001c 0001 a.com.....
谈谈如何记忆参数的使用
关于tcpdump的使用教程非常多,但是大部分都是极其相似,如果没有按照自己的思维方式进行总结个归纳,那么这个命令的使用很容易忘记。如果等到需要使用的时候再去网上查,那么筛选信息的成本就非常高,这就降低了自己的工作效率。
根据以上我总结的模块,可以看到,tcpdump的参数分为三个部分:
- 输入 -i 指定网口
- 过滤 端口 ip 协议的组合过滤
- 输出 写文件或打印输出
其中在过滤中,端口、IP、协议需要使用and、or、not组合。
所以一个tcpdump的命令格式就是:
tcpdump (输出参数) (输入参数) (过滤参数)
使用模块化的方式,更容易记忆,更清楚参数的排列,以及组合方式。
[KentZhang@local103-122 ~]$ sudo tcpdump -c 2 -nn -XX -tttt -i eth0 tcp and host 192.168.202.92
tcpdump: verbose output suppressed, use -v or -vv for full protocol decode
listening on eth0, link-type EN10MB (Ethernet), capture size 96 bytes
2018-11-10 11:59:43.674912 IP 192.168.202.92.55225 > 192.168.100.17.6379: P 4250024641:4250024733(92) ack 511953561 win 2396
0x0000: 0cda 4118 a65c f01f afe1 f61b 0800 4500 ..A..\........E.
0x0010: 0084 18e3 4000 4006 71d2 c0a8 ca5c c0a8 ....@.@.q....\..
0x0020: 6411 d7b9 18eb fd52 3ac1 1e83 ca99 5018 d......R:.....P.
0x0030: 095c b035 0000 2a35 0d0a 2437 0d0a 6576 .\.5..*5..$7..ev
0x0040: 616c 7368 610d 0a24 3430 0d0a 3332 3336 alsha..$40..3236
0x0050: 6334 3436 6433 6238 3736 3236 3566 6534 c446d3b876265fe4
2018-11-10 11:59:43.675481 IP 192.168.100.17.6379 > 192.168.202.92.55225: P 1:5(4) ack 92 win 229
0x0000: f01f afe1 f61b 0cda 4118 a65c 0800 4500 ........A..\..E.
0x0010: 002c 2141 4000 3e06 6bcc c0a8 6411 c0a8 .,!A@.>.k...d...
0x0020: ca5c 18eb d7b9 1e83 ca99 fd52 3b1d 5018 .\.........R;.P.
0x0030: 00e5 b5b8 0000 2a30 0d0a 0000 ......*0....
2 packets captured
43 packets received by filter
0 packets dropped by kernel