tcpdump是一款 网络数据采集分析工具、嗅探工具,也就是Linux中的网络抓包工具,类似与windows中的wireshark等工具,但是wireshark有图形化界面,而tcpdump 则只有命令行。
语法
tcpdump (选项)
选项
-a:尝试将网络和广播地址转换成名称
-c<数据包数目>:收到指定的数据包数目后,就停止进行倾倒操作
-d:把编译过的数据包编码转换成可阅读的格式,并倾倒到标准输出
-dd:把编译过的数据包编码转换成C语言的格式,并倾倒到标准输出
-ddd:把编译过的数据包编码转换成十进制数字的格式,并倾倒到标准输出
-e:在每列倾倒资料上显示连接层级的文件头
-f:用数字显示网际网络地址
-F<表达文件>:指定内含表达方式的文件
-i<网络界面>:使用指定的网络截面送出数据包
-l:使用标准输出列的缓冲区
-n:不把主机的网络地址转换成名字
-N:不列出域名
-O:不将数据包编码最佳化
-p:不让网络界面进入混杂模式
-q :快速输出,仅列出少数的传输协议信息
-r<数据包文件>:从指定的文件读取数据包数据
-s<数据包大小>:设置每个数据包的大小
-S:用绝对而非相对数值列出TCP关联数
-t:在每列倾倒资料上不显示时间戳记
-tt: 在每列倾倒资料上显示未经格式化的时间戳记
-T<数据包类型>:强制将表达方式所指定的数据包转译成设置的数据包类型
-v:详细显示指令执行过程
-vv:更详细显示指令执行过程
-x:用十六进制字码列出数据包资料
-w<数据包文件>:把数据包数据写入指定的文件
输出内容详解
21:45:11.363006 IP 192.168.237.128:15605 > 192.168.237.1.11671: Flags [P.], seq 27004:27152, ack 37, win 261, length 148
第一列:时分秒毫秒 21:45:11.363006
第二列:网络协议 IP
第三列:发送方的ip地址+端口号,其中 192.168.237.128 是 ip,而 15605 是端口号
第四列:箭头 >, 表示数据流向
第五列:接收方的ip地址+端口号,其中 192.168.237.1 是 ip,而 11671 是端口号
第六列:符号(:),无特殊意义
第七列:数据包内容,包括Flags 标识符,seq 号,ack 号,win 窗口,数据长度 length,其中 [P.] 表示 PUSH 标志位为 1
Flags 标识符
[S] :SYN(开始连接)
[P] :PSH(推送数据)
[F] :FIN (结束连接)
[R] :RST(重置连接)
[.] : 没有 Flag (意思是除上面四种类型外的其他情况,有可能是 ACK 也有可能是 URG)
常用格式
1、指定监视某个网络接口(网卡)的数据包(Linux(centos7)默认监控的是ens33)
tcpdump -i ens36
2、根据IP地址来过滤
host 指定IP地址过滤
src 指定源IP过滤
dst 地址目标IP过滤
tcpdump -i ens36 host 192.168.2.20 # 指定IP
tcpdump -i ens36 src 192.168.2.20 # 指定源IP
tcpdump -i ens36 dst 192.168.2.1 # 指定目的IP
3、根据网段进行过滤
net 指定一个网段
src net 指定源网段
dst net 指定目的网段
tcpdump -i ens36 net 192.168.2.0/24 # 指定网段
tcpdump -i ens36 src net 192.168.2.0/24 # 指定源网段
tcpdump -i ens36 dst net 192.168.2.0/24 # 指定目标网段
4、根据端口进行过滤
port 端口号 直接指定一个端口
src port 端口号 指定源端口
dst port 端口号 指定目的端口
port 端口号 or port 端口号 同时指定两个端口号,可以使用多个 or 来指定多个端口号(可以简写为 port 端口号 or 端口号)
port 端口号-端口号 可以指定一段连续的端口号
port 协议类型 有些协议有默认的端口号,可以直接使用协议名,而不用写具体端口号
tcpdump -i ens36 port 80 直接指定一个端口号
tcpdump -i ens36 src port 80 指定源端口
tcpdump -i ens36 dst port 80 指定目的端口
tcpdump -i ens36 port 80 port 8080 同时指定多个端口
tcpdump -i ens36 port 80 or 8080
tcpdump -i ens36 port 8000-8080 指定一段端口号
tcpdump -i ens36 port http 指定有默认端口的协议
5、 根据协议过滤
常见的网络协议有:tcp, udp, icmp, http, ip,ipv6 等
tcpdump protocol
protocol 可选值:ip, ip6, arp, rarp, atalk, aarp, decnet, sca, lat, mopdl, moprc, iso, stp, ipx, or netbeui
# 查看icmp包
tcpdump icmp
6、将结果输入到文件
使用 tcpdump 工具抓到包后,往往需要再借助其他的工具进行分析,比如常见的 wireshark
而要使用wireshark ,我们得将 tcpdump 抓到的包数据生成到文件中,最后再使用 wireshark 打开它即可
使用 -w
参数后接一个以 .pcap
后缀命令的文件名,就可以将 tcpdump 抓到的数据保存到文件中
tcpdump icmp -w test.pcap
7、从文件中读取数据包
使用 -w
是写入数据到文件,而使用 -r
是从文件中读取数据
读取后,我们照样可以使用上述的过滤器语法进行过滤分析
tcpdump icmp -r test.pcap
8、过滤规则组合
a、多条件组合过滤
and:所有的条件都需要满足,也可以表示为 &&
or:只要有一个条件满足就可以,也可以表示为 ||
not:取反,也可以使用 !
# 抓取一个来自192.168.237.136,发往任意主机的8080端口的包
tcpdump src 192.168.237.136 and dst port 8080
# 当你在使用多个过滤器进行组合时,有可能需要用到括号(可以用来提高优先级),而括号在 shell 中是特殊符号,因为你需要使用引号将其包含
tcpdump 'src 192.168.237.136 and (dst port 8080 or 22)'
b、单个过滤器里,常常会判断一条件是否成立
=:判断二者相等
==:判断二者相等
!=:判断二者不相等
当你使用这些符号的时候,tcpdump 还提供了一些关键字的接口来方便我们进行判断,比如
if:表示网卡接口名、
proc:表示进程名
pid:表示进程 id
svc:表示 service class
dir:表示方向,in 和 out
eproc:表示 effective process name
epid:表示 effective process ID
# 过滤来自进程名为 nc 发出的流经 en0 网卡的数据包,或者不流经 en0 的入方向数据包
tcpdump "( if=en0 and proc =nc ) || (if != en0 and dir=in)"