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紧急指针
相关推荐
这里有鱼汤25 分钟前
终于有人把AI用在炒股上了,而且还是开源的!实测太震撼了
后端·python
菜鸟谢41 分钟前
MQTT.Net
后端
excel41 分钟前
Node.js + TensorFlow.js(GPU 加速)完整安装指南(Windows 本地编译版)
前端·后端
十五年专注C++开发43 分钟前
通信中间件 Fast DDS(一) :编译、安装和测试
linux·c++·windows·中间件·cmake·vcpkg
唐青枫1 小时前
玩转 Systemd Unit 文件:进阶技巧与服务覆盖实战
linux
东阳马生架构1 小时前
Dubbo源码—9.Consumer端的主要模块下
后端
databook1 小时前
VS Code 中把「自己部署的 Coder 模型」变成 AI 编程助手
后端·openai·ai编程
用户6120414922131 小时前
C语言做的停车场车牌识别系统
c语言·后端·图像识别
yuxb731 小时前
Ansible 实操笔记:Playbook 与变量管理
linux·运维·笔记
Victor3561 小时前
MySQL(197)如何监控MySQL?
后端