【Day 64】Linux-抓包工具
一、tcpdump
tcpdump 是 Linux 下最老牌、最通用的命令行抓包工具,无需图形界面,适合服务器环境,支持复杂的流量过滤规则,是运维和开发的 “标配” 工具。
(一)基本用法( root 权限)
抓包命令的基本格式:tcpdump [选项] [过滤规则]
1、基础抓包(默认)
sudo tcpdump # 抓取默认网卡的所有流量(按 Ctrl+C 停止)
| 禁用域名解析:不将 IP 地址转换为域名(如不把 |
| (第二个 |
(1)无 -nn
的命令:tcpdump -i eth0 port 80
输出(会解析域名和端口名):
-
10:00:01.123456 IP desktop.54321 > www.baidu.com.http: Flags [S], seq 123456789, win 65535, length 0
-
desktop
是本地主机名(由 IP 解析而来); -
www.baidu.com
是目标 IP 解析后的域名; -
http
是端口 80 解析后的服务名。
-
(2)有 -nn
的命令:tcpdump -i eth0 port 80 -nn
输出(仅显示数字):
-
10:00:01.123456 IP 192.168.1.100.54321 > 14.215.177.38.80: Flags [S], seq 123456789, win 65535, length 0
-
192.168.1.100
是本地 IP(无解析); -
14.215.177.38
是百度的 IP(无域名解析); -
80
是目标端口(无服务名解析)。
-
2、指定网卡抓包
通过 -i 选项指定网卡(如 eth0、ens33、lo 本地回环):
# 抓取ens33网卡的所有流量
sudo tcpdump -i ens33# 抓取所有网卡(包括lo)的流量
sudo tcpdump -i any
3、过滤规则(核心功能)
tcpdump 的强大之处在于精准过滤,避免抓取无关流量。常见过滤规则示例:
需求场景 | 命令示例 |
---|---|
按 IP 过滤 | sudo tcpdump -i ens33 src 192.168.1.100(抓取 源 IP 为 192.168.1.100 的流量) sudo tcpdump -i ens33 dst 10.0.0.5(抓取 目标 IP 为 10.0.0.5 的流量) |
按端口过滤 | sudo tcpdump -i ens33 port 80(抓取 80 端口流量,HTTP) sudo tcpdump -i ens33 port 443 or 22(抓取 443/22 端口流量,HTTPS/SSH) |
按协议过滤 | sudo tcpdump -i ens33 icmp(抓取 ICMP 协议,ping 包) sudo tcpdump -i ens33 tcp(仅抓 TCP 流量) |
组合过滤 | sudo tcpdump -i ens33 tcp and port 80 and src 192.168.1.100(TCP+80 端口 + 指定源 IP) |
4、保存抓包数据(供后续分析)
通过 -w
选项将流量保存为 pcap
文件(二进制格式,需用工具解析)
# 抓取ens33网卡的TCP流量,保存到tcp_traffic.pcap
sudo tcpdump -i ens33 -nn tcp -w tcp_traffic.pcap
5、读取已保存的 pcap 文件
通过 -r
选项读取之前保存的抓包文件:
sudo tcpdump -r tcp_traffic.pcap
(二)tcpdump 通用输出结构
[时间戳] [协议] [源IP.源端口] > [目标IP.目标端口]: [核心信息(Flags/类型/参数)], [附加参数], length [数据长度]
字段 | 说明 | 示例 |
---|---|---|
时间戳 | 抓包时间(格式:时:分: 秒。微秒) | 16:30:27.575788 |
协议 | 网络层 / 传输层协议(ARP、IP、ICMP、TCP、UDP、DNS 等) | IP、ARP、TCP |
源地址:端口 | 数据包的发送方(IP + 端口,-nn 参数下不解析域名 / 服务名,显示原始值) | 192.168.140.10.12345 |
目标地址:端口 | 数据包的接收方(格式同源地址) | 192.168.140.1.53840 |
核心信息 | 协议特有的关键标识(如 TCP 的 Flags、ARP 的 Request/Reply、DNS 的查询类型) | Flags [.], Request who-has |
附加参数 | 协议相关的补充信息(如 TCP 的 ack 序号、win 窗口大小,DNS 的查询域名) | ack 1499155623, win 262 |
数据长度 | 数据包的有效数据长度(单位:字节,不含头部) | length 52 |
1、常见协议 / 场景的典型输出
(1)ARP 协议:局域网 MAC 地址查询(高频)
ARP 用于「IP→MAC 地址映射」,输出仅分 Request(查询) 和 Reply(响应) 两种类型,是局域网通信的基础。
① ARP Request(查询 MAC 地址)
16:30:20.198243 ARP, Request who-has 192.168.140.13 tell 192.168.140.10, length 46
-
核心字段解析:
-
Request who-has [目标IP]
:查询「目标 IP(192.168.140.13)」对应的 MAC 地址; -
tell [源IP]
:告知目标 IP“我是源 IP(192.168.140.10),请回复我你的 MAC”; -
固定长度:ARP 包长度通常为 46 字节(以太网最小帧长要求)。
-
② ARP Reply(响应 MAC 地址)
16:30:32.096012 ARP, Reply 192.168.140.10 is-at 00:0c:29:95:f2:77, length 46
-
核心字段解析:
-
Reply [源IP] is-at [MAC地址]
:响应方告知 “我是源 IP(192.168.140.10),我的 MAC 地址是 00:0c:29:95:f2:77”。
-
(2) ICMP 协议:ping 测试 / 网络连通性(最常用)
ICMP 最常见的场景是 ping
(echo request
请求包 + echo reply
响应包),输出直接反映目标 IP 的可达性。
① ICMP echo request(ping 请求包)
16:30:27.866760 IP 192.168.140.10 > 106.39.171.134: ICMP echo request, id 1697, seq 1, length 64
-
核心字段解析:
-
ICMP echo request
:ping 的 “请求包”,用于测试目标 IP 是否可达; -
id
:ping 进程的标识(同一 ping 进程的 id 固定,区分不同 ping 任务); -
seq
:数据包序号(从 1 开始递增,用于判断是否丢包); -
长度:默认 64 字节(含 8 字节 ICMP 头部 + 56 字节数据,Windows 下为 32 字节数据)。
-
② ICMP echo reply(ping 响应包)
16:30:27.867800 IP 106.39.171.134 > 192.168.140.10: ICMP echo reply, id 1697, seq 1, length 64
-
核心字段解析:
-
ICMP echo reply
:ping 的 “响应包”,表示目标 IP 可达; -
id
和seq
与请求包一致,用于匹配 “请求 - 响应” 对。
-
(3)TCP 协议:可靠数据传输(HTTP/SSH/ 文件传输等)
TCP 是面向连接的协议,输出的核心是 Flags 标志位(反映连接状态:建立、传输、关闭),常见 Flags 及对应场景如下:
TCP Flags | 含义 | 典型场景 | 输出示例 |
---|---|---|---|
[S] | SYN(建立连接请求) | 客户端发起 TCP 连接(三次握手第 1 步) | 10:00:00.123456 IP 192.168.1.100.54321 > 1.2.3.4.80: Flags [S], seq 12345, win 65535, length 0 |
[S.] | SYN+ACK(同意连接) | 服务端响应连接 (三次握手第 2 步) | 10:00:00.123460 IP 1.2.3.4.80 > 192.168.1.100.54321: Flags [S.], seq 67890, ack 12346, win 65535, length 0 |
[.] | ACK(确认收到数据) | 传输中确认数据包(无数据) | 16:30:27.575788 IP 192.168.140.10.12345 > 192.168.140.1.53840: Flags [.], ack 1499155623, win 262, length 0 |
[P.] | PSH+ACK(推送数据) | 发送有效数据 (交给应用层) | 16:30:27.577949 IP 192.168.140.10.12345 > 192.168.140.1.53840: Flags [P.], seq 0:52, ack 1, win 262, length 52 |
[F.] | FIN+ACK(关闭连接) | 主动关闭连接 (四次挥手第 1 步) | 10:00:01.123456 IP 192.168.1.100.54321 > 1.2.3.4.80: Flags [F.], seq 12346, ack 67891, win 65535, length 0 |
-
关键补充:
-
seq
:TCP 序列号(标记数据位置,确保有序); -
ack
:确认号(表示 “已收到对方 seq 为 X 的数据,下次请发 X+1”); -
win
:窗口大小(表示本地可接收的最大数据量,用于流量控制)。
-
(4) UDP 协议:无连接传输(DNS/SNMP/TFTP 等)
UDP 无连接、无确认,输出结构简单,核心是 “端口 + 数据长度”,常见于 DNS 查询、SNMP 监控等场景。
① DNS 查询(UDP+53 端口)
16:30:27.856513 IP 192.168.140.10.52297 > 114.114.114.114.53: 20297+ A? jd.com. (24)
-
核心字段解析:
-
端口:DNS 服务默认端口 53(目标端口),源端口为客户端临时端口(52297);
-
20297+
:DNS 查询的事务 ID(匹配 “查询 - 响应”),+
表示启用递归查询; -
A? jd.com.
:查询类型(A 记录 = IPv4 地址,AAAA=IPv6 地址),查询域名为jd.com; -
(24)
:DNS 查询包的总长度(24 字节)。
-
② SNMP 监控(UDP+161 端口)
10:05:00.111222 IP 192.168.1.200.45678 > 192.168.1.10.161: GetRequest(28) system.sysDescr.0
-
核心字段解析:
-
端口:SNMP 服务默认端口 161(目标端口);
-
GetRequest(28)
:SNMP 操作类型(获取设备信息),数据包长度 28 字节; -
system.sysDescr.0
:SNMP 查询的 OID(获取设备系统描述)。
-
(5)HTTP 协议:网页访问(基于 TCP)
HTTP 基于 TCP 传输,输出可通过 “端口 80” 和 “HTTP 方法(GET/POST)” 识别。
10:10:00.333444 IP 192.168.1.100.56789 > 1.2.3.4.80: Flags [P.], seq 1:180, ack 1, win 65535, length 179: HTTP: GET /index.html HTTP/1.1
-
核心字段解析:
-
端口:HTTP 默认端口 80(目标端口);
-
Flags [P.]
:TCP 推送数据(HTTP 请求报文); -
HTTP: GET /index.html HTTP/1.1
:HTTP 请求方法(GET)、请求路径(/index.html)、协议版本(HTTP/1.1)。
-
2、高频抓包场景的输出总结
场景 | 协议组合 | 关键识别点 | 输出示例核心片段 |
---|---|---|---|
局域网 MAC 查询 | ARP | Request who-has /Reply ... is-at | ARP, Request who-has 192.168.1.10 tell 192.168.1.20 |
ping 测试 | ICMP | echo request /echo reply | ICMP echo request, id 1697, seq 1 |
域名解析 | UDP+DNS | 端口 53、A? 域名 | 114.114.114.114.53: 20297+ A? jd.com. (24) |
网页访问 | TCP+HTTP | 端口 80、HTTP: GET/POST | HTTP: GET /index.html HTTP/1.1 |
SSH 远程登录 | TCP | 端口 22、Flags [S] (连接) | IP 192.168.1.100.2222 > 1.2.3.4.22: Flags [S] |
二、图形化工具:Wireshark
// (可视化分析首选)
Wireshark • Go Deep | Download
Wireshark
是跨平台(Linux/Windows/macOS)的图形化抓包工具,界面友好、功能强大,支持上千种协议解析(如 HTTP、HTTPS、DNS、TCP、UDP 等),适合需要可视化分析的场景(如桌面端调试)。
1. 核心特点
- 图形化界面,操作直观,支持 “点选过滤”;
- 强大的协议解析能力,可显示数据包的每层细节(链路层、网络层、传输层、应用层);
- 支持导入 / 导出
pcap
文件(可与 tcpdump/tshark 互通); - 提供流量统计、趋势图、会话分析等高级功能。
2. 安装方法(Linux)
多数发行版通过包管理器安装:
# Ubuntu/Debian
sudo apt install wireshark# CentOS/RHEL
sudo dnf install wireshark# Fedora
sudo yum install wireshark
安装后,在应用菜单中找到 Wireshark
启动(需输入 root 密码,因抓包需管理员权限)。
3. 基本使用步骤
- 选择网卡:启动后,在主界面选择要抓包的网卡(如
ens33
),点击 “开始” 按钮(鲨鱼鳍图标); - 实时抓包:界面会实时显示抓取的数据包,包括 “时间戳、源 IP、目标 IP、协议、长度、信息”;
- 过滤流量:
- 用顶部 “过滤栏” 输入规则(语法与 tcpdump 类似,如
tcp port 80
); - 或右键点击某条数据包,选择 “作为过滤器应用”(如 “选中源 IP”);
- 用顶部 “过滤栏” 输入规则(语法与 tcpdump 类似,如
- 分析细节:双击某条数据包,可展开查看每层(链路层、IP 层、TCP 层、应用层)的具体字段(如 TCP 的序列号、HTTP 的请求头);
- 保存 / 导出:抓包完成后,点击 “停止”,通过 “文件→保存” 将数据存为
pcap
文件。
三、Wireshark 命令行版:tshark
//(批量 / 脚本化抓包)
tshark
是 Wireshark 的命令行版本,兼具 tcpdump
的便捷性和 Wireshark 的强大协议解析能力,适合脚本化抓包或批量处理流量数据。
1. 核心特点
- 无图形界面,支持命令行过滤和输出格式化;
- 解析协议的能力比 tcpdump 更强(如能直接解析 HTTP 请求行、DNS 响应);
- 可输出为文本、CSV、JSON 等格式,便于后续用脚本(如 Python)分析。
2. 常用示例
# 1. 抓取ens33网卡的HTTP流量,显示详细信息(解析HTTP请求)
sudo tshark -i ens33 -Y "http"# 2. 抓取8080端口流量,保存为pcap文件
sudo tshark -i ens33 -f "tcp port 8080" -w 8080_traffic.pcap# 3. 读取pcap文件,输出为CSV格式(便于Excel分析)
tshark -r 8080_traffic.pcap -T csv > traffic.csv# 4. 统计TOP 10源IP的流量(按数据包数量排序)
sudo tshark -i ens33 -c 1000 -T fields -e ip.src | sort | uniq -c | sort -nr | head -10
四、ngrep
//轻量级工具
ngrep
是 “network grep” 的缩写,结合了 tcpdump
的抓包能力和 grep
的文本搜索能力,适合快速查找数据包中的特定字符串(如 HTTP 请求中的关键词、DNS 域名)。
1. 核心特点
- 支持基于正则表达式搜索数据包内容;
- 轻量级,语法简单,适合快速定位特定流量。
2. 安装与示例
# 安装(Ubuntu)
sudo apt install ngrep
# ngrep 不在 CentOS 默认基础仓库中,需要先启用 EPEL 扩展仓库,再通过包管理器安装:
# CentOS 7
sudo yum install -y ngrep
# CentOS 8 及以上
sudo dnf install -y ngrep
ngrep
的基本语法与 tcpdump
类似,但增加了文本搜索功能,核心格式:
ngrep [选项] '搜索字符串' [抓包过滤条件,同tcpdump]
常用选项说明:
-i <接口>
:指定抓包接口(如ens33
,同tcpdump
的-i
);-q
:安静模式,只显示匹配的数据包,不输出冗余信息;-W byline
:按行显示数据包内容(可读性更好,推荐使用);-O <文件>
:将匹配的数据包保存到文件;-t
:显示时间戳;-I <文件>
:从tcpdump
保存的.pcap
文件中读取数据并搜索。
典型场景实例:
1. 搜索所有包含 "GET" 或 "POST" 的 HTTP 请求(端口 80)
ngrep -i ens33 -q -W byline 'GET|POST' port 80
-
作用:抓取
ens33
接口上,所有通过 80 端口(HTTP)且包含 "GET" 或 "POST" 方法的数据包,按行显示文本内容。
2. 搜索 DNS 查询中包含 "jd.com" 的域名
ngrep -i ens33 -q -W byline 'jd.com' udp port 53
-
作用:抓取 DNS 协议(UDP 53 端口)中所有包含 "jd.com" 域名的查询或响应包,适合排查域名解析问题。
3. 过滤特定 IP 的数据包并搜索关键词
ngrep -i ens33 -q -W byline 'password' src 192.168.140.10 and port 8080
-
作用:抓取源 IP 为
192.168.140.10
、端口 8080 且包含 "password" 字符串的数据包(常用于检测敏感信息传输)。
4. 从 tcpdump 保存的文件中搜索内容
如果先用 tcpdump
保存了抓包文件(如 dump.pcap
),可后续用 ngrep
搜索:
# 先用 tcpdump 抓包并保存
tcpdump -i ens33 -w dump.pcap port 80# 用 ngrep 从文件中搜索 "index.html"
ngrep -I dump.pcap -q -W byline 'index.html'
五、iftop
// 流量监控 + 抓包:
iftop
主要用于实时监控网卡带宽,但也支持简单的抓包功能,适合快速定位 “谁在占用带宽”(如异常流量的 IP / 端口)。
1. 核心特点
- 命令行界面,实时显示各连接的带宽使用情况(上行 / 下行);
- 可按带宽排序,快速识别占用带宽最高的 IP / 端口;
- 支持显示端口号和协议,辅助定位流量来源。
2. 安装与示例
# 安装(Ubuntu)
sudo apt install iftop# 监控ens33网卡的带宽(按回车切换显示模式:IP→端口→协议)
sudo iftop -i ens33
界面中,<=
表示下行流量,=>
表示上行流量,可直观看到每个连接的带宽占用。