TCPdump-Linux抓包

目标

  1. 能使用基本指令抓取数据包
  2. 能读懂抓取到的数据

基本指令

TCPdump指令规则概括如下:

  • tcpdump 选项 过滤项

tcpdump教程

选项

  • -i 网卡:指定网卡
  • -w xxx.pcap:将结果写入文件中
  • -r xxx.pcap:从文件中读取数据,可以使用过滤语法获得输出
  • -s 0:截取前n个字节,为0则全部显示
  • -l:按行输出
  • -n/nn:不把ip/(ip与端口)转化为域名
  • -v/vv/vvv:产生详细/(更详细)的输出,比如TTL
  • -t/tt:每行输出不会输出时间/时间与时间戳
  • -X/XX:以16进制和ASCii形式输出每个包的数据(包括连接层)
  • -A:ASCii显示所有数据包(当不显示链路层头部信息)
  • -e:显示链路层头部信息

过滤项

限定数据包

1. proto

  • tcp、upd、icmp等
  • ip
    • ipv4:ip proto 6
    • ipv6:ip6 proto 6
  • 举例
    • tcpdump tcp:这会把ipv4和ipv6都包括

2. dir

后面必须跟主机地址host或端口port或net或portrange

  • src 过滤条件设定的来源地址
  • dsc 设定的是目标地址
  • src or dst
  • tcpdump src port 22

3.1 host

  • 指定 host ip 进行过滤
  • tcpdump host 192.168.10.100

3.2 net

  • 指定网段
  • tcpdump net 192.168.10.0/24
  • tcpdump net 192.168

3.3 port

  • 指定端口
  • tcpdump port 8088
  • tcpdump port 80 or port 8088

3.4 portrange

  • 指定多个连续端口
  • tcpdump portrange 8000-8080

4. 混合

  • not > and > or
  • 如果需要括号,由于括号是特殊字符,需要将过滤项使用引号包起来
  • proto和src相当于是后面type的修饰限定,只是proto可以单独使用,而src后面必须跟type
  • tcpdump tcp port 23 or src port 22
  • tcpdump eth0 'src net 192.168.0.0/24 and (tcp port 22 or udp port 53)'

5. 高级过滤

  1. 高级过滤技巧
  • 按 TCP 标志位过滤
    • proto [ expr:size ]:读取协议头部的第expr到expr+size字节

    • tcp的标志位在13字节,可以使用关键字tcpflags来替代,该字节每个比特代表不同标志,如下所示,所以可以按照tcp[tcpflags]的取值来决定报文类型

Bash 复制代码
# 以下都是抓取syn + ack 包,既第二次握手
tcpdump -i eth0 'tcp[tcpflags] == tcp-syn or tcp[tcpflags] == tcp-ack'
tcpdump -i eth0 'tcp[13] == 2 or tcp[13] == 16'
tcpdump -i eth0 "tcp[tcpflags] & (tcp-syn|tcp-ack) != 0"
tcpdump -i eth0 'tcp[13] = 18'
  • 按数据内容过滤
Bash 复制代码
tcpdump -A 'tcp port 80 | grep "GET /"'    # 抓取 HTTP GET 请求
  1. 实用场景示例
  • 抓取 HTTP 请求头
Bash 复制代码
tcpdump -i eth0 -A -s0 'tcp port 80' | egrep "Host:|User-Agent:"
  • 分析 DNS 查询
Bash 复制代码
tcpdump -n udp port 53                     # 显示原始 IP 和端口

数据格式

pcap 复制代码
21:26:49.013621 IP 172.20.20.1.15605 > 172.20.20.2.5920: Flags [P.], seq 49:97, ack 106048, win 4723, length 48
  1. 第一列:时分秒毫秒 21:26:49.013621
  2. 第二列:网络协议 IP
  3. 第三列:发送方的ip地址+端口号,其中172.20.20.1是 ip,而15605 是端口号
  4. 第四列:箭头 >, 表示数据流向
  5. 第五列:接收方的ip地址+端口号,其中 172.20.20.2 是 ip,而5920 是端口号
  6. 第六列:冒号
  7. 第七列:数据包内容,包括Flags 标识符,seq 号,ack 号,win 窗口,数据长度 length,其中 [P.] 表示 PUSH 标志位为 1且带了ack确认,更多标识符见下面,部分之间可组合,如[S.]:SYN + ACK(三次握手第二次报文)
    • [S] : SYN(开始连接)
    • [P] : PSH(推送数据)
    • [F] : FIN(结束连接)
    • [R] : RST(重置连接)
    • [.] : 只有ACK(纯确认报文)或还有URG紧急指针
相关推荐
钟离墨笺1 小时前
Go语言--2go基础-->map
开发语言·后端·golang
weixin_430750931 小时前
OpenMediaVault debian Linux安装配置企业私有网盘(三) 静态ip地址配置
linux·服务器·debian·nas·网络存储系统
403240731 小时前
[Jetson/Ubuntu 22.04] 解决挂载 exFAT 硬盘报错 “unknown filesystem type“ 及只读权限问题的终极指南
linux·运维·ubuntu
Tony Bai1 小时前
Go 语言的“魔法”时刻:如何用 -toolexec 实现零侵入式自动插桩?
开发语言·后端·golang
Source.Liu1 小时前
【沟通协作软件】使用 Rufus 制作 Ubuntu 启动盘的详细过程
linux·ubuntu
Love丶伊卡洛斯1 小时前
Ubuntu 部署 STUN服务端
linux·运维·ubuntu
梁洪飞2 小时前
通过链接文件和Start.S学习armv7
linux·arm开发·嵌入式硬件·学习·arm
DN金猿2 小时前
使用ubuntu安装nginx时报错
linux·nginx·ubuntu
小赵还有头发2 小时前
安装Ceres与glog
linux·学习·无人机·ceres·glog
负二代0.02 小时前
Linux下的网络管理
linux·网络