tcpdump使用
tcpdump命令行的使用
核心参数
命令的基本形式: tcpdump option proto dir type
tcpdump | option | proto | dir | type |
---|---|---|---|---|
-aAbdDefhHIJGLnNK… | tcp, udp, icmp ip, ip6 arp, rarp ether, wlan | src dst , src or dst | host net port portrange |
- option可选参数
- proto类过滤器: 根据协议进行过滤,可识别的关键字有: tcp, udp, icmp, ip, ip6, arp, rarp, ether, wlan, fddi, tr, decnet
- type类过滤器:根据IP地址、端口等过滤,可识别的关键字有: host, net, port, portrange, 这些参数后面需要再跟参数
- direction类过滤器: 根据数据流向进行过滤,可识别的关键字有: src, dst, 也可使用逻辑运算符组合src or dst
proto、type、direction称为常规过滤器,option可选参数过滤器
理解输出
输出内容结构
tcpdump -i ens33 dst 192.168.1.191
17:53:19.492779 IP 192.168.1.90.52360 > localhost.localdomain.8015: Flags [P.], seq 2501046959:2501046992, ack 4084560749, win 512, length 33
- 第一列: 时分秒毫秒17:53:19.492779
- 第二列: 网络协议IP
- 第三列: 发送方ip地址+端口号
- 第四列: 箭头>, 表示数据流向
- 第五列: 接收方ip地址+端口号
- 第六列: 冒号
- 第七列: 数据内容,包括Flags标识符,seq号,ack号,win窗口(接收窗口),数据长度length
Flags标识符
TCP报文有6个控制位
- URG, 紧急位, 报文中有紧急数据,需要尽快传送,不用在缓存队列中排队
- ACK, 控制位
- PSH, 推送位, 接收方尽快交付接收应用进程,不再等到缓存填满再向上交付
- RST, 复位, 连接出现严重差错,必须释放连接,然后再重新建立连接
- SYN, 同步位
- FIN, 终止位
对应结果中的Flags标识,有以下几种:
[S]: SYN(建立连接)
[P]: PSH(推送数据)
[F]: FIN(结束连接)
[R]: RST(重置连接)
[.]: 没有Flag(意思是上面四种控制位都为0,另外两位的ACK和URG将做特殊显示)
常规过滤
ip地址,host
tcpdump host 192.168.1.100
网段,net
tcpdump net 192.168.10.0/24
端口, port
tcpdump port 8000
tcpdump port 8000 or 9000
tcpdump portrange 8000-9000
tcpdump tcp port http # 常用协议可以用协议名指代端口
协议, proto
常见的网络协议有:tcp, udp, icmp, http, ip,ipv6 等
若你只想查看 icmp 的包,可以直接这样写
tcpdump icmp
protocol 可选值:ip, ip6, arp, rarp, atalk, aarp, decnet, sca, lat, mopdl, moprc, iso, stp, ipx, or netbeui
根据IP协议的版本进行过滤
ip协议有ipv4和ipv6,如果想查看使用ipv4的tcp包,则使用
tcpdump ‘ip proto tcp’
or
tcpdump ip proto 6
or
tcpdump ‘ip protochain tcp’
or
tcpdump ip protochain 6
如果想查看使用ipv6的tcp包,则使用
tcpdump ‘ip6 proto tcp’
or
tcpdump ‘ip6 proto 6’
or
tcpdump ‘ip6 protochain tcp’
or
tcpdump ip6 protochain 6
跟在 proto 和 protochain 后面的如果是 tcp, udp, icmp ,那么过滤器需要用引号包含,这是因为 tcp,udp, icmp 是 tcpdump 的关键字。
可选参数
不解析域名
-n:不把ip转化成域名,直接显示 ip,避免执行 DNS lookups 的过程,速度会快很多
-nn:不把协议和端口号转化成名字,速度也会快很多。
-N:不打印出host 的域名部分.。比如,,如果设置了此选现,tcpdump 将会打印’nic’ 而不是 ‘nic.ddn.mil’.
结果输出到文件
使用 -w 参数后接一个以 .pcap 后缀命令的文件名,就可以将 tcpdump 抓到的数据保存到文件中。
tcpdump icmp -w icmp_catch.pcap
从文件中读取
与-w写入对应的读取操作
tcpdump icmp -r all.pcap
控制详细内容输出
-v:产生详细的输出.比如包的TTL,id标识,数据包长度,以及IP包的一些选项。同时它还会打开一些附加的包完整性检测,比如对IP或ICMP包头部的校验和。
-vv:产生比-v更详细的输出. 比如NFS回应包中的附加域将会被打印, SMB数据包也会被完全解码。(摘自网络,目前我还未使用过)
-vvv:产生比-vv更详细的输出。比如 telent 时所使用的SB, SE 选项将会被打印, 如果telnet同时使用的是图形界面,其相应的图形选项将会以16进制的方式打印出来(摘自网络,目前我还未使用过)
控制时间显示
-t:在每行的输出中不输出时间
-tt:在每行的输出中会输出时间戳
-ttt:输出每两行打印的时间间隔(以毫秒为单位)
-tttt:在每行打印的时间戳之前添加日期的打印(此种选项,输出的时间最直观)
显示数据包的头部
-x:以16进制的形式打印每个包的头部数据(但不包括数据链路层的头部)
-xx:以16进制的形式打印每个包的头部数据(包括数据链路层的头部)
-X:以16进制和 ASCII码形式打印出每个包的数据(但不包括连接层的头部),这在分析一些新协议的数据包很方便。
-XX:以16进制和 ASCII码形式打印出每个包的数据(包括连接层的头部),这在分析一些新协议的数据包很方便。
指定网卡
-i:指定要过滤的网卡接口,如果要查看所有网卡,可以 -i any
过滤特定流向
-Q: 选择是入方向还是出方向的数据包,可选项有:in, out, inout,也可以使用 --direction=[direction] 这种写法
其他常用参数
-A:以ASCII码方式显示每一个数据包(不显示链路层头部信息). 在抓取包含网页数据的数据包时, 可方便查看数据
-l : 基于行的输出,便于你保存查看,或者交给其它工具分析
-q : 简洁地打印输出。即打印很少的协议相关信息, 从而输出行都比较简短.
-c : 捕获 count 个包 tcpdump 就退出
-s : tcpdump 默认只会截取前 96 字节的内容,要想截取所有的报文内容,可以使用 -s number, number 就是你要截取的报文字节数,如果是 0 的话,表示截取报文全部内容。
-S : 使用绝对序列号,而不是相对序列号
-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 文件作为过滤条件表达式的输入, 此时命令行上的输入将被忽略.
对输出的内容进行控制
-D : 显示所有可用网络接口的列表
-e : 每行的打印输出中将包括数据包的数据链路层头部信息
-E : 揭秘IPSEC数据
-L :列出指定网络接口所支持的数据链路层的类型后退出
-Z:后接用户名,在抓包时会受到权限的限制。如果以root用户启动tcpdump,tcpdump将会有超级用户权限。
-d:打印出易读的包匹配码
-dd:以C语言的形式打印出包匹配码.
-ddd:以十进制数的形式打印出包匹配码
过滤规则组合
- and:所有的条件都需要满足,也可以表示为 &&
- or:只要有一个条件满足就可以,也可以表示为 ||
- not:取反,也可以使用 !
tcpdump src 10.5.2.3 and dst port 3389 # 源地址10.5.2.3,目的端口3389
tcpdump ‘src 10.0.2.4 and (dst port 3389 or 22)’ # 使用括号时需要加引号
单个过滤器里,常常会判断一条件是否成立,这时候,就要使用下面两个符号
- =:判断二者相等
- !=:判断二者不相等
当你使用这两个符号时,tcpdump 还提供了一些关键字的接口来方便我们进行判断,比如 - if:表示网卡接口名、
- proc:表示进程名
- pid:表示进程 id
- svc:表示 service class
- dir:表示方向,in 和 out
- eproc:表示 effective process name
- epid:表示 effective process ID
要过滤来自进程名为 nc 发出的流经 en0 网卡的数据包,或者不流经 en0 的入方向数据包,可以这样子写
tcpdump “(proc=nc and if=en0) || (if !=en0 and dir=in)”
特殊过滤
常用案例
tcpdump -i ens33 -nnvvS src 192.168.1.241 or dst 192.168.1.241 -w /tmp/zhang.cap
我的手机
tcpdump -i ens33 -nnvvS src 192.168.1.102 or dst 192.168.1.108
tcpdump -i ens33 -nnvvS src 192.168.1.241 or dst 192.168.1.241 -w /tmp/zhang.cap
tcpdump -i ens33 port 8015
tcpdump -i ens33 -nnS '(src 192.168.1.241 and dst port 8015) or (src port 8015 and dst 192.168.1.241)'
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 10年+ .NET Coder 心语 ── 封装的思维:从隐藏、稳定开始理解其本质意义
· 地球OL攻略 —— 某应届生求职总结
· 周边上新:园子的第一款马克杯温暖上架
· Open-Sora 2.0 重磅开源!
· 提示词工程——AI应用必不可少的技术