引言
这是有关网络协议的第三篇文章。
前两篇文章分享了tcpdump和tshark最基本的用法。这篇文章原本是想翻译tcpdump官方文档,但是网上已经有了现成的翻译版本,作者已经对比较难懂的部分做了说明,当然作者也有略过一部分的说明。
Tcpdump实际上非常复杂,需要对网络协议有全面又细致的掌握,有兴趣可以参考tcpdump官方文档。
这篇文章主要从指定过滤条件表达式捕获包的角度去分享一些基本的过滤条件表达式。原本想一篇博客写完,google了一番之后,发现还有很多比较实用的命令,所以分开写。
tcpdump常用选项介绍
- -n 禁止IP名称解析。
- -nn 禁止IP和端口名称解析。
- -i 指定捕获哪个网卡的网络数据包。
- -w 指定将包写入哪个文件,如果文件不存在则创建该文件;如果存在则覆盖其内容。
- -f 指定过滤表达式,例如指定捕获哪个端口,哪个协议等。
- -r 指定从哪个文件读取网络数据包文件。
- -F 指定使用哪个文件的过滤表达式抓包。
- -D 列出所有可以使用tcpdump抓包的网卡。
- -c 指定捕获或者读取包的个数,-c后面直接接数字即可。
- -l 抓包时保存到文件的同时查看包的内容。
- -t 不打印时间戳。
- -tt 秒级时间戳。
- -ttt 打印时间戳到微秒或者纳秒,取决于 –time-stamp-precision option 选项。
- -s 指定每个包捕获的字节数。
- -S 打印绝对的tcp序列号,而不是相对的序列号。
- -v/-vv/-vvv 打印详细信息,v的个数越多, 打印内容越详细。
上面是常用的选项,更多的选项请参考tcpdump官方文档,下面将对使用过滤条件抓包进行基本的介绍。
命令概览
这篇博客要分享的主要命令如下:
#协议为tcp,目标端口或源端口为80
tcpdump -nni ens33 -w packets.pcap 'tcp port 80'
#协议为tcp,目标端口为80
tcpdump -nni ens33 -w packets.pcap 'tcp dst port 80' -c10
#协议类型为tcp,源端口为80
tcpdump -nni ens33 -w packets.pcap 'tcp src port 80' -c10
#读取文件中协议类型为tcp,目标端口为80的包
tcpdump -nnr packets.pcap 'tcp dst port 80' -c10
#将packets.pcap文件中目标端口为443的包转存到dst_port_443.pcap中
tcpdump -r packets.pcap 'dst port 443' -w dst_port_443.pcap
#指定IP地址为14.215.177.39
tcpdump -nni ens33 host 14.215.177.39 -c5
#源IP地址为192.168.248.134
tcpdump -nni ens33 src 192.168.248.134 -c5
#目标IP地址为192.168.248.134
tcpdump -nni ens33 dst 192.168.248.134 -c5
#通往网络192.168.248.0/24
tcpdump -nni ens33 net 192.168.248.0/24 -c5
实用命令
1. 测试-D选项
根据官方文档的说明,-D选项用于列出系统中所有tcpdump可以进行抓包的网卡。
虚拟机测试代码:
[sunft@localhost ~]$ tcpdump -D
1.bluetooth0 (Bluetooth adapter number 0)
[sunft@localhost ~]$ ifconfig
ens33: flags=4163<UP,BROADCAST,RUNNING,MULTICAST> mtu 1500
inet6 fe80::176e:36f2:18ab:c561 prefixlen 64 scopeid 0x20<link>
inet6 fd15:4ba5:5a2b:1008:c7f1:b0a6:ecf:6bfc prefixlen 64 scopeid 0x0<global>
ether 00:0c:29:59:4f:1a txqueuelen 1000 (Ethernet)
RX packets 77 bytes 11417 (11.1 KiB)
RX errors 0 dropped 0 overruns 0 frame 0
TX packets 15 bytes 2598 (2.5 KiB)
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 1 (Local Loopback)
RX packets 880 bytes 95324 (93.0 KiB)
RX errors 0 dropped 0 overruns 0 frame 0
TX packets 880 bytes 95324 (93.0 KiB)
TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0
virbr0: flags=4099<UP,BROADCAST,MULTICAST> mtu 1500
inet 192.168.122.1 netmask 255.255.255.0 broadcast 192.168.122.255
ether 52:54:00:2b:fd:d5 txqueuelen 1000 (Ethernet)
RX packets 0 bytes 0 (0.0 B)
RX errors 0 dropped 0 overruns 0 frame 0
TX packets 0 bytes 0 (0.0 B)
TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0
普通Linux机器测试代码:
[root@localhost ~]# tcpdump -D
1.eth0
2.nflog (Linux netfilter log (NFLOG) interface)
3.nfqueue (Linux netfilter queue (NFQUEUE) interface)
4.usbmon1 (USB bus number 1)
5.usbmon2 (USB bus number 2)
6.any (Pseudo-device that captures on all interfaces)
7.lo
说明:
不知道是因为虚拟机的原因还是版本的原因,在虚拟机上 -D 选项并未正确列举出所有可用的网卡,而 ifconfig 则正确列出了可用的网卡。
在列举所有的可用网卡时不建议使用tcpdump -D</