Linux tcpdump详解

目录

前言: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’
3. 高性能网络 pfSense 和 Open vSwitch:使用 BPF 进行流量监控和优化网络性能。 ovs-vsctl – set Bridge br0 netflow=@nf – --id=@nf create NetFlow
targets=“127.0.0.1:2055” active-timeout=30
4. 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语法)

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

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



2.逻辑运算符

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

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


3.常用的原子条件

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

1. 协议相关的原子条件

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

    tcpdump ip
    
  • ip6:捕获所有 IPv6 数据包。

    tcpdump ip6
    
  • tcp:捕获所有 TCP 数据包。

    tcpdump tcp
    
  • udp:捕获所有 UDP 数据包。

    tcpdump udp
    
  • icmp:捕获所有 ICMP 数据包。

    tcpdump icmp
    
  • icmp6:捕获所有 ICMPv6 数据包。

    tcpdump icmp6
    
  • arp:捕获所有 ARP 数据包。

    tcpdump arp
    
  • rarp:捕获所有 RARP 数据包。

    tcpdump rarp
    
  • 协议IP协议版本过滤

    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:捕获来自或发送到指定主机的数据包。

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

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

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

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

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

    tcpdump dst net 192.168.1.0/24
    

3. 端口相关的原子条件

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

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

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

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

    tcpdump portrange 8000-8080
    

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

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

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

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

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

    tcpdump ether host 00:11:22:33:44:55
    

5. 广播和多播

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

    tcpdump broadcast
    
  • multicast:捕获所有多播数据包。

    tcpdump multicast
    

6. VLAN 相关的原子条件

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

    tcpdump vlan
    
  • vlan [vlan_id]:捕获指定 VLAN ID 的数据包。

    tcpdump vlan 10
    

7. 特定字段大小过滤

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

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

    tcpdump 'greater 128'
    

8. 基于TCP标记的过滤

  • tcp-flags:捕获具有特定 TCP 标志的数据包。
    • SYN:捕获所有带 SYN 标志的数据包。
      tcpdump 'tcp[tcpflags] & tcp-syn != 0'
      
    • SYN-ACK:捕获所有带 SYN 和 ACK 标志的数据包。
      tcpdump 'tcp[tcpflags] & (tcp-syn|tcp-ack) == (tcp-syn|tcp-ack)'
      

9. ICMP 类型过滤

  • icmp[icmptype]:捕获特定类型的 ICMP 数据包。
    • echo request(ping 请求)
      tcpdump 'icmp[icmptype] = icmp-echo'
      
    • echo reply(ping 回复)
      tcpdump 'icmp[icmptype] = icmp-echoreply'
      

10. MPLS 过滤

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

    tcpdump 'mpls'
    
  • mpls [label]:捕获指定 MPLS 标签的数据包。

    tcpdump 'mpls 100'
    

11. PPPoE 过滤

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

12. ISO OSI 过滤

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

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

    tcpdump 'clnp'
    

13. Token Ring 过滤

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

    tcpdump 'tr'
    
  • tr [protocol]:捕获指定 Token Ring 协议的数据包。

    tcpdump 'tr 0x0800'
    

14. 带宽过滤

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

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

    tcpdump 'tcp-segment'
    


@组合示例

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

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

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

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

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

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

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

    tcpdump 'mpls 100 and udp'
    
  8. 捕获所有 PPPoE 会话中的 IPv4 数据包

    tcpdump 'pppoes and ip'
    
  9. 捕获所有 ISO 网络协议中的 CLNP 数据包

    tcpdump 'iso and clnp'
    


4.tcpdump常用选项

Ⅰ.基本选项

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

    tcpdump -i eth0
    
    • 默认情况下,tcpdump 会选择第一个非环回接口。
    • 可以通过 -D 选项列出所有接口:
      tcpdump -D
      
  2. -c count:捕获指定数量的数据包后停止。

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

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

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

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

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

    tcpdump -X
    
  8. -e:显示链路层头信息。

    tcpdump -e
    
  9. -tt:显示时间戳,不格式化。

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

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

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

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

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

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

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

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

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

    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 为单位)。

    tcpdump -B 4096
    
  2. -K:禁用数据包的校验和验证。

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

    tcpdump -S
    
  4. -j tstamp_type:设置数据包时间戳类型。

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

    tcpdump -l
    
  6. -U:实时写入捕获文件。

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

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

    tcpdump -F filter_file
    

@组合选项示例

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

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

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

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

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

    tcpdump -i eth0 -B 4096 udp
    


@综合示例

详解篇

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

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

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 请求。
    • ip[2:2]:IP 数据包的总长度字段(2 个字节),IP 头部的第 2 和第 3 字节表示数据包的总长度。
    • ip[0] & 0xf:IP 头长度字段。IP 头部的第 1 字节的低 4 位表示 IP 头的长度(单位是 32 位字)
    • tcp[12] & 0xf0:TCP 头长度字段。TCP 头部的第 13 字节的高 4 位表示 TCP 头的长度(单位是 32 位字)
    • 0x47455420:ASCII 码 "GET " 的十六进制表示。

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

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

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

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

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

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 tcp[tcpflags] & tcp-fin != 0’:过滤条件,捕获所有源 MAC 地址为特定地址的 TCP FIN 数据包。

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

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 请求,并显示数据包内容

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 流量,并设置捕获缓冲区大小

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 数据包)

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

简洁篇

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

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

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 数据包,显示详细的包头信息和内容。

tcpdump -i eth0 -nn -vv -X 'tcp and net 192.168.1.0/24'

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

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

tcpdump -i eth0 -E 100@192.168.1.1 des3:0x0123456789ABCDEF 'esp'

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

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

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 数据包,以监视网络中的新连接建立。

tcpdump -i eth0 'tcp[tcpflags] & (tcp-syn|tcp-ack) == (tcp-syn|tcp-ack)'

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

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

tcpdump -i eth0 -A 'vlan 10 and icmp'

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

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

tcpdump -i eth0 -B 4096 'udp portrange 8000-8080'

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

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

tcpdump -i eth0 -ttt 'tcp'

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

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

tcpdump -i eth0 'host 192.168.1.1 and port 53'

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

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

tcpdump -i eth0 -e '(broadcast or multicast)'

总结

  1. 选项顺序:在命令行中,选项通常出现在过滤条件之前。
  2. 过滤条件的使用:过滤条件需要用单引号 ' 或双引号 " 包围,以避免 shell 对其进行错误解析。
  3. 捕获缓冲区:使用 -B 选项设置捕获缓冲区大小,以防止丢包。
  4. 对于http: 使用 -A 选项是以 ASCII 格式显示数据包的内容。因为 HTTP 是一种基于文本的协议,其请求和响应内容都是可读的文本。通过使用 -A 选项,可以直接在终端中看到 HTTP 请求和响应的详细内容
  5. 更为复杂的话,可以使用tcpdump保存抓包文件,然后Linux版本的tshark图形化页面分析和过滤
  • 34
    点赞
  • 28
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值