网络抓包介绍
抓包到底是什么
想象一下邮局:
- 网络数据 = 邮件包裹
- 网卡 = 邮局分拣中心
- 抓包 = 在分拣中心拍照记录每个包裹的信息
你的电脑 ←→ 网卡(eth0) ←→ 网络↑抓包工具在这里"偷听"
当你执行 tcpdump -i eth0 -w http.pcap
时:
- tcpdump 告诉网卡:“把经过你的所有数据都复制一份给我”
- 网卡说:“好的,我把数据包的完整副本都给你”
- tcpdump 把这些副本保存到文件里
包文件到底存在哪里
# 你刚才的命令
sudo tcpdump -i eth0 -c 100 -w http.pcap port 9090# 文件就在当前目录!
[admin@host-11-61-243-97 ~]$ ls -la *.pcap
-rw-r--r-- 1 root root 12345 Dec 13 10:30 http.pcap
文件位置:就在你执行命令的目录下,文件名就是 http.pcap
实际演示:一步步看包里有什么
第1步:确认文件存在
ls -lh http.pcap
# 输出类似:-rw-r--r-- 1 root root 8.5K Dec 13 10:30 http.pcap
第2步:看包的"目录" - 每个包的基本信息
sudo tcpdump -r http.pcap -nn
输出会像这样:
10:30:15.123456 IP 192.168.1.100.45678 > 192.168.1.200.9090: Flags [S], seq 123456, win 65535
10:30:15.124567 IP 192.168.1.200.9090 > 192.168.1.100.45678: Flags [S.], seq 789012, ack 123457, win 65535
10:30:15.125678 IP 192.168.1.100.45678 > 192.168.1.200.9090: Flags [.], ack 789013, win 65535
这告诉你:
10:30:15.123456
= 时间戳192.168.1.100.45678 > 192.168.1.200.9090
= 从哪里到哪里Flags [S]
= TCP握手开始
第3步:看包的"内容" - 实际传输的数据
sudo tcpdump -r http.pcap -nn -A
现在你会看到真正的数据:
10:30:15.126789 IP 192.168.1.100.45678 > 192.168.1.200.9090: Flags [P.], seq 1:100, ack 1, win 65535, length 99
E..c..@.@.............#.P...........
GET /api/status HTTP/1.1
Host: 192.168.1.200:9090
User-Agent: curl/7.68.0
Accept: */*
这里你看到了:
- 真实的HTTP请求:
GET /api/status HTTP/1.1
- 请求头:
Host: 192.168.1.200:9090
更直观的查看方式
方法1:一个包一个包地看
# 只看第1个包的详细内容
sudo tcpdump -r http.pcap -nn -A -c 1# 看第2-5个包
sudo tcpdump -r http.pcap -nn -A | sed -n '2,5p'
方法2:搜索特定内容
# 找HTTP请求
sudo tcpdump -r http.pcap -A | grep -i "GET\|POST"# 找HTTP响应
sudo tcpdump -r http.pcap -A | grep -i "HTTP/1"# 找包含特定词的包
sudo tcpdump -r http.pcap -A | grep -i "error\|success"
方法3:用十六进制查看(看二进制数据)
sudo tcpdump -r http.pcap -nn -X
输出像这样:
0x0000: 4500 0054 1234 4000 4006 abcd c0a8 0164 E..T.4@.@......d
0x0010: c0a8 01c8 b26e 238e 1234 5678 9abc def0 .....n#..4Vx....
0x0020: 8018 ffff 1234 0000 0101 080a 1234 5678 .....4.......4Vx
0x0030: 4745 5420 2f61 7069 2f73 7461 7475 7320 GET /api/status
右边的ASCII部分显示:GET /api/status
实际例子:分析你的9090端口包
# 1. 看有多少个包
echo "总包数: $(sudo tcpdump -r http.pcap | wc -l)"# 2. 看都是哪些IP在通信
echo "通信的IP地址:"
sudo tcpdump -r http.pcap -nn | awk '{print $3 " -> " $5}' | sort | uniq -c# 3. 看HTTP请求(如果有的话)
echo "HTTP请求:"
sudo tcpdump -r http.pcap -A | grep -i "GET\|POST\|PUT\|DELETE"# 4. 看HTTP响应
echo "HTTP响应:"
sudo tcpdump -r http.pcap -A | grep -i "HTTP/1"# 5. 看第一个包的完整内容
echo "第一个包的详细内容:"
sudo tcpdump -r http.pcap -nn -A -c 1
包文件的本质
http.pcap
文件就像一个"录像":
- 记录了 网络上传输的每个数据包
- 包含了 完整的网络通信内容
- 可以重放 当时发生的网络活动
# 文件信息
file http.pcap
# 输出:http.pcap: tcpdump capture file (little-endian) - version 2.4 (Ethernet, capture length 262144)
简单总结
- 抓包 = 复制网络数据包到文件
- 包文件 = 当前目录下的
.pcap
文件 - 查看包 = 用
tcpdump -r 文件名
读取 - 看内容 = 加上
-A
参数看文本数据
最实用的命令:
sudo tcpdump -r http.pcap -nn -A | less
然后用空格键翻页,q
退出,/关键词
搜索。
这样你就能看到网络上到底传输了什么数据!