使用 pcap-filter 语法进行网络过滤
libpcap是一个提供用于捕获网络流量的高级接口的库。它于 20 世纪 90 年代作为开源项目开发,并广泛应用于各种网络分析工具,包括 Wireshark 和 tcpdump。libpcap 的一个关键特性libpcap
是其过滤语法,该语法基于伯克利包过滤器 ( BPF ) 语法。
简而言之,BPF实现为一个虚拟机,它在 Linux 内核中执行用户定义的字节码程序来过滤和处理网络数据包。
BPF
语法允许用户创建过滤器,根据各种条件(例如源和目标 IP 地址、协议类型、端口号和数据包内容)选择性地仅捕获他们感兴趣的网络流量。Libpcap 支持数据包级和字节级过滤,允许用户基于所捕获数据包的内容和结构创建过滤器。
值得注意的是,2014 年,一个BPF
名为eBPF(扩展伯克利包过滤器)的扩展版本被开发出来,它提供了更强大的功能——它不仅可用于网络,还可用于各种其他用途,例如跟踪系统调用、内核检测和安全监控。它的多功能性使其成为开发人员和系统管理员的热门选择,其用途广泛,而不仅仅是网络分析。不过,eBPF
这需要另写一篇文章来讨论,本文我们将重点介绍BPF
libpcap 的语法。
实际例子
显示 HTTP 流量
tcpdump -i enp0s3 -A src 10.0.2.15 and dst port http
tcpdump是一个强大的命令行数据包分析器,可用于显示或记录流量。
这里我们在接口 enp0s3 上使用 tcpdump(请使用ifconfig
命令检查你的接口)来显示 ASCII 格式的流量(-A
flag )。我们使用 BPF 语法来指定我们感兴趣的是从 IP 地址发10.0.2.15
往任意主机端口的数据包80
(port http
part )。
请注意,我们还可以用来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.
.
显示特定主机的网络统计信息
您可以使用它iftop
来获取特定主机的网络统计信息。
iftop是一个专注于网络统计的命令行系统监视器。
iftop -f "dst host github.com"
捕获具有特定标头的数据包
您可以使用相关语法来检查协议标志和数据包内容中的值。通常使用protocol[offset:size]
或protocol[offset]
语法。此外,还有一些预定义值(见下文示例),它们仅显示每个 TCP 对话的结束数据包:
tcpdump -i enp0s3 -X 'tcp[tcpflags] & tcp-fin != 0'
或者尝试这个来获取所有长度超过 256 字节的数据包 – 你可以看到 IPv4 标头的结构 – 例如在wiki中:
tcpdump -i enp0s3 -X 'ip[2:2] > 256'