由于在测试中会需要抓取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.cnblogs.com/chenpingzhao/p/9108570.html
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