前言
大家好,这里是奇点linux,主要给大家分享linux、python、网络通信相关的IT知识平台。
今天给大家分享一个linux下的抓包神器tcpdump使用方法,通过简单通俗易懂的实战技巧,让你感受一下它的强大之处。大体上通过介绍其命令参数,带你进入抓包实战。同时也给大家分享几个日常工作中常用的有关tcpdump神器的招式,让你一招半式也能应付工作中的故障排查。
tcpdump前世今生
tcpdump是一个用于截取网络分组,并输出分组内容的工具。tcpdump凭借强大的功能和灵活的截取策略,使其成为类UNIX系统下用于网络分析和问题排查的首选工具。
tcpdump提供了源代码,公开了接口,因此具备很强的可扩展性,对于网络维护和入侵者都是非常有用的工具。tcpdump存在于基本的Linux系统 中,由于它需要将网络界面设置为混杂模式,普通用户不能正常执行,但具备root权限的用户可以直接执行它来获取网络上的信息。因此系统中存在网络分析工具主要不是对本机安全的威胁,而是对网络上的其他计算机的安全存在威胁。
说白了tcpdump就是linux下的一款抓包工具。通常用于故障诊断、网络分析,功能十分的强大。了解了tcpdump是何物之后,让我们通过实战去一一掀开它神秘的面纱。
tcpdump命令参数
tcpdump作为一个命令使用,其具有多样的参数选项。
tcpdump基本命令如下:
tcpdump [option] [proto] [dir] [type]
其中:
1、option:即可选参数,可以指定相关参数,输出特定信息。
可选参数很多,主要有以下:
-A 以ASCII格式打印出所有分组,并将链路层的头最小化。
-c 在收到指定的数量的分组后,tcpdump就会停止。
-C 在将一个原始分组写入文件之前,检查文件当前的大小是否超过了参数file_size 中指定的大小。如果超过了指定大小,则关闭当前文件,然后在打开一个新的文件。参数 file_size 的单位是兆字节(是1,000,000字节,而不是1,048,576字节)。
-d 将匹配信息包的代码以人们能够理解的汇编格式给出。
-dd 将匹配信息包的代码以c语言程序段的格式给出。
-ddd 将匹配信息包的代码以十进制的形式给出。
-D 打印出系统中所有可以用tcpdump截包的网络接口。
-e 在输出行打印出数据链路层的头部信息。
-E 用spi@ipaddr algo:secret解密那些以addr作为地址,并且包含了安全参数索引值spi的IPsec ESP分组。
-f 将外部的Internet地址以数字的形式打印出来。
-F 从指定的文件中读取表达式,忽略命令行中给出的表达式。
-i 指定监听的网络接口。
-l 使标准输出变为缓冲行形式,可以把数据导出到文件。
-L 列出网络接口的已知数据链路。
-m 从文件module中导入SMI MIB模块定义。该参数可以被使用多次,以导入多个MIB模块。
-M 如果tcp报文中存在TCP-MD5选项,则需要用secret作为共享的验证码用于验证TCP-MD5选选项摘要(详情可参考RFC 2385)。
-b 在数据-链路层上选择协议,包括ip、arp、rarp、ipx都是这一层的。
-n 不把网络地址转换成名字。
-nn 不进行端口名称的转换。
-N 不输出主机名中的域名部分。例如,‘nic.ddn.mil‘只输出’nic‘。
-t 在输出的每一行不打印时间戳。
-O 不运行分组分组匹配(packet-matching)代码优化程序。
-P 不将网络接口设置成混杂模式。
-q 快速输出。只输出较少的协议信息。
-r 从指定的文件中读取包(这些包一般通过-w选项产生)。
-S 将tcp的序列号以绝对值形式输出,而不是相对值。
-s 从每个分组中读取最开始的snaplen个字节,而不是默认的68个字节。
-T 将监听到的包直接解释为指定的类型的报文,常见的类型有rpc远程过程调用)和snmp(简单网络管理协议;)。
-t 不在每一行中输出时间戳。
-tt 在每一行中输出非格式化的时间戳。
-ttt 输出本行和前面一行之间的时间差。
-tttt 在每一行中输出由date处理的默认格式的时间戳。
-u 输出未解码的NFS句柄。
-v 输出一个稍微详细的信息,例如在ip包中可以包括ttl和服务类型的信息。
-vv 输出详细的报文信息。
-w 直接将分组写入文件中,而不是不分析并打印出来。
2、proto:即类过滤器,指定过滤某种协议的数据包。如tcp、udp、ip、arp、icmp等。
3、dir:即类过滤器,根据数据流向进行过滤,可识别的关键字有src、dst、 src or dst等。
4、type:即类过滤器,可识别的关键字有:host, net, port, port range等,这些关键字后边需要再接具体参数。
tcpdump安装
1、linux系统默认没有安装tcpdump工具的,所以需要我们自己安装,这里我通过yum进行安装。
yum -y install tcpdump
2、安装完成,通过tcpdump -h查看它相关版本信息。
[root@haodaolinux1 ~]# tcpdump -h
tcpdump version 4.9.2
libpcap version 1.5.3
OpenSSL 1.0.2k-fips 26 Jan 2017
Usage: tcpdump [-aAbdDefhHIJKlLnNOpqStuUvxX#] [ -B size ] [ -c count ]
[ -C file_size ] [ -E algo:secret ] [ -F file ] [ -G seconds ]
[ -i interface ] [ -j tstamptype ] [ -M secret ] [ --number ]
[ -Q|-P in|out|inout ]
[ -r file ] [ -s snaplen ] [ --time-stamp-precision precision ]
[ --immediate-mode ] [ -T type ] [ --version ] [ -V file ]
[ -w file ] [ -W filecount ] [ -y datalinktype ] [ -z postrotate-command ]
[ -Z user ] [ expression ]
[root@haodaolinux1 ~]#
tcpdump实战
下面通过常见的具体抓包实例,让你加深其使用技巧。
1、常用抓包命令1
tcpdump -i eno16777736
该命令参数表示抓取网口eno16777736上所有的数据包。
2、常用抓包命令2
tcpdump -i eno16777736 -s 0 -w hao1.cap
该命令参数大概意思是针对网口eno16777736抓取不限制大小的报文,保存为文件hao1.cap
3、常用抓包命令3
tcpdump -ni eno16777736 -c 10 dst host 192.168.3.165
该命令参数表示抓取网口eno16777736发往目的主机192.168.3.165的数据包,并且抓取10个包后,自动停止抓包。
4、常用抓包命令4
tcpdump -r hao1.cap
该命令是读取抓包文件hao1.cap,结果如下:
[root@haodaolinux1 ~]# tcpdump -r hao1.cap
reading from file hao1.cap, link-type EN10MB (Ethernet)
15:22:42.826813 IP 192.168.3.199.ssh > 192.168.3.165.8162: Flags [P.], seq 211541184:211541316, ack 3983093332, win 255, length 132
15:22:42.862614 IP 192.168.3.165.armtechdaemon > 192.168.3.199.ssh: Flags [.], ack 546175073, win 16293, length 0
15:22:43.026135 IP 192.168.3.165.8162 > 192.168.3.199.ssh: Flags [.], ack 132, win 16425, length 0
15:22:43.609384 IP 192.168.3.199 > 183.232.231.172: ICMP echo request, id 9275, seq 7, length 64
15:22:43.621431 IP 183.232.231.172 > 192.168.3.199: ICMP echo reply, id 9275, seq 7, length 64
15:22:43.621610 IP 192.168.3.199.ssh > 192.168.3.165.armtechdaemon: Flags [P.], seq 1:133, ack 0, win 255, length 132
15:22:43.821278 IP 192.168.3.165.armtechdaemon > 192.168.3.199.ssh: Flags [.], ack 133, win 16260, length 0
15:22:44.610696 IP 192.168.3.199 > 183.232.231.172: ICMP echo request, id 9275, seq 8, length 64
15:22:44.624632 IP 183.232.231.172 > 192.168.3.199: ICMP echo reply, id 9275, seq 8, length 64
15:22:44.624842 IP 192.168.3.199.ssh > 192.168.3.165.armtechdaemon: Flags [P.], seq 133:265, ack 0, win 255, length 132
15:22:44.824397 IP 192.168.3.165.armtechdaemon > 192.168.3.199.ssh: Flags [.], ack 265, win 16227, length 0
5、常用抓包命令5
tcpdump -i eno16777736 host 183.232.231.172 and tcp port 80
即表示抓取主机183.232.231.172所有在TCP 80端口的数据包。
6、常用抓包命令6
tcpdump -i eno16777736 host 183.232.231.172 and dst port 80
即表示抓取HTTP主机183.232.231.172在80端口接收到的数据包。
7、常用抓包命令7
tcpdump -i eno16777736 port 80
即表示抓取所有经过eno16777736,目的或源端口是80的网络数据。
8、常用抓包命令8
tcpdump -i eno16777736 icmp
即表示过滤出icmp包。如下图所示:
结语
以上这些抓包命令只是日常工作中比较常见的,其还可以根据相关选项参数组合进行抓包,这里就不一一举例了。执行抓包命令后,如果不指定保存抓包文件,即报文直接从控制台输出,通过ctrl+c组合键停止抓包。保存的抓包文件是可以导出到windows环境,通过Wireshark工具打开的。