菜单
本页目录

捕获和分析网络数据包 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