使用 pcap-filter 语法进行网络过滤

2025-06-10

使用 pcap-filter 语法进行网络过滤

libpcap是一个提供用于捕获网络流量的高级接口的库。它于 20 世纪 90 年代作为开源项目开发,并广泛应用于各种网络分析工具,包括 Wireshark 和 tcpdump。libpcap 的一个关键特性libpcap是其过滤语法,该语法基于伯克利包过滤器 ( BPF ) 语法。
简而言之,BPF实现为一个虚拟机,它在 Linux 内核中执行用户定义的字节码程序来过滤和处理网络数据包。

BPF语法允许用户创建过滤器,根据各种条件(例如源和目标 IP 地址、协议类型、端口号和数据包内容)选择性地仅捕获他们感兴趣的网络流量。Libpcap 支持数据包级和字节级过滤,允许用户基于所捕获数据包的内容和结构创建过滤器。

值得注意的是,2014 年,一个BPF名为eBPF(扩展伯克利包过滤器)的扩展版本被开发出来,它提供了更强大的功能——它不仅可用于网络,还可用于各种其他用途,例如跟踪系统调用、内核检测和安全监控。它的多功能性使其成为开发人员和系统管理员的热门选择,其用途广泛,而不仅仅是网络分析。不过,eBPF这需要另写一篇文章来讨论,本文我们将重点介绍BPFlibpcap 的语法。

实际例子

显示 HTTP 流量

tcpdump -i enp0s3 -A src 10.0.2.15 and dst port http
Enter fullscreen mode Exit fullscreen mode
tcpdump是一个强大的命令行数据包分析器,可用于显示或记录流量。

这里我们在接口 enp0s3 上使用 tcpdump(请使用ifconfig命令检查你的接口)来显示 ASCII 格式的流量(-Aflag )。我们使用 BPF 语法来指定我们感兴趣的是从 IP 地址发10.0.2.15往任意主机端口的数据包80port httppart )。

请注意,我们还可以用来ngrep仅显示具有特定内容的数据包。

ngrep(network grep 的缩写)是一个命令行数据包分析器,它支持使用类似 grep 的正则表达式语法根据数据包内容进行过滤。例如,下面这行命令将捕获一个指向 http://info.cern.ch/ 的请求。
$ ngrep -W byline cern src net 10.0.2.0/24 and dst port http

###
T 10.0.2.15:50660 -> 188.184.21.108:80 [AP] #3
GET / HTTP/1.1.
Host: info.cern.ch.
User-Agent: Wget/1.21.2.
Accept: */*.
Accept-Encoding: identity.
Connection: Keep-Alive.
.
Enter fullscreen mode Exit fullscreen mode

显示特定主机的网络统计信息

您可以使用它iftop来获取特定主机的网络统计信息。

iftop是一个专注于网络统计的命令行系统监视器。
iftop -f "dst host github.com"
Enter fullscreen mode Exit fullscreen mode

捕获具有特定标头的数据包

您可以使用相关语法来检查协议标志和数据包内容中的值。通常使用protocol[offset:size]protocol[offset]语法。此外,还有一些预定义值(见下文示例),它们仅显示每个 TCP 对话的结束数据包:

tcpdump -i enp0s3 -X 'tcp[tcpflags] & tcp-fin != 0'
Enter fullscreen mode Exit fullscreen mode

或者尝试这个来获取所有长度超过 256 字节的数据包 – 你可以看到 IPv4 标头的结构 – 例如在wiki中:

tcpdump -i enp0s3 -X 'ip[2:2] > 256'
Enter fullscreen mode Exit fullscreen mode

链接

  1. pcap过滤器
  2. 数据包捕获
  3. libpcap
  4. 带通滤波器
  5. eBPF
  6. iftop
  7. ngrep
  8. tcpdump
鏂囩珷鏉ユ簮锛�https://dev.to/r4dx/using-pcap-filter-syntax-for-network-filtering-151c
PREV
Linux 101 - 操作系统之王👑
NEXT
Using FUSE to map network statistics to directories