Linux tcpdump详解

目录

  • 前言:BPF伯克利包过滤器介绍
  • 1.BPF语法(tcpdump语法)
  • 2.逻辑运算符
  • 3.常用的原子条件
      • [1. 协议相关的原子条件](#1. 协议相关的原子条件)
      • [2. 地址相关的原子条件](#2. 地址相关的原子条件)
      • [3. 端口相关的原子条件](#3. 端口相关的原子条件)
      • [4. 网络层和链路层(mac地址)原子条件](#4. 网络层和链路层(mac地址)原子条件)
      • [5. 广播和多播](#5. 广播和多播)
      • [6. VLAN 相关的原子条件](#6. VLAN 相关的原子条件)
      • [7. 特定字段大小过滤](#7. 特定字段大小过滤)
      • [8. 基于TCP标记的过滤](#8. 基于TCP标记的过滤)
      • [9. ICMP 类型过滤](#9. ICMP 类型过滤)
      • [10. MPLS 过滤](#10. MPLS 过滤)
      • [11. PPPoE 过滤](#11. PPPoE 过滤)
      • [12. ISO OSI 过滤](#12. ISO OSI 过滤)
      • [13. Token Ring 过滤](#13. Token Ring 过滤)
      • [14. 带宽过滤](#14. 带宽过滤)
      • @组合示例
  • 4.tcpdump常用选项
  • @综合示例
    • 详解篇
      • [示例 1:捕获特定主机的 HTTP GET 请求并保存到文件](#示例 1:捕获特定主机的 HTTP GET 请求并保存到文件)
      • [示例 2:捕获 VLAN 10 中所有的 TCP SYN 数据包,并显示详细信息](#示例 2:捕获 VLAN 10 中所有的 TCP SYN 数据包,并显示详细信息)
      • [示例 3:捕获所有入方向的 ICMP 数据包,并显示数据包内容](#示例 3:捕获所有入方向的 ICMP 数据包,并显示数据包内容)
      • [示例 4:捕获所有源 MAC 地址为特定地址的 TCP FIN 数据包](#示例 4:捕获所有源 MAC 地址为特定地址的 TCP FIN 数据包)
      • [示例 5:捕获并显示特定 IP 地址的 UDP 流量,包括十六进制内容](#示例 5:捕获并显示特定 IP 地址的 UDP 流量,包括十六进制内容)
      • [示例 6:捕获 HTTP POST 请求,并显示数据包内容](#示例 6:捕获 HTTP POST 请求,并显示数据包内容)
      • [示例 7:捕获特定端口范围的 UDP 流量,并设置捕获缓冲区大小](#示例 7:捕获特定端口范围的 UDP 流量,并设置捕获缓冲区大小)
      • [示例 8:捕获所有 TCP 连接终止过程中的数据包(包括 FIN 和 RST 数据包)](#示例 8:捕获所有 TCP 连接终止过程中的数据包(包括 FIN 和 RST 数据包))
    • 简洁篇
      • [示例 1:捕获 HTTP 和 HTTPS 流量并保存到文件](#示例 1:捕获 HTTP 和 HTTPS 流量并保存到文件)
      • [示例 2:捕获特定网络内的所有 TCP 数据包,并显示详细信息](#示例 2:捕获特定网络内的所有 TCP 数据包,并显示详细信息)
      • [示例 3:捕获并解密 IPsec 流量](#示例 3:捕获并解密 IPsec 流量)
      • [示例 4:捕获并实时显示所有包含特定字符串的 HTTP 流量](#示例 4:捕获并实时显示所有包含特定字符串的 HTTP 流量)
      • [示例 5:捕获所有带有 SYN 和 ACK 标志的 TCP 数据包](#示例 5:捕获所有带有 SYN 和 ACK 标志的 TCP 数据包)
      • [示例 6:捕获特定 VLAN 中的 ICMP 数据包,并将输出显示为 ASCII 格式](#示例 6:捕获特定 VLAN 中的 ICMP 数据包,并将输出显示为 ASCII 格式)
      • [示例 7:捕获特定端口范围的 UDP 流量,并设置捕获缓冲区大小](#示例 7:捕获特定端口范围的 UDP 流量,并设置捕获缓冲区大小)
      • [示例 8:捕获并显示时间戳差异的 TCP 数据包](#示例 8:捕获并显示时间戳差异的 TCP 数据包)
      • [示例 9:捕获来自特定主机的 DNS 查询和响应](#示例 9:捕获来自特定主机的 DNS 查询和响应)
      • [示例 10:捕获所有广播和多播数据包,并显示链路层信息](#示例 10:捕获所有广播和多播数据包,并显示链路层信息)
  • 总结

前言:BPF伯克利包过滤器介绍

维基百科:https://zh.wikipedia.org/wiki/BPF Berkeley Packet Filter (BPF)

是一种用于捕获和过滤网络数据包的技术,广泛用于网络分析工具中 BPF 的主要应用
1. 网络数据包过滤   tcpdump 和 Wireshark

使用 BPF 来捕获和过滤网络数据包,只显示感兴趣的流量。 tcpdump 'tcp port 80'
2. 入侵检测和防御 Snort 和 Suricata:使用 BPF 过滤数据包,提高入侵检测系统的效率。 snort -i eth0 'tcp port 80'

  1. 高性能网络 pfSense 和 Open vSwitch:使用 BPF 进行流量监控和优化网络性能。 ovs-vsctl -- set Bridge br0 netflow=@nf -- --id=@nf create NetFlow

targets="127.0.0.1:2055" active-timeout=30

  1. eBPF 的扩展应用 eBPF(extended BPF)是 BPF 的扩展版本,提供了更强大的功能和更广泛的应用场景。 系统性能监控和调试 :bpftrace:用于实时系统跟踪和性能分析。 bpftrace -e

'kprobe:do_sys_open { printf("%s\n", str(arg1)); }'
网络安全和可观察性 :Cilium:用于 Kubernetes 环境的网络安全和可观察性。 cilium policy

trace --src-ip 10.0.0.1 --dst-ip 10.0.0.2 运行时安全检测 :Falco:利用 eBPF

来检测和响应系统中的异常行为。 falco -r rules/falco_rules.yaml -c

/etc/falco/falco.yaml


1.BPF语法(tcpdump语法)

bash 复制代码
tcpdump [options] [filter expression]
  • options:tcpdump 的命令行选项,用于控制捕获行为。
  • filter expression:BPF 过滤表达式,用于定义数据包过滤条件。
  • 过滤表达式由一个或多个原子条件和逻辑运算符组成,用于定义哪些数据包应该被捕获。
    • 常见原子条件:协议、主机&网络(源目地址&源目网络)、端口...

这里和正常的Linux shell语法不一致



2.逻辑运算符

通过组合这些原子条件和逻辑运算符,可以构建复杂的过滤表达式。逻辑运算符包括:

  • and 或 &&:逻辑与运算。
  • or 或 ||:逻辑或运算。
  • not 或 !:逻辑非运算。


3.常用的原子条件

在 tcpdump 的过滤表达式中,除了前面提到的协议、主机、网络和端口等基本原子条件外,还有许多其他原子条件可以帮助你更精确地捕获特定类型的数据包。以下是一些常用的原子条件及其详细解释:

1. 协议相关的原子条件

  • ip:捕获所有 IPv4 数据包。

    sh 复制代码
    tcpdump ip
  • ip6:捕获所有 IPv6 数据包。

    sh 复制代码
    tcpdump ip6
  • tcp:捕获所有 TCP 数据包。

    sh 复制代码
    tcpdump tcp
  • udp:捕获所有 UDP 数据包。

    sh 复制代码
    tcpdump udp
  • icmp:捕获所有 ICMP 数据包。

    sh 复制代码
    tcpdump icmp
  • icmp6:捕获所有 ICMPv6 数据包。

    sh 复制代码
    tcpdump icmp6
  • arp:捕获所有 ARP 数据包。

    sh 复制代码
    tcpdump arp
  • rarp:捕获所有 RARP 数据包。

    sh 复制代码
    tcpdump rarp
  • 协议IP协议版本过滤

    bash 复制代码
    tcpdump ip #捕获IPv4数据包
    tcpdump ip6 #捕获IPv6数据包
    
    tcpdump ip and tcp # 捕获 IPv4 上的 TCP 数据包
    tcpdump ip6 and tcp # 捕获 IPv6 上的 TCP 数据包
    
    tcpdump ip host 192.168.1.1 # 捕获特定 IPv4 地址的所有数据包
    tcpdump ip6 host 2001:db8::1 # 捕获特定 IPv6 地址的所有数据包
    
    tcpdump ip and udp # 捕获 IPv4 上的 UDP 数据包
    tcpdump ip6 and udp # 捕获 IPv6 上的 UDP 数据包
    
    tcpdump 'ip and icmp' #捕获IPv4的ICMP数据包:
    tcpdump 'ip6 and icmp6' #捕获IPv6的ICMP数据包:
    
    tcpdump 'ip and net 192.168.1.0/24' #捕获IPv4的指定网络的数据包:
    tcpdump 'ip6 and net 2001:db8::/32' #捕获IPv6的指定网络的数据包:
    
    tcpdump 'ip and src 192.168.1.1 and dst port 443' -w ipv4_https_traffic.pcap #捕获IPv4上指定源地址和目的端口的数据包,并保存到文件
    tcpdump 'ip6 and src 2001:db8::1 and dst port 443' -vv
     #捕获IPv6上指定源地址和目的端口的数据包,并显示详细信息

2. 地址相关的原子条件

  • host:捕获来自或发送到指定主机的数据包。

    sh 复制代码
    tcpdump host 192.168.1.1
  • src host:捕获来自指定源主机的数据包。

    sh 复制代码
    tcpdump src host 192.168.1.1
  • dst host:捕获发送到指定目标主机的数据包。

    sh 复制代码
    tcpdump dst host 192.168.1.2
  • net:捕获来自或发送到指定网络的数据包。

    sh 复制代码
    tcpdump net 192.168.1.0/24
  • src net:捕获来自指定源网络的数据包。

    sh 复制代码
    tcpdump src net 192.168.1.0/24
  • dst net:捕获发送到指定目标网络的数据包。

    sh 复制代码
    tcpdump dst net 192.168.1.0/24

3. 端口相关的原子条件

  • port:捕获指定端口的数据包。

    sh 复制代码
    tcpdump port 80
  • src port:捕获来自指定源端口的数据包。

    sh 复制代码
    tcpdump src port 1024
  • dst port:捕获发送到指定目标端口的数据包。

    sh 复制代码
    tcpdump dst port 443
  • portrange:捕获指定端口范围的数据包。

    sh 复制代码
    tcpdump portrange 8000-8080

4. 网络层和链路层(mac地址)原子条件

  • ether:捕获以太网帧相关的数据包。

    sh 复制代码
    tcpdump ether
  • ether src:捕获来自指定源 MAC 地址的数据包。

    sh 复制代码
    tcpdump ether src 00:11:22:33:44:55
  • ether dst:捕获发送到指定目标 MAC 地址的数据包。

    sh 复制代码
    tcpdump ether dst 00:11:22:33:44:55
  • ether host:捕获来自或发送到指定 MAC 地址的数据包。

    sh 复制代码
    tcpdump ether host 00:11:22:33:44:55

5. 广播和多播

  • broadcast:捕获所有广播数据包。

    sh 复制代码
    tcpdump broadcast
  • multicast:捕获所有多播数据包。

    sh 复制代码
    tcpdump multicast

6. VLAN 相关的原子条件

  • vlan:捕获所有 VLAN 数据包。

    sh 复制代码
    tcpdump vlan
  • vlan vlan_id:捕获指定 VLAN ID 的数据包。

    sh 复制代码
    tcpdump vlan 10

7. 特定字段大小过滤

  • less:捕获小于指定字节长度的数据包。

    sh 复制代码
    tcpdump 'less 64'
  • greater:捕获大于指定字节长度的数据包。

    sh 复制代码
    tcpdump 'greater 128'

8. 基于TCP标记的过滤

  • tcp-flags :捕获具有特定 TCP 标志的数据包。
    • SYN :捕获所有带 SYN 标志的数据包。

      sh 复制代码
      tcpdump 'tcp[tcpflags] & tcp-syn != 0'
    • SYN-ACK :捕获所有带 SYN 和 ACK 标志的数据包。

      sh 复制代码
      tcpdump 'tcp[tcpflags] & (tcp-syn|tcp-ack) == (tcp-syn|tcp-ack)'

9. ICMP 类型过滤

  • icmpicmptype :捕获特定类型的 ICMP 数据包。
    • echo request (ping 请求)

      sh 复制代码
      tcpdump 'icmp[icmptype] = icmp-echo'
    • echo reply (ping 回复)

      sh 复制代码
      tcpdump 'icmp[icmptype] = icmp-echoreply'

10. MPLS 过滤

  • mpls:捕获所有 MPLS 数据包。

    sh 复制代码
    tcpdump 'mpls'
  • mpls label:捕获指定 MPLS 标签的数据包。

    sh 复制代码
    tcpdump 'mpls 100'

11. PPPoE 过滤

  • pppoes :捕获所有 PPPoE 会话数据包。

    sh 复制代码
    tcpdump 'pppoes'

12. ISO OSI 过滤

  • iso:捕获所有 ISO 网络协议数据包。

    sh 复制代码
    tcpdump 'iso'
  • clnp:捕获所有 CLNP(Connectionless Network Protocol)数据包。

    sh 复制代码
    tcpdump 'clnp'

13. Token Ring 过滤

  • tr:捕获所有 Token Ring 数据包。

    sh 复制代码
    tcpdump 'tr'
  • tr protocol:捕获指定 Token Ring 协议的数据包。

    sh 复制代码
    tcpdump 'tr 0x0800'

14. 带宽过滤

  • tcp-keepalive:捕获所有 TCP keepalive 数据包。

    sh 复制代码
    tcpdump 'tcp[tcpflags] & tcp-keepalive != 0'
  • tcp-segment:捕获所有 TCP 段。

    sh 复制代码
    tcpdump 'tcp-segment'


@组合示例

  1. 捕获所有来自 192.168.1.1 并发送到端口 80 的 TCP 数据包:

    sh 复制代码
    tcpdump 'src host 192.168.1.1 and dst port 80 and tcp'
  2. 捕获所有 IPv4 和 IPv6 上的 HTTP 和 HTTPS 流量:

    sh 复制代码
    tcpdump '(ip or ip6) and (tcp port 80 or tcp port 443)'
  3. 捕获所有来自网络 192.168.1.0/24 的 UDP 数据包,但排除端口 53(DNS):

    sh 复制代码
    tcpdump 'src net 192.168.1.0/24 and udp and not port 53'
  4. 捕获所有广播和多播数据包:

    sh 复制代码
    tcpdump 'broadcast or multicast'
  5. 捕获所有 VLAN 10 中大于 128 字节的 TCP 数据包:

    sh 复制代码
    tcpdump 'vlan 10 and tcp and greater 128'
  6. 捕获所有带 SYN 和 ACK 标志的 IPv6 TCP 数据包:

    sh 复制代码
    tcpdump 'ip6 and tcp[tcpflags] & (tcp-syn|tcp-ack) == (tcp-syn|tcp-ack)'
  7. 捕获所有 MPLS 标签为 100 的 UDP 数据包:

    sh 复制代码
    tcpdump 'mpls 100 and udp'
  8. 捕获所有 PPPoE 会话中的 IPv4 数据包:

    sh 复制代码
    tcpdump 'pppoes and ip'
  9. 捕获所有 ISO 网络协议中的 CLNP 数据包:

    sh 复制代码
    tcpdump 'iso and clnp'


4.tcpdump常用选项

Ⅰ.基本选项

  1. -i interface:指定要监听的网络接口。

    sh 复制代码
    tcpdump -i eth0
    • 默认情况下,tcpdump 会选择第一个非环回接口。

    • 可以通过 -D 选项列出所有接口:

      sh 复制代码
      tcpdump -D
  2. -c count:捕获指定数量的数据包后停止。

    sh 复制代码
    tcpdump -c 100
  3. -w file:将捕获的数据包保存到文件。

    sh 复制代码
    tcpdump -w capture.pcap
  4. -r file:从文件中读取并分析数据包。

    sh 复制代码
    tcpdump -r capture.pcap
  5. -nn:不将地址和端口转换为名称。

    sh 复制代码
    tcpdump -nn
    • -n:不将地址转换为名称(主机名)。
    • -nn:不将地址和端口转换为名称。
  6. -v, -vv, -vvv:设置详细输出的级别。

    sh 复制代码
    tcpdump -v   # 较详细
    tcpdump -vv  # 更详细
    tcpdump -vvv # 最详细
  7. -X:以十六进制和 ASCII 格式显示每个包的数据。

    sh 复制代码
    tcpdump -X
  8. -e:显示链路层头信息。

    sh 复制代码
    tcpdump -e
  9. -tt:显示时间戳,不格式化。

    sh 复制代码
    tcpdump -tt
  10. -ttt:显示时间戳,以微秒为单位,相对于上一个数据包的时间差。

    sh 复制代码
    tcpdump -ttt
  11. -tttt:显示人类可读的时间戳格式。

    sh 复制代码
    tcpdump -tttt
  12. -s snaplen:设置数据包截取长度(捕获的每个数据包的最大字节数)。

    sh 复制代码
    tcpdump -s 128
    • 默认值为 68 或 96,足以捕获 IP 和 TCP/UDP 头
    • 0 表示完整的数据包内容
  13. -A:以 ASCII 格式显示数据包内容。

    sh 复制代码
    tcpdump -A
  14. -C file_size:设置捕获文件的大小上限(以 MB 为单位),达到上限后创建新文件。

    sh 复制代码
    tcpdump -C 10 -w capture
  15. -G seconds:设置捕获文件的时间上限(以秒为单位),达到上限后创建新文件。

    sh 复制代码
    tcpdump -G 60 -w capture
  16. -W file_count:设置保存捕获文件的最大数量。

    sh 复制代码
    tcpdump -W 10 -G 60 -w capture
  17. -E spi@ipaddr algo:secret:指定解密 IPsec 数据包的参数。

    sh 复制代码
    tcpdump -E 100@192.168.1.1 des3:0x0123456789ABCDEF
  18. -Q:用于选择捕获的数据包的方向

    sh 复制代码
    tcpdump -Q direction
    
    tcpdump -Q in 'tcp' # 捕获并显示所有入方向的 TCP 数据包
    tcpdump -Q out -w http_out.pcap 'tcp port 80' # 捕获并保存出方向的 HTTP 流量到文件				
    tcpdump -Q inout -v 'icmp' # 捕获所有入方向和出方向的 ICMP 数据包,并显示详细信息
    tcpdump -Q in 'udp and host 192.168.1.100' # 捕获特定主机的入方向 UDP 流量
    tcpdump -Q out 'vlan 10' # 捕获 VLAN 10 的出方向数据包

    in:仅捕获入方向的数据包(接收的数据包)。

    out:仅捕获出方向的数据包(发送的数据包)。

    inout:捕获入方向和出方向的数据包(所有数据包)。

Ⅱ.高级选项

  1. -B buffer_size:设置捕获缓冲区大小(以 KB 为单位)。

    sh 复制代码
    tcpdump -B 4096
  2. -K:禁用数据包的校验和验证。

    sh 复制代码
    tcpdump -K
  3. -S:显示绝对序列号(对于 TCP 数据包)。

    sh 复制代码
    tcpdump -S
  4. -j tstamp_type:设置数据包时间戳类型。

    sh 复制代码
    tcpdump -j adapter
  5. -l:将标准输出设置为行缓冲模式。

    sh 复制代码
    tcpdump -l
  6. -U:实时写入捕获文件。

    sh 复制代码
    tcpdump -U -w capture.pcap
  7. -Z user:在捕获文件打开后切换用户。

    sh 复制代码
    tcpdump -Z nobody
  8. -F file:从文件中读取过滤表达式。

    sh 复制代码
    tcpdump -F filter_file

@组合选项示例

  1. 捕获并保存所有 TCP 数据包,保存到文件,文件大小上限为 10 MB,每 60 秒切换文件,最多保存 5 个文件:

    sh 复制代码
    tcpdump -i eth0 -w capture -C 10 -G 60 -W 5 tcp
  2. 以详细模式捕获端口 80 上的 HTTP 流量,并显示数据包内容的 ASCII 和十六进制格式:

    sh 复制代码
    tcpdump -i eth0 -vv -X port 80
  3. 捕获 VLAN 10 中的所有数据包,并将标准输出设置为行缓冲模式:

    sh 复制代码
    tcpdump -i eth0 -l vlan 10
  4. 捕获并解密 IPsec 数据包,使用指定的密钥:

    sh 复制代码
    tcpdump -i eth0 -E 100@192.168.1.1 des3:0x0123456789ABCDEF
  5. 设置捕获缓冲区大小为 4 MB,并捕获所有 UDP 数据包:

    sh 复制代码
    tcpdump -i eth0 -B 4096 udp


@综合示例

详解篇

下面是一些综合使用 tcpdump 选项、原子条件和逻辑运算符的示例,这些示例展示了如何结合这些元素来实现复杂的捕获和分析需求。

示例 1:捕获特定主机的 HTTP GET 请求并保存到文件

sh 复制代码
tcpdump -i eth0 -A -s 0 -w http_get_requests.pcap 'tcp port 80 and (((ip[2:2] - ((ip[0] & 0xf)<<2)) - ((tcp[12] & 0xf0)>>2)) != 0) and tcp[((tcp[12] & 0xf0)>>2):4] = 0x47455420 and host 192.168.1.100'
  • -i eth0:指定网络接口 eth0。
  • -A:以 ASCII 格式显示数据包内容。
  • -s 0:捕获完整的数据包。
  • -w http_get_requests.pcap:将数据包保存到文件。
  • 'tcp port 80 and ... and host 192.168.1.100' :过滤条件,捕获特定主机的 HTTP GET 请求。
    • ip2:2:IP 数据包的总长度字段(2 个字节),IP 头部的第 2 和第 3 字节表示数据包的总长度。
    • ip0 & 0xf:IP 头长度字段。IP 头部的第 1 字节的低 4 位表示 IP 头的长度(单位是 32 位字)
    • tcp12 & 0xf0:TCP 头长度字段。TCP 头部的第 13 字节的高 4 位表示 TCP 头的长度(单位是 32 位字)
    • 0x47455420:ASCII 码 "GET " 的十六进制表示。

示例 2:捕获 VLAN 10 中所有的 TCP SYN 数据包,并显示详细信息

sh 复制代码
tcpdump -i eth0 -nn -vv 'vlan 10 and tcp[tcpflags] & tcp-syn != 0'
  • -i eth0:指定网络接口 eth0。
  • -nn:不解析主机名和端口号。
  • -vv:显示详细的包头信息。
  • 'vlan 10 and tcptcpflags & tcp-syn != 0':过滤条件,捕获 VLAN 10 中所有 TCP SYN 数据包。

示例 3:捕获所有入方向的 ICMP 数据包,并显示数据包内容

sh 复制代码
tcpdump -i eth0 -Q in -X 'icmp'
  • -i eth0:指定网络接口 eth0。
  • -Q in:捕获入方向的数据包。
  • -X:以十六进制和 ASCII 格式显示数据包内容。
  • 'icmp':过滤条件,捕获所有 ICMP 数据包。

示例 4:捕获所有源 MAC 地址为特定地址的 TCP FIN 数据包

sh 复制代码
tcpdump -i eth0 'ether src 00:11:22:33:44:55 and tcp[tcpflags] & tcp-fin != 0'
  • -i eth0:指定网络接口 eth0。
  • 'ether src 00:11:22:33:44:55 and tcptcpflags & tcp-fin != 0':过滤条件,捕获所有源 MAC 地址为特定地址的 TCP FIN 数据包。

示例 5:捕获并显示特定 IP 地址的 UDP 流量,包括十六进制内容

sh 复制代码
tcpdump -i eth0 -nn -X 'udp and host 192.168.1.100'
  • -i eth0:指定网络接口 eth0。
  • -nn:不解析主机名和端口号。
  • -X:以十六进制和 ASCII 格式显示数据包内容。
  • 'udp and host 192.168.1.100':过滤条件,捕获特定 IP 地址的 UDP 流量。

示例 6:捕获 HTTP POST 请求,并显示数据包内容

sh 复制代码
tcpdump -i eth0 -A -s 0 'tcp port 80 and (((ip[2:2] - ((ip[0] & 0xf)<<2)) - ((tcp[12] & 0xf0)>>2)) != 0) and tcp[((tcp[12] & 0xf0)>>2):4] = 0x504f5354'
  • -i eth0:指定网络接口 eth0。
  • -A:以 ASCII 格式显示数据包内容。
  • -s 0:捕获完整的数据包。
  • 'tcp port 80 and ...':过滤条件,捕获 HTTP POST 请求。

示例 7:捕获特定端口范围的 UDP 流量,并设置捕获缓冲区大小

sh 复制代码
tcpdump -i eth0 -B 4096 'udp portrange 8000-8080'
  • -i eth0:指定网络接口 eth0。
  • -B 4096:设置捕获缓冲区大小为 4 MB。
  • 'udp portrange 8000-8080':过滤条件,捕获特定端口范围的 UDP 流量。

示例 8:捕获所有 TCP 连接终止过程中的数据包(包括 FIN 和 RST 数据包)

sh 复制代码
tcpdump -i eth0 'tcp[tcpflags] & (tcp-fin|tcp-rst) != 0'
  • -i eth0:指定网络接口 eth0。
  • 'tcptcpflags & (tcp-fin|tcp-rst) != 0':过滤条件,捕获所有 TCP 连接终止过程中的数据包。

简洁篇

示例 1:捕获 HTTP 和 HTTPS 流量并保存到文件

需求 :捕获所有通过端口 80 和 443 的 HTTP 和 HTTPS 流量,将捕获的数据包保存到文件 http_https_traffic.pcap,每个文件的大小上限为 10 MB,每 60 秒切换文件,最多保存 5 个文件。

sh 复制代码
tcpdump -i eth0 -w http_https_traffic.pcap -C 10 -G 60 -W 5 'tcp port 80 or tcp port 443'

示例 2:捕获特定网络内的所有 TCP 数据包,并显示详细信息

需求 :捕获来自网络 192.168.1.0/24 的所有 TCP 数据包,显示详细的包头信息和内容。

sh 复制代码
tcpdump -i eth0 -nn -vv -X 'tcp and net 192.168.1.0/24'

示例 3:捕获并解密 IPsec 流量

需求:捕获并解密 IPsec 数据包,使用特定的密钥进行解密。

sh 复制代码
tcpdump -i eth0 -E 100@192.168.1.1 des3:0x0123456789ABCDEF 'esp'

示例 4:捕获并实时显示所有包含特定字符串的 HTTP 流量

需求:捕获并实时显示所有 HTTP 流量,并在包内容中搜索特定字符串 "password"。

sh 复制代码
tcpdump -i eth0 -A -s 0 'tcp port 80 and (((ip[2:2] - ((ip[0]&0xf)<<2)) - ((tcp[12]&0xf0)>>2)) != 0) and tcp[((tcp[12]&0xf0)>>2):4] = 0x70617373'

示例 5:捕获所有带有 SYN 和 ACK 标志的 TCP 数据包

需求:捕获所有带有 SYN 和 ACK 标志的 TCP 数据包,以监视网络中的新连接建立。

sh 复制代码
tcpdump -i eth0 'tcp[tcpflags] & (tcp-syn|tcp-ack) == (tcp-syn|tcp-ack)'

示例 6:捕获特定 VLAN 中的 ICMP 数据包,并将输出显示为 ASCII 格式

需求:捕获 VLAN ID 为 10 的所有 ICMP 数据包,并以 ASCII 格式显示包内容。

sh 复制代码
tcpdump -i eth0 -A 'vlan 10 and icmp'

示例 7:捕获特定端口范围的 UDP 流量,并设置捕获缓冲区大小

需求:捕获端口范围 8000 到 8080 的所有 UDP 流量,并将捕获缓冲区大小设置为 4 MB,以防止丢包。

sh 复制代码
tcpdump -i eth0 -B 4096 'udp portrange 8000-8080'

示例 8:捕获并显示时间戳差异的 TCP 数据包

需求:捕获所有 TCP 数据包,并显示数据包之间的时间戳差异,以微秒为单位。

sh 复制代码
tcpdump -i eth0 -ttt 'tcp'

示例 9:捕获来自特定主机的 DNS 查询和响应

需求 :捕获来自主机 192.168.1.1 的所有 DNS 查询和响应。

sh 复制代码
tcpdump -i eth0 'host 192.168.1.1 and port 53'

示例 10:捕获所有广播和多播数据包,并显示链路层信息

需求:捕获所有广播和多播数据包,并显示链路层头信息。

sh 复制代码
tcpdump -i eth0 -e '(broadcast or multicast)'

总结

  1. 选项顺序:在命令行中,选项通常出现在过滤条件之前。
  2. 过滤条件的使用 :过滤条件需要用单引号 ' 或双引号 " 包围,以避免 shell 对其进行错误解析。
  3. 捕获缓冲区 :使用 -B 选项设置捕获缓冲区大小,以防止丢包。
  4. 对于http: 使用 -A 选项是以 ASCII 格式显示数据包的内容。因为 HTTP 是一种基于文本的协议,其请求和响应内容都是可读的文本。通过使用 -A 选项,可以直接在终端中看到 HTTP 请求和响应的详细内容
  5. 更为复杂的话,可以使用tcpdump保存抓包文件,然后Linux版本的tshark图形化页面分析和过滤
相关推荐
云中双月4 分钟前
瑞芯微rv1106进入Loader模式转储emmc数据
linux·嵌入式·uboot·u-boot·emmc·rockchip·烧录·rv1106·瑞芯微
yunwei374 分钟前
eBPF 入门实践教程:BPF Token,安全的委托式权限与程序加载
linux·后端·性能优化
不知语冰7 分钟前
达妙 Orin NX V2:JetPack 安装中文拼音输入法
linux
水饺编程17 分钟前
第2章:Linux 基础,echo 命令
linux·c语言·汇编
Lsetea28 分钟前
curl设置SSL_CERT_FILE仍报60:CURL_CA_BUNDLE与CA路径优先级排查
linux·https·ssl证书·openssl·curl
隐擎fox42 分钟前
Linux eBPF 与 XDP 高性能网络出口架构:动态连接追踪、丢包诊断与住宅网关 QoS 调优实战
linux·网络·网络协议·tcp/ip·架构
xiaoliuliu123451 小时前
Linux 手动装毕昇 bisheng-jdk-8u432-linux-aarch64.tar.gz
linux
狂奔的sherry2 小时前
JRuby 多线程反引号偶发 127:GC 提前释放了 posix_spawn 的 argv
java·linux·ruby·gc·jruby
广州灵眸科技有限公司2 小时前
瑞芯微(EASY EAI)RV1126B DeepSeek R1部署教程
linux·数据库·yolo
沙老师2 小时前
linux比windows死板的地方
linux·运维·windows