Linux下的网络抓包工具tcpdump原理介绍

0    106    2

Tags:

👉 本文共约12297个字,系统预计阅读时间或需47分钟。

纸上得来终觉浅,绝知此事要躬行。

tcpdump 就是根据使用者的定义对网络上的数据包进行截获的包分析工具。tcpdump 可以将网络中传送的数据包的“头”完全截获下来提供分析。它支持针对网络层、协议、主机、网络或端口的过滤,并提供 andornot 等逻辑语句来帮助你去掉无用的信息。

Linux下的网络抓包工具tcpdump原理介绍


1. 基本语法

主要介绍一下使用 tcpdump 工具时经常会使用到的参数!

过滤表达式可以给 tcpdump 传送过滤表达式来起到网络包过滤的作用,而且可以支持传入单个或多个过滤表达式。当你传入的过滤表达式含有 shell 通配符时,别忘使用单引号把表达式括起来,以防 shell 自作主张的把含有通配符的表达式先进行了解释和通配。我们可以使用 man pcap-filter 命令来查看帮助信息,你会发现,过滤表达式大体可以分成三种过滤条件,类型、方向和协议,这三种条件的搭配组合就构成。

[1] 过滤主机

  • 抓取所有经过 eth1,目的或源地址是 192.168.1.1 的网络数据
    • tcpdump -i eth1 host 192.168.1.1
  • 指定源地址
    • tcpdump -i eth1 src host 192.168.1.1
  • 指定目的地址
    • tcpdump -i eth1 dst host 192.168.1.1

[2] 过滤端口

  • 抓取所有经过 eth1,目的或源端口是 25 的网络数据
    • tcpdump -i eth1 port 25
  • 指定源端口
    • tcpdump -i eth1 src port 25
  • 指定目的端口
    • tcpdump -i eth1 dst port 25

[3] 网络过滤

  • tcpdump -i eth1 net 192.168
  • tcpdump -i eth1 src net 192.168
  • tcpdump -i eth1 dst net 192.168

[4] 协议过滤

  • tcpdump -i eth1 arp
  • tcpdump -i eth1 ip
  • tcpdump -i eth1 tcp
  • tcpdump -i eth1 udp
  • tcpdump -i eth1 icmp

[5] 常用表达式

    • ! or not
    • && or and
    • || or or
  • 抓取所有经过 eth1,目的地址是 192.168.1.254 或 192.168.1.200 端口是 80 的 TCP 数据
    • tcpdump -i eth1 '((tcp) and (port 80) and ((dst host 192.168.1.254) or (dst host 192.168.1.200)))'
  • 抓取所有经过 eth1,目标 MAC 地址是 00:01:02:03:04:05 的 ICMP 数据
    • tcpdump -i eth1 '((icmp) and ((ether dst host 00:01:02:03:04:05)))'
  • 抓取所有经过 eth1,目的网络是 192.168,但目的主机不是 192.168.1.200 的 TCP 数据
    • tcpdump -i eth1 '((tcp) and ((dst net 192.168) and (not dst host 192.168.1.200)))'


2. 协议包头

介绍常见的,协议的包头定义格式!

  • IP 数据报格式

Linux下的网络抓包工具tcpdump原理介绍

  • 以太网帧格式

Linux下的网络抓包工具tcpdump原理介绍

  • TCP 头格式

Linux下的网络抓包工具tcpdump原理介绍

  • UDP 头格式

Linux下的网络抓包工具tcpdump原理介绍

  • HTTP 协议格式

Linux下的网络抓包工具tcpdump原理介绍

Linux下的网络抓包工具tcpdump原理介绍


3. 包头过滤

主要介绍 TCP 和 UDP 协议包头的各个字段的对应含义以及抓取方式!

首先了解如何从包头过滤信息

IP ==> 只针对IPv4

IP选项设置了吗?

  • 一般的IP头是20 字节,但 IP 头有选项设置,不能直接从偏移 21 字节处读取数据。IP 头有个长度字段可以知道头长度是否大于 20 字节。

  • 通常第一个字节的二进制值是:01000101,分成两个部分

    = 4 表示 IP 版本,

    = 5 表示 IP 头 32 bit 的块数

    • 4 x 5 = 20 bytes
    • 5 x 32 bits = 160 bits
    • 160 bits / 2 = 20 bytes
  • 如果第一字节第二部分的值大于 5,那么表示头有IP 选项,下面介绍两种过滤方法

分片标记

  • 当发送端的MTU大于到目的路径链路上的MTU时就会被分片,权威的请参考《TCP/IP 详解》
  • Fragment Offset字段只有在分片的时候才使用
  • 要抓Flags中带DF位标记的不分片的包,第七字节的值应该是:01000000 = 64
  • tcpdump -i eth1 'ip[6] = 64',从0开始编号

抓分片包

  • 匹配

    分片包,第七字节的值应该是:

    • tcpdump -i eth1 'ip[6] = 32'
  • 最后分片包的开始 3 位是 0,但是有Fragment Offset字段

  • 匹配分片

    最后分片

    • tcpdump -i eth1 '((ip[6:2] > 0) and (not ip[6] = 64))'
  • 测试分片可以用如下命令

    • ping -M want -s 3000 192.168.1.1

匹配小 TTL

标签:

Avatar photo

小麦苗

学习或考证,均可联系麦老师,请加微信db_bao或QQ646634621

您可能还喜欢...

发表回复

嘿,我是小麦,需要帮助随时找我哦
  • 18509239930
  • 个人微信

  • 麦老师QQ聊天
  • 个人邮箱
  • 点击加入QQ群
  • 个人微店

  • 回到顶部