主要功能
Wireshark 的主要功能包括:
- 实时数据捕获:能够捕获实时流量并对其进行分析。
- 数据包解码:支持数百种网络协议,能够解码并显示各种协议的详细信息。
- 过滤功能:提供强大的过滤功能,可以根据特定条件筛选数据包。
- 数据包重组:能够重组和分析分片的数据包,以查看完整的通信内容。
- 统计和图表:提供多种统计和图表功能,帮助用户进行流量分析和趋势预测。
抓包过滤基础
抓包过滤是指在数据包捕获和分析过程中,使用特定的规则和条件,筛选出满足条件的数据包。Wireshark 提供了两种主要的过滤器类型:显示过滤器和捕获过滤器。
- 显示过滤器:用于在捕获后筛选和显示特定的数据包。显示过滤器是在数据包已经被捕获之后应用的,它不会影响实际的数据包捕获过程。
- 捕获过滤器:用于在捕获过程中筛选数据包。捕获过滤器是在数据包捕获之前应用的,它会直接影响捕获到的数据包数量和内容。
显示过滤器
显示过滤器是 Wireshark 中用于在数据包捕获之后,根据特定条件筛选和显示数据包的工具。显示过滤器的语法相对简单,使用字段名、运算符和值来构建过滤条件。
显示过滤器的基础语法包括:
- 字段名:指定要过滤的数据包字段,如
ip.addr
、tcp.port
等。 - 运算符:用于比较字段值的运算符,如
==
、!=
、>
、<
、>=
、<=
等。 - 值:与字段名进行比较的值,可以是数值、字符串、布尔值等。
示例:
- 过滤特定 IP 地址的数据包:
ip.addr == 192.168.75.234
- 过滤特定端口的数据包:
tcp.port == 80
- 过滤特定协议的数据包:
http
常用的显示过滤器
一些常用的显示过滤器包括:
1.IP 地址过滤:
- 过滤特定**源 IP **地址的数据包:
ip.src == 192.168.75.234
- 过滤特定目的 IP 地址的数据包:
ip.dst == 192.168.75.231
- 过滤**特定 IP **地址的数据包(无论源还是目的):
ip.addr == 192.168.75.234
2.端口号过滤:
- 过滤特定源端口的数据包:
tcp.srcport == 80
- 过滤特定目的端口的数据包:
tcp.dstport == 443
- 过滤特定端口的数据包(无论源还是目的):
tcp.port == 80
3.协议过滤
- 过滤 **HTTP **协议的数据包:
http
- 过滤 **TCP **协议的数据包:
tcp
- 过滤 ICMP 协议的数据包:
icmp
4.排除特定流量:
- 排除 ICMP 协议的数据包:
!icmp
过滤 HTTP 流量
HTTP 流量是网络分析中常见的一部分,通过显示过滤器可以筛选和分析特定的 HTTP 请求和响应。
1.过滤所有 HTTP 流量:
http
2.过滤特定主机的 HTTP 流量:
http.host == "
www.gxaedu.com"
3.过滤特定 URI 的 HTTP 请求:
http.request.uri contains "/login"
4.过滤特定方法的 HTTP 请求:
http.request.method == "POST"
5.过滤特定状态码的 HTTP 响应:
http.response.code == 200
过滤 DNS 流量
DNS 流量也是网络分析中常见的内容,通过显示过滤器可以筛选和分析 DNS 查询和响应。
1.过滤所有 DNS 流量:
dns
2.过滤特定域名的 DNS 查询:
dns.qry.name == "example.com"
3.过滤特定类型的 DNS 查询:
dns.qry.type == 1 // A记录查询
4.过滤特定响应码的 DNS 响应:
dns.flags.rcode == 0 // No error
5.过滤特定 IP 地址的 DNS 响应:
dns.a == 192.168.1.1
过滤 TCP 流量
TCP 是传输层的主要协议之一,通过显示过滤器可以筛选和分析特定的 TCP 会话和流量。
1.过滤所有 TCP 流量
tcp
2.过滤特定源端口的 TCP 流量:
tcp.srcport == 80
3.过滤特定目的端口的 TCP 流量:
tcp.dstport == 443
4.过滤特定 TCP 标志位的流量:
tcp.flags.syn == 1 // SYN 包
5.过滤特定 TCP 会话的流量:
tcp.stream eq 1
过滤 UDP 流量
UDP 是传输层的另一主要协议,通过显示过滤器可以筛选和分析特定的 UDP 会话和流量。
1.过滤所有 UDP 流量:
udp
2.过滤特定源端口的 UDP 流量
udp.srcport == 53
3.过滤特定目的端口的 UDP 流量:
udp.dstport == 123
4.过滤特定 UDP 会话的流量:
udp.stream eq 1
过滤 ICMP 流量
ICMP 是网络层的重要协议,通过显示过滤器可以筛选和分析特定的 ICMP 报文。
1.过滤所有 ICMP 流量:
icmp
2.过滤特定类型的 ICMP 报文:
icmp.type == 8 // Echo Request
3.过滤特定代码的 ICMP 报文:
icmp.code == 0
4.过滤特定 ID 的 ICMP 报文:
icmp.ident == 0x1234
5. 过滤特定序列号的 ICMP 报文:
icmp.seq == 0x1
显示过滤器的高级用法
显示过滤器还支持更复杂的条件组合和表达式,例如:
1.多个条件的组合
- 过滤特定源 IP 和目标端口的数据包:
ip.src == 192.168.3.9 && tcp.dstport == 8080
2.范围过滤:
- 过滤帧长度在 100 到 200 字节之间的数据包:
frame.len >= 100 && frame.len <= 200
3.使用正则表达式:
- 过滤 URI 包含 "login" 的 HTTP 请求:
http.request.uri matches ".*login.*"
4.复杂逻辑过滤:
- 过滤源 IP 为 192.168.1.1 且目的端口为 80,或源 IP 为 192.168.1.2 且目的端口为 443 的数据包:
(ip.src == 192.168.3.9 && tcp.dstport == 80) || (ip.src == 192.168.3.66 && tcp.dstport == 443)
捕获过滤器
捕获过滤器在数据包捕获过程中起作用,通过预先定义的条件,仅捕获满足条件的数据包。捕获过滤器使用 Berkeley Packet Filter (BPF) 语法,能够在捕获时减少不必要的数据包,提升捕获效率。
捕获过滤器的基础语法包括:
- 字段名:指定要过滤的数据包字段,如
host
、port
、net
等。 - 运算符:用于比较字段值的运算符,如
==
、!=
、>
、<
、>=
、<=
等。 - 值:与字段名进行比较的值,可以是数值、字符串、布尔值等。
💡捕获过滤器最终的效果和显示过滤器差不多,所以下面瑞哥的截图会少点,大家可以自己尝试。
示例:
- 过滤特定 IP 地址的数据包:
host 192.168.3.9
- 过滤特定端口的数据包:
port 80
- 过滤特定协议的数据包:
tcp
常用的捕获过滤器
一些常用的捕获过滤器包括:
- IP 地址过滤:
- 过滤特定 IP 地址的数据包:
host 192.168.1.1
- 过滤特定源 IP 地址的数据包:
src host 192.168.1.1
- 过滤特定目的 IP 地址的数据包:
dst host 192.168.3.66
2.端口号过滤:
- 过滤特定端口的数据包:
port 80
- 过滤特定源端口的数据包:
src port 80
- 过滤特定目的端口的数据包:
dst port 443
3.协议过滤:
- 过滤 TCP 协议的数据包:
tcp
- 过滤 UDP 协议的数据包:
udp
- 过滤 ICMP 协议的数据包:
icmp
4.排除特定流量:
- 排除特定 IP 地址的数据包:
not host 192.168.1.1
- 排除特定端口的数据包:
not port 80
捕获 HTTP 流量
通过捕获过滤器筛选 HTTP 流量可以减少捕获的数据量,尤其是在只需要分析特定的 HTTP 请求和响应时。
1.捕获所有 HTTP 流量:
tcp port 80
2.捕获特定主机的 HTTP 流量:
tcp port 80 and host www.example.com
捕获 DNS 流量
通过捕获过滤器筛选 DNS 流量,可以有效地捕获特定的 DNS 查询和响应。
1.捕获所有 DNS 流量:
udp port 53
2.捕获特定域名的 DNS 查询:
udp port 53 and host example.com
捕获 TCP 流量
通过捕获过滤器筛选 TCP 流量,可以捕获特定会话和特定条件下的 TCP 报文。
1.捕获所有 TCP 流量:
tcp
2.捕获特定源端口的 TCP 流量:
src port 80
3.捕获特定目的端口的 TCP 流量:
dst port 443
4.捕获特定 TCP 标志位的流量:
tcp[tcpflags] & tcp-syn != 0 // SYN 包
捕获 UDP 流量
通过捕获过滤器筛选 UDP 流量,可以捕获特定会话和特定条件下的 UDP 报文。
1.捕获所有 UDP 流量:
udp
2.捕获特定源端口的 UDP 流量:
src port 53
3.捕获特定目的端口的 UDP 流量:
dst port 123
捕获 ICMP 流量
通过捕获过滤器筛选 ICMP 流量,可以捕获特定类型和特定条件下的 ICMP 报文。
1.捕获所有 ICMP 流量:
icmp
2.捕获特定类型的 ICMP 报文:
icmp[icmptype] == icmp-echo
3.捕获特定代码的 ICMP 报文:
icmp[icmpcode] == 0
捕获过滤器的高级用法
捕获过滤器支持更复杂的条件组合和表达式,例如:
1.多个条件的组合:
- 过滤源 IP 和目标端口同时满足的数据包:
src host 192.168.1.1 and dst port 80
2.范围过滤:
- 过滤特定网段的数据包:
net 192.168.1.0/24
3.复杂逻辑过滤:
- 过滤源 IP 为 192.168.1.1 且目标端口为 80,或源 IP 为 192.168.1.2 且目标端口为 443 的数据包:
(src host 192.168.1.1 and dst port 80) or (src host 192.168.1.2 and dst port 443)
4.字段存在检查:
- 过滤存在特定字段的数据包:
tcp[tcpflags] & tcp-syn != 0
高级过滤技巧
Wireshark 过滤器不仅可以用于简单的条件筛选,还支持更复杂的逻辑运算和组合,从而实现更精细的过滤。
组合过滤条件
通过组合多个过滤条件,可以实现更复杂的筛选逻辑。
1.AND 逻辑组合
- 过滤源 IP 为 192.168.1.1 且目的端口为 80 的数据包:
ip.src == 192.168.1.1 && tcp.dstport == 80
2.OR 逻辑组合:
- 过滤源 IP 为 192.168.1.1 或目的端口为 443 的数据包:
ip.src == 192.168.1.1 || tcp.dstport == 443
3.混合逻辑组合:
- 过滤源 IP 为 192.168.1.1 且(目的端口为 80 或 443)的数据包:
ip.src == 192.168.1.1 && (tcp.dstport == 80 || tcp.dstport == 443)
使用正则表达式
Wireshark 的显示过滤器支持正则表达式,可以用来匹配更复杂的字符串模式。
1.匹配 HTTP 请求 URI 中包含特定字符串:
- 过滤 URI 包含 "login" 的 HTTP 请求:
http.request.uri matches ".*login.*"
2.匹配 HTTP 头部中的特定字段:
- 过滤 User-Agent 包含 "Mozilla" 的 HTTP 请求:
http.request.header.User-Agent matches ".*Mozilla.*"
字段存在检查
通过检查字段是否存在,可以筛选出包含特定字段的数据包。
1.检查 IP 选项字段是否存在:
- 过滤包含 IP 选项字段的数据包:
ip.options
2.检查 TCP 选项字段是否存在:
- 过滤包含 TCP 选项字段的数据包:
tcp.options
使用偏移量和掩码
Wireshark 过滤器支持通过偏移量和掩码筛选特定位的数据。
1.过滤 TCP 标志位中的 SYN 包:
- 使用位运算过滤 TCP SYN 包:
tcp.flags & 0x02 != 0
2.过滤特定字节偏移量的数据包:
- 过滤 TCP 数据包中包含特定数据模式的包:
tcp[13] & 0x02 != 0