Tcpdump使用

tcpdump是一个在 Unix/Linux 系统上运行的网络抓包工具,用于捕获网络数据包并将其展示给用户。
通过 tcpdump工具,用户可以监视和分析网络流量,以便诊断网络问题、分析协议通信等。

1. 抓取指定网卡流量

$ tcpdump -i eth0 # -i 指定哪一个网卡,any表示任意 保存抓包结果到文件中(参考第12): $ tcpdump -i eth0 -w output.pcap

2. 过滤主机:host选项

查看ip为10.211.55.2的网络包 $ tcpdump -i any host 10.211.55.2

3. 过滤源地址、目标地址:src/dst

只抓取10.211.55.10发出的包
$ tcpdump -i any src 10.211.55.10 只抓取10.211.55.10收到的包 $ tcpdump -i any dst 10.211.55.10

4. 过滤端口:port选项

抓取某端口的数据包:例如80
$ tcpdump -i any port 80 如果只想抓取80端口收到的包,可以加dst $ tcpdump -i any dst port 80

5. 过滤指定端口范围内的流量

例如:抓取21到23区间所有端口的流量
$ tcpdump portrange 21-23

6. 显示源/目标 IP 地址和端口号禁用主机与端口解析: -n/-nn 选项

如果不加-n 选项,tcpdump会显示主机名,例如下面的 wzw
$ tcpdump -i eth0 dst port 443 -A
dropped privs to tcpdump
tcpdump: verbose output suppressed, use -v or -vv for full protocol decode
listening on eth0, link-type EN10MB (Ethernet), capture size 262144 bytes
10:21:25.692379 IP 125.35.75.30.61966 > wzw.https: Flags [S], seq 999398260, win 64240, options [mss 1424,nop,wscale 8,nop,nop,sackOK], length 0
# 禁用主机解析
$ tcpdump -i eth0 dst port 443 -n
dropped privs to tcpdump
tcpdump: verbose output suppressed, use -v or -vv for full protocol decode
listening on eth0, link-type EN10MB (Ethernet), capture size 262144 bytes
15:38:09.197330 IP 206.217.203.30.twsdss > 10.0.2.12.https: Flags [S], seq 2969956375, win 64240, options [mss 1400,nop,wscale 7,nop,nop,sackOK], length 0
# 禁用端口解析
$ tcpdump -i eth0 dst port 443 -nn
dropped privs to tcpdump
tcpdump: verbose output suppressed, use -v or -vv for full protocol decode
listening on eth0, link-type EN10MB (Ethernet), capture size 262144 bytes
15:39:20.204319 IP 125.35.75.30.49457 > 10.0.2.12.443: Flags [P.], seq 291444152:291444261, ack 3334257561, win 517, length 109

加上-n选项后,可以看到主机名都已经被替换成了ip
加上-nn选项后,端口不会进行解析,例如https -> 443

7. 过滤协议

如何查看具体协议,可以直接使用,例如udp
$ tcpdump -i any -nn udp

8 使用ASCII格式查看包体内容: -A 选项

使用-A 可以用ASCII打印报文内容,例如常用的HTTP协议传输的JSON、HTML文件等
$ tcpdump -i any -nn port 80 -A

9 显示完整的数据表内容(十六进制和ASCII):-X 选项

与-A对应,-X 用来HEX和ASCII显示报文内容。 $ tcpdump -X

10 限制包大小: -s 选项

当包体很大,可以用-s 选项截取部分报文内容,一般和-A 一起使用。
例如:查看每个包体前500字节, (如何查看所有-s 0)
$ tcpdump -i any -nn port 80 -A -s 500

11 指定抓包数量: -c选项

# 只抓取5个报文 使用-c number命令可以抓取number个报文后退出,在网络包交互非常频繁的服务器上抓包常用。
$ tcpdump -i any -nn port 80 -c 5

12 保存数据报文输出到文件: -w 选项

-w 选项用来把数据报文输出到文件
例如: 将所有80端口的数据输出到文件
$ tcpdump -i any port 80 -w test.pcap
生成的pcap文件就可以用wireshark打开进行更详细的分析
也可以加上-U 强制立即写到本地磁盘,性能稍差,不建议生产环境使用

13 显示绝对的序号: -S 选项

默认情况,tcpdump显示的是从0开始的相对序列号,如何向查看真正的绝对序号,使用-S 选项
$ tcpdump -i any port 80 -nn -S

14 显示更详细的包信息(例如TTL、标志位等): -v 选项

$ tcpdump -i any port 80 -v

15 显示抓包过程中的时间戳: -tttt 选项

$ tcpdump -i any port 80 -tttt 
dropped privs to tcpdump 
tcpdump: verbose output suppressed, use -v or -vv for full protocol decode 
listening on any, link-type LINUX_SLL (Linux cooked v1), capture size 262144 bytes 
2024-03-28 15:50:34.826304 IP ..35450 > wzw.http: Flags [S], seq 2317495119, win 14600, options [mss 1424,nop,wscale 3,nop,nop,sackOK], length 0
---高级技巧
1. 可以使用布尔算法进行组合:and(或&&)/or(或||)/not(或!)
$ tcpdump -i any host 10.211.55.10 and dst port 3306
$ tcpdump -i any src 10.211.55.10 and note dst port 22 
2. 复杂分组 例如:抓取来源ip为10.211.55.10且目标端口为3306或6379的包 
$ tcpdump -i any 'src 10.211.55.10 and (dst port 3306 or 6379)' 
3. 只想显示所有RST包 
$ tcpdump 'tcp[13] & 4 != 0'
---案例:
使用tcpdump获取eth0接口的tomcat请求状态码400的数据,时间是10点到12点,应该如何写?
$ sudo tcpdump -i eth0 'port 80 and dst host <tomcat_ip_address> and tcp[((tcp[12:1] & 0xf0) >> 2):4] = 0x47455420 and tcp[((tcp[12:1] & 0xf0) >> 2)+9:1] = 0x34' -v -w tomcat_requests.pcap 
上述命令中的参数和过滤条件的含义如下: 
- `-i eth0`:指定要监听的网络接口为 eth0。 
- `'port 80 and dst host <tomcat_ip_address>'`:过滤目标端口为 80(HTTP)且目标主机为指定的 Tomcat IP 地址。 
- `tcp[((tcp[12:1] & 0xf0) >> 2):4] = 0x47455420`:匹配 HTTP GET 请求。 
- `tcp[((tcp[12:1] & 0xf0) >> 2)+9:1] = 0x34`:匹配 HTTP 响应状态码为 400。 
- `-v`:显示详细输出。 
- `-w tomcat_requests.pcap`:将捕获的数据保存到名为 tomcat_requests.pcap 的文件中。

Tcpdump使用》有1个想法

发表回复