捕获和分析网络数据包 tcpdump
基本语法
tcpdump [options] expression
[options]:指定各种选项来控制 tcpdump 的行为。
expression:指定过滤表达式来筛选捕获的数据包。
常用选项
-i interface:指定要监听的网络接口。例如,-i eth0 表示监听 eth0 接口。
-n:不进行域名解析,显示原始的 IP 地址和端口号。
-nn:不进行域名解析,也不进行端口号解析。
-v:增加输出的详细程度。
-vv:进一步增加输出的详细程度。
-c count:指定捕获的最大数据包数。
-w filename:将捕获的数据包写入文件而不进行分析。
-r filename:从文件中读取数据包进行分析。
-A:显示数据包的 ASCII 负载。
-X:显示数据包的十六进制和 ASCII 负载。
-l:将输出缓冲到标准输出,便于重定向到文件。
-tt:显示时间戳而不打印日期和时间。
-T:指定输出格式,例如 -T fields 可以显示特定字段。
过滤表达式
tcpdump 支持丰富的过滤表达式,用于筛选捕获的数据包。以下是一些常用的过滤条件:
host:匹配特定主机。
host 192.168.1.1:匹配源地址或目的地址为 192.168.1.1 的数据包。
src:匹配源地址。
src 192.168.1.1:匹配源地址为 192.168.1.1 的数据包。
dst:匹配目的地址。
dst 192.168.1.1:匹配目的地址为 192.168.1.1 的数据包。
port:匹配端口号。
port 80:匹配端口号为 80 的数据包。
tcp:匹配 TCP 协议。
tcp:匹配所有 TCP 数据包。
udp:匹配 UDP 协议。
udp:匹配所有 UDP 数据包。
icmp:匹配 ICMP 协议。
icmp:匹配所有 ICMP 数据包。
逻辑运算符:
and:逻辑与。
or:逻辑或。
not:逻辑非。
示例命令
捕获特定接口上的所有数据包
tcpdump -i eth0
捕获特定接口上的前 100 个数据包
tcpdump -i eth0 -c 100
捕获并写入文件
tcpdump -i eth0 -w capture.pcap
从文件中读取并解析数据包
tcpdump -r capture.pcap
捕获并显示详细信息
tcpdump -i eth0 -v
捕获并显示十六进制和 ASCII 负载
tcpdump -i eth0 -X
捕获并显示特定字段
tcpdump -i eth0 -T fields -e frame.time -e ip.src -e ip.dst -e tcp.srcport -e tcp.dstport
捕获并过滤特定条件
tcpdump -i eth0 'host 192.168.1.1 and port 80'
捕获并过滤多个条件
tcpdump -i eth0 'host 192.168.1.1 and (tcp or udp)'
捕获所有网络流量:
tcpdump -i any
捕获特定网络接口(如 eth0)上的所有流量:
tcpdump -i eth0
只捕获发送给本地主机的流量:
tcpdump -i eth0 host localhost
捕获指定端口的流量:
tcpdump -i eth0 port 80
将捕获的数据包写入文件而不显示:
tcpdump -i eth0 -w capturefile.pcap
从之前保存的 pcap 文件中读取数据包并显示:
tcpdump -r capturefile.pcap
捕获指定 IP 地址的流量,并将其重定向到文件中(-c 0 表示无限期地捕获数据包,直到你手动停止它)
tcpdump -i eth0 'host 192.168.1.100' -c 0 -w ip_traffic.pcap
读取 pcap 文件中的数据包,然后使用 grep 过滤出包含特定 IP 的行,最后用 awk 提取出 IP 地址,并将它们输出到 ip_addresses.txt 文件中
tcpdump -r ip_traffic.pcap | grep '192.168.1.100' | awk '{print $3}' > ip_addresses.txt
统计特定 IP 地址出现的次数
sort ip_addresses.txt | uniq -c | grep '192.168.1.100'
统计在给定的 pcap 文件 all.pcap 中,特定 IP 地址 xxx 出现的次数
tcpdump -tt -r all.pacp -A |grep 'xxx'|wc -l
示例脚本
为了进一步简化操作,你可以将 tcpdump 命令封装到一个脚本中:
#!/bin/bash
#检查是否提供了足够的参数
if [ "$#" -ne 3 ]; then
echo "Usage: $0 <interface> <pcap_file> <search_string>"
exit 1
fi
INTERFACE="$1"
PCAP_FILE="$2"
SEARCH_STRING="$3"
#捕获数据包并写入文件
tcpdump -i "$INTERFACE" -w "$PCAP_FILE"
#从文件中读取数据包并搜索包含特定字符串的数据包数量
tcpdump -tt -r "$PCAP_FILE" -A | grep "$SEARCH_STRING" | wc -l
使用说明
将上述脚本保存为文件,例如命名为 capture_and_search.sh。 给予脚本执行权限:
chmod +x capture_and_search.sh
执行脚本,并传入网络接口、文件名和要搜索的字符串:
./capture_and_search.sh eth0 capture.pcap xx