tcpdump(Linux服务器)配合 Wireshark(本地分析)使用手顺与常用过滤语法详解

1. 引言

在网络故障排查、安全分析、协议学习等场景中,tcpdumpWireshark 是黄金搭档。tcpdump 作为命令行抓包利器,轻量高效,常部署在 Linux 服务器上捕获原始流量;Wireshark 则以其强大的图形界面和深度解析能力,在本地工作站上对抓包文件进行可视化分析。

本文将详细讲解如何将两者结合使用,形成一套高效的网络数据包捕获与分析工作流,并重点剖析两个工具的常用过滤语法,助你精准定位网络问题。

2. 工具准备与环境说明

2.1 tcpdump (Linux 服务器端)

  • 作用 :在服务器上捕获网络接口上的原始数据包,并保存为 .pcap.pcapng 格式的文件。

  • 安装 :大多数 Linux 发行版已预装。若未安装,可使用包管理器安装。

    bash 复制代码
    # CentOS/RHEL/Fedora
    sudo yum install tcpdump
    # 或 sudo dnf install tcpdump
    
    # Debian/Ubuntu
    sudo apt-get install tcpdump
  • 权限 :抓包通常需要 root 权限或 CAP_NET_RAW 能力。建议使用 sudo 执行。

2.2 Wireshark (本地分析端)

  • 作用:图形化数据包分析工具,支持数百种协议的深度解析、过滤、统计和图形展示。
  • 安装 :从 Wireshark 官网 下载对应操作系统的安装包。
  • 文件传输 :需要将服务器上 tcpdump 抓取的 .pcap 文件传输到本地。常用方法:
    • scpscp user@server:/path/to/capture.pcap ./
    • rsyncsftp 或直接下载(如果服务器有 web 服务)。

3. tcpdump 使用手顺

3.1 基本抓包命令

bash 复制代码
# 1. 捕获所有经过 eth0 网卡的数据包,显示在屏幕上
sudo tcpdump -i eth0

# 2. 捕获指定数量(如10个)包后自动停止
sudo tcpdump -i eth0 -c 10

# 3. 不将IP地址解析为主机名(-n),不解析端口号为服务名(-nn),提升显示速度
sudo tcpdump -i eth0 -nn

# 4. 将抓包结果保存到文件(-w),供后续分析
sudo tcpdump -i eth0 -w capture.pcap

# 5. 组合使用:不解析、抓100个包、保存文件
sudo tcpdump -i eth0 -nn -c 100 -w capture.pcap

3.2 常用命令行选项

选项 说明
-i <interface> 指定网络接口,如 eth0, any(所有接口)
-c <count> 捕获指定数量的数据包后退出
-w <file> 将原始数据包写入文件(二进制格式)
-r <file> 读取之前保存的抓包文件并显示/分析
-n 不进行主机名解析(显示IP地址)
-nn 不进行主机名和端口号解析(显示IP和端口数字)
-v / -vv / -vvv 增加输出详细程度(更多协议头信息)
-s <snaplen> 设置抓取每个数据包的字节数(0表示抓取完整包)
-A 以ASCII格式打印每个数据包(查看HTTP文本内容有用)
-X 同时以十六进制和ASCII格式打印数据包内容

4. tcpdump 过滤语法详解

tcpdump 使用 伯克利包过滤(BPF) 语法,功能强大且灵活。

4.1 基础过滤:按主机、端口、网络

bash 复制代码
# 抓取与特定主机(IP)相关的所有流量
sudo tcpdump host 192.168.1.100

# 抓取源IP或目的IP为指定主机的流量
sudo tcpdump src host 192.168.1.100
sudo tcpdump dst host 192.168.1.200

# 抓取特定端口的流量(TCP/UDP)
sudo tcpdump port 80
sudo tcpdump port 443
sudo tcpdump portrange 8000-8010

# 抓取源端口或目的端口
sudo tcpdump src port 22
sudo tcpdump dst port 53

# 抓取特定网段的流量
sudo tcpdump net 192.168.1.0/24
sudo tcpdump src net 10.0.0.0/8

4.2 协议与传输层过滤

bash 复制代码
# 按协议过滤
sudo tcpdump icmp
sudo tcpdump arp
sudo tcpdump tcp
sudo tcpdump udp

# 组合协议与端口
sudo tcpdump tcp port 80
sudo tcpdump udp port 53

4.3 高级过滤:按标志位、数据内容

bash 复制代码
# TCP标志位过滤(常用于排查连接问题)
sudo tcpdump 'tcp[tcpflags] & (tcp-syn) != 0'  # 只抓SYN包(新建连接)
sudo tcpdump 'tcp[tcpflags] & (tcp-ack) != 0'  # 只抓ACK包
sudo tcpdump 'tcp[tcpflags] & (tcp-fin) != 0'  # 只抓FIN包(连接关闭)

# 抓取包含特定字符串的数据包(例如HTTP GET请求)
sudo tcpdump -A -s0 'tcp port 80 and (((ip[2:2] - ((ip[0]&0xf)<<2)) - ((tcp[12]&0xf0)>>2)) != 0)' | grep -i "GET"

# 更精确的负载内容匹配(需计算偏移,较复杂,通常用Wireshark更直观)

4.4 逻辑运算符组合

bash 复制代码
# 与(and 或 &&)
sudo tcpdump host 192.168.1.100 and port 80

# 或(or 或 ||)
sudo tcpdump port 80 or port 443

# 非(not 或 !)
sudo tcpdump not port 22  # 抓取除SSH外的所有流量

# 使用括号分组,控制优先级
sudo tcpdump '(src host 192.168.1.1 and dst port 80) or (dst host 192.168.1.2)'

5. 将抓包文件传输到本地并导入 Wireshark

  1. 在服务器上使用 tcpdump 抓包并保存

    bash 复制代码
    sudo tcpdump -i eth0 -nn -w /tmp/server_capture.pcap
    # 按 Ctrl+C 停止抓包
  2. 将文件传输到本地(以 scp 为例):

    bash 复制代码
    # 在本地终端执行
    scp username@your_server_ip:/tmp/server_capture.pcap ./
  3. 使用 Wireshark 打开文件

    • 启动 Wireshark。
    • 点击菜单 File -> Open,选择下载的 server_capture.pcap 文件。

6. Wireshark 使用手顺与过滤语法

Wireshark 的过滤分为两种:

  • 捕获过滤器(Capture Filters) :在开始抓包前设置,语法与 tcpdump 的 BPF 语法完全兼容。用于减少抓包数量,减轻负载。
  • 显示过滤器(Display Filters):在抓包完成后,对已捕获的数据包进行筛选显示。语法更强大、更易读。

6.1 捕获过滤器(同 tcpdump)

在 Wireshark 开始捕获的界面直接输入。

复制代码
host 192.168.1.100 and port 80
not arp
src net 192.168.0.0/24

6.2 显示过滤器(核心分析工具)

显示过滤器使用 Wireshark 自有的、更直观的语法。

6.2.1 基础字段过滤
bash 复制代码
# IP地址
ip.addr == 192.168.1.100
ip.src == 10.0.0.1
ip.dst == 8.8.8.8

# 端口
tcp.port == 80
udp.port == 53
tcp.srcport == 5000
tcp.dstport == 443

# 协议
http
dns
icmp
tcp
udp
6.2.2 协议特定字段过滤
bash 复制代码
# HTTP
http.request.method == "GET"
http.response.code == 404
http contains "User-Agent: Mozilla"

# DNS
dns.flags.response == 1  # 响应包
dns.qry.name contains "google.com"

# TCP
tcp.flags.syn == 1
tcp.flags.reset == 1
tcp.analysis.retransmission  # 重传包
tcp.stream eq 10  # 跟踪特定TCP流(会话)

# ICMP
icmp.type == 8  # Echo request (ping)
icmp.type == 0  # Echo reply
6.2.3 逻辑运算符与比较
bash 复制代码
# 与、或、非
ip.addr == 192.168.1.100 and tcp.port == 80
http or dns
!(arp or icmp)

# 包含
frame contains "GET /index.html"
http.request.uri contains "login"

# 比较运算符
tcp.len > 1000
http.time > 1
6.2.4 高级技巧:跟踪会话与导出对象
  • 跟踪TCP流 :右键数据包 -> Follow -> TCP Stream。Wireshark 会重组该会话的所有数据,并以明文或十六进制显示,对分析 HTTP、SMTP 等协议极其有用。
  • 导出对象File -> Export Objects -> HTTP。可以导出通过 HTTP 传输的文件(如图片、文档)。

7. 实战工作流示例:分析 Web 服务器访问慢

场景 :用户反馈访问 http://your_server 很慢。

  1. 在服务器上抓取相关流量

    bash 复制代码
    sudo tcpdump -i eth0 -nn host 客户端IP and port 80 -w web_slow.pcap
  2. 传输文件到本地,用 Wireshark 打开

  3. 应用显示过滤器

    • http:只看 HTTP 协议。
    • tcp.analysis.retransmission:查看是否有 TCP 重传(网络不稳定)。
    • http.time > 0.5:筛选响应时间大于 0.5 秒的请求。
  4. 分析

    • 查看 Statistics -> Conversations,检查 TCP 会话是否有大量重传或零窗口。
    • 跟踪一个慢请求的 TCP 流 (Follow TCP Stream),查看服务端响应是否延迟。
    • 检查 Statistics -> HTTP -> Packet Counter,看是否有大量 4xx/5xx 错误。

8. 总结与最佳实践

阶段 工具选择 关键动作
捕获 tcpdump 1. 使用 -nn 避免解析开销。 2. 使用 -w 保存原始文件。 3. 使用 捕获过滤器 缩小范围,避免抓全流量。
传输 scp/rsync .pcap 文件安全地移到分析环境。
分析 Wireshark 1. 使用 显示过滤器 进行多维筛选。 2. 利用 Follow TCP StreamExport Objects 等高级功能。 3. 查看 Statistics 菜单进行整体分析。
过滤语法 牢记区别 tcpdump (BPF) :用于捕获时过滤。 Wireshark 显示过滤:用于捕获后分析,更强大易用。

常用过滤速查

  • 找问题连接tcp.flags.reset == 1tcp.analysis.retransmission
  • 看特定会话tcp.stream eq <编号>ip.addr==x.x.x.x and ip.addr==y.y.y.y
  • 抓取关键协议 :在服务器上用 tcpdump port 80 or port 443,在 Wireshark 中用 http or ssl

掌握 tcpdump 和 Wireshark 的过滤语法,能让你从海量网络数据中迅速定位关键信息,是网络工程师和开发者的必备技能。

相关推荐
Loongproxy2 小时前
大规模采集为啥用隧道代理IP?会话保持如何做到无感轮换
java·服务器·网络
jason_renyu2 小时前
Linux Docker 服务管理与排查实战指南(新手速查版)
linux·docker·新手docker学习·docker日志查询·docker服务管理
Web极客码2 小时前
用 Python 搭建工具调用 Agent 的调试过程
java·服务器·前端
测试运维日常笔记2 小时前
Unix/Linux 系统软件包管理笔记
linux·笔记·unix
雾时之林3 小时前
Linux--介绍及管理
linux·运维·服务器
盐焗鹌鹑蛋3 小时前
【Linux】重定向
linux
fhqlongteng3 小时前
TCP服务器断开客户端的方法
服务器·网络·tcp/ip
啦啦啦啦啦zzzz3 小时前
5种IO模型
运维·服务器·网络·c++
FreeTinker3 小时前
企业存储服务器NAS的选型逻辑与补充路径
运维·服务器