Linux Tcpdump抓包入门
一、Tcpdump简介
tcpdump
是一个在Linux系统上用于网络分析和抓包的强大工具。它能够捕获网络数据包并提供详细的分析信息,有助于网络管理员和开发人员诊断网络问题和监控网络流量。
-
安装部署
sh# 在Debian/Ubuntu上安装 sudo apt-get install tcpdump # 在CentOS/RHEL上安装 sudo yum install tcpdump
-
底层原理
1、tcpdump由C语言开发,主要功能通过libpcap库实现,而libpcap是linux平台下的一个网络数据包捕获功能包, 通过内核BPF技术实现数据过滤功能。tcpdump使用BPF虚拟机的指令集定义过滤器表达式,然后传递给内核,并由解释器执行,这使得包过滤可以在内核中进行,避免了向用户态进程复制全部数据包,从而提升数据包的过滤性能。tcpdump将包过滤指令注入到内核,返回按条件过滤的数据包,提供多种输出功能将抓取的报文格式化处理能力。 2、tcpdump的包过滤指令由BPF代码实现,通过对libpcap库的调用可以把一个输入输出的逻辑表达式变为BPF代码,实现在用户输入的命令行和BPF代码之间的转换。tcpdump 程序支持使用 -d参数来 dump 出过滤规则转化后的BPF指令字节码。 3、应用在接收报文的时候,硬件的硬中断首先触发内核的软中断,通过内核驱动程序进入网络设备层进行数据包的处理,然后数据包进入协议栈的网络层和传输层,最后被用户进程接收。而应用在发送报文时,首先经过内核的协议层,由邻居子系统实现L3层ip地址转化为L2层mac地址,然后进入网络设备层,数据包处理完成后,经驱动程序流转,最后由硬件将报文发出。tcpdump为了能抓取数据包,首先需要创建socket套接字,用于在应用系统接收和发送报文时获取抓取的数据包,然后将过滤条件也就是对应的BPF程序注入到内核网络设备层,获取过滤后的数据包后再进行格式化处理。
-
其他
二、Tcpdump命令参数
-
基本参数
-
设置不解析域名提升速度
sh-n:不把ip转化成域名,直接显示 ip,避免执行 DNS lookups 的过程,速度会快很多 -nn:不把协议和端口号转化成名字,速度也会快很多。 -N:不打印出host 的域名部分.。比如,,如果设置了此选现,tcpdump 将会打印'nic' 而不是 'nic.ddn.mil'. 将抓取到的数据包保存为文件,可以借助wireshark进行分析
-
从文件中读取包数据
shtcpdump icmp -r all.pcap
-
输出控制参数-显示内容
sh-v:产生详细的输出. 比如包的TTL,id标识,数据包长度,以及IP包的一些选项。同时它还会打开一些附加的包完整性检测,比如对IP或ICMP包头部的校验和。 -vv:产生比-v更详细的输出. 比如NFS回应包中的附加域将会被打印, SMB数据包也会被完全解码。 -vvv:产生比-vv更详细的输出。比如 telent 时所使用的SB, SE 选项将会被打印, 如果telnet同时使用的是图形界面,其相应的图形选项将会以16进制的方式打印出来
-
输出控制参数-显示时间
sh-t:在每行的输出中不输出时间 -tt:在每行的输出中会输出时间戳 -ttt:输出每两行打印的时间间隔(以毫秒为单位) -tttt:在每行打印的时间戳之前添加日期的打印(此种选项,输出的时间最直观)
-
输出控制参数-显示数据包头部
sh-x:以16进制的形式打印每个包的头部数据(但不包括数据链路层的头部) -xx:以16进制的形式打印每个包的头部数据(包括数据链路层的头部) -X:以16进制和 ASCII码形式打印出每个包的数据(但不包括连接层的头部),这在分析一些新协议的数据包很方便。 -XX:以16进制和 ASCII码形式打印出每个包的数据(包括连接层的头部),这在分析一些新协议的数据包很方便。
-
其他显示控制参数
sh-i:指定要过滤的网卡接口,如果要查看所有网卡,可以 -i any -Q:选择是入方向还是出方向的数据包,可选项有:in, out, inout,也可以使用 --direction=[direction] 这种写法 -q : 简洁地打印输出。即打印很少的协议相关信息, 从而输出行都比较简短 -c : 捕获 count 个包 tcpdump 就退出 -s : tcpdump 默认只会截取前 96 字节的内容,要想截取所有的报文内容,可以使用 -s number, number 就是你要截取的报文字节数,如果是 0 的话,表示截取报文全部内容。 -S : 使用绝对序列号,而不是相对序列号 -A : 显示格式为ASCII -C:file-size,tcpdump 在把原始数据包直接保存到文件中之前, 检查此文件大小是否超过file-size. 如果超过了, 将关闭此文件,另创一个文件继续用于原始数据包的记录. 新创建的文件名与-w 选项指定的文件名一致, 但文件名后多了一个数字.该数字会从1开始随着新创建文件的增多而增加. file-size的单位是百万字节(nt: 这里指1,000,000个字节,并非1,048,576个字节, 后者是以1024字节为1k, 1024k字节为1M计算所得, 即1M=1024 * 1024 = 1,048,576) -F:使用file 文件作为过滤条件表达式的输入, 此时命令行上的输入将被忽略.
-
-
过滤参数
-
指定ip地址过滤-host
shtcpdump host 192.168.10.100 # 根据源ip进行过滤 tcpdump -i eth2 src 192.168.10.100 # 根据目标ip进行过滤 tcpdump -i eth2 dst 192.168.10.200
-
基于网段进行过滤:net
shtcpdump net 192.168.10.0/24 # 根据源网段进行过滤 tcpdump src net 192.168 # 根据目标网段进行过滤 tcpdump dst net 192.168
-
基于端口进行过滤:port
shtcpdump port 8088 # 根据源端口进行过滤 tcpdump src port 8088 # 根据目标端口进行过滤 tcpdump dst port 8088 #同时指定两个端口 tcpdump port 80 or port 8088 #指定端口的范围 tcpdump portrange 8000-8080 tcpdump src portrange 8000-8080 tcpdump dst portrange 8000-8080
-
基于协议进行过滤:proto
proto
后面跟的 的关键词是固定的,只能是ip, ip6, arp, rarp, atalk, aarp, decnet, sca, lat, mopdl, moprc, iso, stp, ipx, or netbeui
这里面的其中一个。shtcpdump icmp #过滤IPV4数据包(友情提示:数字 6 表示的是 tcp 在ip报文中的编号。) tcpdump ip proto 6 tcpdump ip protochain 6
-
过滤条件基本语法
-
and
:所有的条件都需要满足,也可以表示为&&
-
or
:只要有一个条件满足就可以,也可以表示为||
-
not
:取反,也可以使用!
-
=
:判断二者相等 -
==
:判断二者相等 -
!=
:判断二者不相等 tcpdump 还提供了一些关键字的接口来方便我们进行判断 -
if
:表示网卡接口名、 -
proc
:表示进程名 -
pid
:表示进程 id -
svc
:表示 service class -
dir
:表示方向,in 和 out -
eproc
:表示 effective process name -
epid
:表示 effective process IDsh#过滤出源地址是1.1.1.1发往任意主机的3389端口的数据包 tcpdump src 1.1.1.1 and dst port 3389 #过滤出源地址是1.1.1.1发往任意主机的3389端口或者22端口的数据包 tcpdump 'src 1.1.1.1 and (dst port 3389 or 22)' #过滤来自进程名为 nc 发出的流经 en0 网卡的数据包,或者不流经 en0 的入方向数据包 tcpdump "( if=en0 and proc =nc ) || (if != en0 and dir=in)"
-
-
特殊过滤
-
根据 tcpflags 进行过滤
shtcpdump -i eth0 "tcp[tcpflags] & tcp-syn != 0"
-
基于包大小进行过滤
shtcpdump less 32 tcpdump greater 64 tcpdump <= 128
-
根据 mac 地址进行过滤
shtcpdump ether host [ehost] tcpdump ether dst [ehost] tcpdump ether src [ehost]
-
过滤广播/多播数据包
shtcpdump ether broadcast tcpdump ether multicast tcpdump ip broadcast tcpdump ip multicast tcpdump ip6 multicast
-
-
三、使用示例
-
查看网卡ens33,端口9093,协议udp的流量信息,要求显示流量详情
shtcpdump udp -i ens33 port 9093 -XX -vvv -nn
-
HTTP 请求头中提取 HTTP 的 User-Agent
shtcpdump -nn -A -s1500 -l | grep "User-Agent:"
-
抓取 HTTP GET 请求包
shtcpdump -vvAls0 | grep 'GET'
-
提取 HTTP 请求的主机名和路径
shtcpdump -s 0 -v -n -l | egrep -i "POST /|GET /|Host:"
-
将抓包信息保存到文件
shtcpdump -i eth0 -s 0 -n -w capture.pcap
-
分别抓取所有tcp、udp、icmp流量
shsudo tcpdump -i eth0 -s 0 -n 'tcp' sudo tcpdump -i eth0 -s 0 -n 'udp sudo tcpdump -i eth0 -s 0 -n 'icmp'
-
仅显示HTTP请求和响应的头信息:
shsudo tcpdump -i eth0 -A -s 0 'tcp port 80 and (tcp[13] & 8!=0)'
-
抓取指定主机(例如192.168.1.100)的HTTP流量,并保存到文件:
shtcpdump -i eth0 -s 0 -w http_traffic.pcap 'tcp and host 192.168.1.100 and (port 80 or port 443)'
四、参考资料
-
tcp flags通信标识
Flags 标识符 [S] : SYN(开始连接) [P] : PSH(推送数据) [F] : FIN (结束连接) [R] : RST(重置连接) [.] : 没有 Flag (意思是除上面四种类型外的其他情况,有可能是 ACK 也有可能是 URG)
-
官方连接