由于在测试中会需要抓取Linux服务器(IPC端或者EC2服务器)上的包,一直使用的是tcpdump工具,在这里总结下tcpdump的命令。如果只是仅仅抓包只需要学会使用以下这个命令:

  • 抓取网卡为enp3s0的数据包,并保存到http.cap文件中
tcpdump -i enp3s0 -w http.cap

想要更深入了解tcpdump的话可以阅读以下内容,更多详细信息可以查看官网http://www.tcpdump.org/manpages/tcpdump.1.html

一、tcpdump简介

tcpdump,就是dump the traffic on a network,根据使用者的定义对网络上的数据包进行截获的包分析工具。 tcpdump可以将网络中传送的数据包的“头”完全截获下来提供分析。它支持针对网络层、协议、主机、网络或端口的过滤,并提供and、or、not等逻辑语句来帮助你去掉无用的信息。

二、tcpdump用法

tcpdump [ -AbdDefhHIJKlLnNOpqStuUvxX# ] [ -B buffer_size ]

         [ -c count ] [ -C file_size ]
         [ -E spi@ipaddr algo:secret,... ]
         [ -F file ] [ -G rotate_seconds ] [ -i interface ]
         [ --immediate-mode ] [ -j tstamp_type ] [ -m module ]
         [ -M secret ] [ --number ] [ --print ] [ -Q in|out|inout ]
         [ -r file ] [ -s snaplen ] [ -T type ] [ --version ]
         [ -V file ] [ -w file ] [ -W filecount ] [ -y datalinktype ]
         [ -z postrotate-command ] [ -Z user ]
         [ --time-stamp-precision=tstamp_precision ]
         [ expression ]

根据tcpdump的用法将参数选项分为常用的和不常用的

常用:

  • -i:指定监听的网络接口
  • -c <数据包数目>: 收到指定的数据包数目后,tcpdump就会停止;
  • -C <文件大小>:用于判断用 -w 选项将报文写入的文件的大小是否超过这个值,如果超过了就新建文件(文件名后缀是1、2、3依次增加);
  • -w: 将原始数据包写入文件,而不是解析并打印出来;
  • -D:列出当前主机的所有网卡编号和名称,可以用于选项 -i;
  • -e:在每个转储行上打印链接级标题。 例如,这可以用于打印诸如以太网和IEEE 802.11之类的协议的MAC层地址;
  • -F <表达文件>:从指定的文件中读取表达式,忽略其它的表达式;
  • -n:显示ip,而不是主机名;
  • -l:使标准输出变为缓冲行形式,可以把数据导出到文件;
  • -r <数据包文件>:从指定的文件中读取包(这些包一般通过-w选项产生);
  • -t :不在每一行中输出时间戳;
  • -tt:在每一行中输出非格式化的时间戳;
  • -p:不要将接口置于混杂模式;
  • -q: 快速输出,仅列出少数的传输协议信息;
  • -f:将外部的Internet地址以数字的形式打印出来;
  • -N:不列出域名;
  • -O:不将数据包编码最佳化;
  • -S:用绝对而非相对数值列出TCP关联数;
  • -T <数据包类型>:将监听到的包直接解释为指定的类型的报文,常见的类型有rpc (远程过程调用)和snmp(简单网络管理协议);
  • -v:解析和打印时,产生(略多)详细输出;
  • -vv :更详细的输出。例如,从NFS回复数据包打印附加字段,SMB数据包完全解码;
  • -vvv:更详细的输出。例如,telnet SB … SE选项全部打印。使用-X Telnet选项也以十六进制打印;

不常用:

  • -A:以ASCII编码打印每个报文(不包括链路层的头),这对分析网页来说很方便;
  • -b:以ASDOT表示法而不是ASPLAIN表示法打印BGP数据包中的AS编号;
  • -B <缓冲区大小>:将操作系统捕获缓冲区大小设置为buffer_size,以KiB(1024字节)为单位;
  • -d:将匹配信息包的代码以人们能够理解的汇编格式给出;
  • -dd:将匹配信息包的代码以c语言程序段的格式给出;
  • -ddd:将匹配信息包的代码以十进制的形式给出;
  • -E:用spi@ipaddr algo:secret解密那些以addr作为地址,并且包含了安全参数索引值spi的IPsec ESP分组;
  • -G <rotate_seconds>: 如果指定,则每rotate_seconds秒旋转使用-w选项指定的转储文件。
  • -h:打印tcpdump和libpcap版本字符串,打印用法消息,然后退出。
  • -H:尝试检测的802.11s网状草案头;
  • -j <tstamp类型>:将捕获的时间戳类型设置为tstamp_type;
  • -J:列出接口支持的时间戳类型并退出;
  • -K:不要试图验证IP,TCP,UDP或校验;
  • -L:列出网络接口的已知数据链路;
  • -M:从文件模块加载SMI MIB模块定义;
  • -s <数据包大小>:指定抓包显示一行的宽度,-s0表示可按包长显示完整的包,经常和-A一起用,默认截取长度为60个字节,但一般ethernet MTU都是1500字节。所以,要抓取大于60字节的包时,使用默认参数就会导致包数据丢失;
  • -ttt:输出本行和前面一行之间的时间差。
  • -tttt:在每一行中输出由date处理的默认格式的时间戳。
  • -u:打印未解码的NFS句柄。
  • -U:如果未指定-w选项,或者如果指定了-w选项但是也指定了–print标志,则使打印的数据包输出``packet-buffered’’
  • -V:从文件中读取文件名列表。 如果文件是“ - ”,则使用标准输入。
  • -W:与-C选项一起使用时,这将限制创建的文件数量达到指定的数量,并从头开始覆盖文件,从而创建一个“旋转”缓冲区。 此外,它会将具有足够前导0的文件命名为支持最大文件数,从而允许它们正确排序。与-G选项一起使用时,这将限制创建的旋转转储文件的数量,在达到限制时退出状态0。如果与-C和-G一起使用,则当前将忽略-W选项,并且仅影响文件名。
  • -x:解析和打印时,除了打印每个数据包的标头外,还要以十六进制格式打印每个数据包的数据(减去其链接级别标题)。 将打印整个数据包或snaplen字节中较小的一个。 注意,这是整个链路层分组,因此对于填充(例如以太网)的链路层,当较高层分组比所需填充短时,也将打印填充字节。
  • -xx:解析和打印时,除了打印每个数据包的标头外,还要打印每个数据包的数据,包括其链接级别标题,以十六进制表示。
  • -X:解析和打印时,除了打印每个数据包的标题外,还要以十六进制和ASCII格式打印每个数据包的数据(减去其链接级别标题)。 这对于分析新协议非常方便。
  • -XX:解析和打印时,除了打印每个数据包的标头外,还要以十六进制和ASCII格式打印每个数据包的数据,包括其链接级别标题。
  • -y:设置要在将数据包捕获到datalinktype时使用的数据链接类型。
  • -z:与-C或-G选项一起使用,这将使tcpdump运行“ 命令文件 ”,其中文件是每次旋转后关闭的保存文件。例如,指定-z gzip或-z bzip2将使用gzip或bzip2压缩每个保存文件。
  • -Z:删除权限(如果是root)并将用户标识更改为用户,将组标识更改为主要用户组。这种行为默认是启用的(-Z tcpdump),可以通过-Z root来禁用。

三、举例

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

tcpdump -i enp3s0

2、过滤主机

  • 抓取所有经过enp3s0,目的或源地址是192.168.154.202的网络数据
tcpdump -i enp3s0 host 192.168.154.202
  • 指定源地址:192.168.154.202
tcpdump -i enp3s0 src host 192.168.154.202
  • 指定目标地址:192.168.154.202
tcpdump -i enp3s0 dst host 192.168.154.202

3、过滤端口

  • 抓取所有经过enp3s0,目的或源端口是22的网络数据
tcpdump -i enp3s0 port 22
  • 指定源端口
tcpdump -i enp3s0 src port 22
  • 指定目标端口
tcpdump -i enp3s0 dst port 22

4、网络过滤

tcpdump -i enp3s0 net 192.168
tcpdump -i enp3s0 src net 192.168
tcpdump -i enp3s0 dst net 192.168

5、协议过滤

tcpdump -i enp3s0 ip
tcpdump -i enp3s0 tcp
tcpdump -i enp3s0 udp
tcpdump -i enp3s0 arp
tcpdump -i enp3s0 rarp
tcpdump -i enp3s0 icmp

6、常用表达式

非 : ! or "not" (去掉双引号) 
且 : && or "and" 
或 : || or "or"

7、显示指定数量包

tcpdump -i enp3s0 -c 20

8、把抓取到的数据存放到文件中

tcpdump -i enp3s0 -c 20 -w http.cap

9、抓取主机192.168.154.202和192.168.154.203或者192.168.154.221的通信

tcpdump -i enp3s0 -n host 192.168.154.202 and \(192.168.154.203 or 192.168.154.221\)

10、抓取主机192.168.154.202与除主机192.168.154.201外通信的数据包

tcpdump -i enp3s0 -n host 192.168.154.202 and ! 192.168.154.201

11、抓取主机192.168.154.202与除主机192.168.154.201外通信的ip数据包

tcpdump -i enp3s0 ip host 192.168.154.202 and ! 192.168.154.201

12、抓取主机192.168.154.202在22端口接收到的数据包

tcpdump -i enp3s0 host 192.168.154.202 and src port 22

13、只抓 SYN 包

tcpdump -i enp3s0 'tcp[tcpflags] = tcp-syn'

14、抓 SYN, ACK

tcpdump -i enp3s0 'tcp[tcpflags] & tcp-syn != 0 and tcp[tcpflags] & tcp-ack != 0'

15、抓取端口大于1024的TCP数据包:

tcpdump -i enp3s0 'tcp[0:2] > 1024'

参考文章:

https://www.runoob.com/linux/linux-comm-tcpdump.html http://www.tcpdump.org/manpages/tcpdump.1.html
https://www.fujieace.com/linux/man/tcpdump-8.html
https://www.jianshu.com/p/a62ed1bb5b20