文章目录
- 一、tcpdump 是什么?
- 二、基本语法
- 三、常用参数说明
- 四、抓包示例(通俗易懂)
- 1. 抓所有数据包(默认 eth0)
- 2. 指定接口抓包
- 3. 抓取端口 80 的数据包(即 HTTP 请求)
- 4. 抓取访问某个 IP 的数据包
- 5. 抓取 TCP 协议的数据包
- 6. 抓取源 IP 为 192.168.1.5 的包
- 7. 抓取目的端口为 22(SSH) 的包
- 8. 抓取数据并保存为 pcap 文件
- 五、过滤表达式组合
- 六、实时查看数据包内容
- 七、常见用途总结
- 八、停止抓包
- 九、注意事项
- 十、案例:排查 Web 服务访问异常
- 背景
- 第一步:服务端开启抓包
- 第二步:客户端 curl 请求
- 第三步:分析抓包输出(部分示例)
- 如果没有抓到内容怎么办?
- 总结:通过抓包排查服务异常
一、tcpdump 是什么?
tcpdump
是一个命令行抓包工具,它可以监听网络接口上的数据包,并将其内容打印出来。相比图形化工具(如 Wireshark),tcpdump 更轻量、适合远程服务器操作。
二、基本语法
tcpdump [选项] [过滤表达式]
常用结构:
sudo tcpdump -i eth0
三、常用参数说明
参数 | 含义 |
---|---|
-i interface | 指定要监听的网络接口,例如 eth0 , ens33 , lo |
-nn | 不将地址和端口转换为主机名和服务名 |
-v , -vv , -vvv | 输出更详细的包信息 |
-c num | 抓取指定数量的包后自动退出 |
-w file | 将抓到的包写入文件,供 Wireshark 分析(如:.pcap ) |
-r file | 读取之前保存的 .pcap 文件 |
-s size | 抓取数据包的大小(默认只抓前96字节) |
四、抓包示例(通俗易懂)
1. 抓所有数据包(默认 eth0)
sudo tcpdump
2. 指定接口抓包
sudo tcpdump -i ens33
3. 抓取端口 80 的数据包(即 HTTP 请求)
sudo tcpdump -i ens33 port 80
4. 抓取访问某个 IP 的数据包
sudo tcpdump host 192.168.1.10
5. 抓取 TCP 协议的数据包
sudo tcpdump tcp
6. 抓取源 IP 为 192.168.1.5 的包
sudo tcpdump src 192.168.1.5
7. 抓取目的端口为 22(SSH) 的包
sudo tcpdump dst port 22
8. 抓取数据并保存为 pcap 文件
sudo tcpdump -i ens33 -w output.pcap
然后可以用 Wireshark 打开 output.pcap
文件分析。
五、过滤表达式组合
可以使用 AND、OR、NOT 来组合条件:
#抓取目的端口为 80 且源 IP 为 192.168.1.10 的包
sudo tcpdump dst port 80 and src 192.168.1.10#抓取非本机 IP 的所有包
sudo tcpdump not src host 127.0.0.1
六、实时查看数据包内容
sudo tcpdump -A -i ens33 port 80
-A
会以 ASCII 格式输出数据内容,适合抓取 HTTP 明文请求。
七、常见用途总结
场景 | 示例命令 |
---|---|
抓某个 IP 的流量 | tcpdump host 192.168.1.10 |
抓某个端口的流量 | tcpdump port 3306 |
保存抓包文件 | tcpdump -w mysql.pcap port 3306 |
实时观察 HTTP 内容 | tcpdump -A port 80 |
八、停止抓包
- 直接 按
Ctrl + C
停止并返回统计信息。
九、注意事项
-
tcpdump 通常需要 root 权限。
-
不能抓加密内容(如 HTTPS),但可以看到握手。
-
若接口名不知道,可以使用命令查看所有网络接口:
ip a
十、案例:排查 Web 服务访问异常
背景
在维护一台 Ubuntu 服务器,服务器 IP 是 192.168.163.130
,在这台机器上部署了一个 Web 服务(监听在 80 端口),但用户反映无法访问。
需要确认:
- 客户端(比如另一台机器)是否发起了请求?
- 服务端是否接收到请求?
- 响应是否正常返回?
第一步:服务端开启抓包
在 Web 服务所在的服务器上运行
sudo tcpdump -i ens33 -nn -A port 80 and host 192.168.163.133
解释:
-i ens33
:监听本机的网络接口(你可根据ip a
查具体名称)-nn
:不解析主机名和端口名,显示数字-A
:以 ASCII 形式输出,便于看 HTTP 请求内容port 80
:只抓 HTTP 流量host 192.168.163.133
:只抓指定客户端发来的数据(这台是访问你服务器的客户端)
第二步:客户端 curl 请求
在另一台主机(比如 192.168.163.133
)执行:
curl http://192.168.163.130
这会发起一个 HTTP 请求。
第三步:分析抓包输出(部分示例)
如果服务正常,你应该会在 tcpdump 中看到类似内容:
GET / HTTP/1.1
Host: 192.168.163.130
User-Agent: curl/7.81.0
Accept: */*HTTP/1.1 200 OK
Content-Type: text/html
Content-Length: 1234
...
<html>...</html>
说明:
- 客户端成功发起了 HTTP 请求(
GET / HTTP/1.1
) - 服务器返回了 200 状态码
如果没有抓到内容怎么办?
可能是以下问题:
现象 | 排查建议 |
---|---|
抓不到任何包 | 客户端根本没发起请求;或防火墙阻断 |
有请求无响应 | 服务未监听 80 端口;nginx/apache 没启动 |
请求显示连接被拒绝 | 服务未运行,或被防火墙拦截 |
是 HTTPS 流量 | 用 port 443 ,但内容是加密的,看不到明文 |
可以用以下命令排查服务状态:
sudo ss -tnlp | grep :80 # 查看是否监听了80端口
sudo ufw status # 查看防火墙
保存抓包供分析(可配合 Wireshark)
sudo tcpdump -i ens33 -w web_error.pcap port 80
然后传输 .pcap
文件到本地,用 Wireshark 打开,能更图形化分析每一条请求响应
总结:通过抓包排查服务异常
步骤 | 操作 |
---|---|
开启抓包 | tcpdump -i ens33 port 80 and host 客户端IP |
客户端访问测试 | curl http://服务端IP |
实时分析 HTTP 请求 | 用 -A 显示明文 |
保存数据包 | 用 -w file.pcap |
tcpdump -i ens33 port 80 and host 客户端IP | |
客户端访问测试 | curl http://服务端IP |
实时分析 HTTP 请求 | 用 -A 显示明文 |
保存数据包 | 用 -w file.pcap |
问题排查方向 | 没请求 / 有请求无响应 / 端口监听 / 防火墙拦截 |