- 0. 安装
- 1. 基础知识
- (1)常用参数
- (2)显示 ASCII 文本
- (3)根据协议抓包
- (4)根据 IP 抓包
- (5)抓包内容写入文件
- (6)行缓冲模式
- (7)组合过滤器
- 2. 使用示例
- (1)提取 HTTP 用户代理
- (2)仅捕获 HTTP GET 和 POST 数据包
- (3)提取 HTTP 请求的 URL
- (4)在 POST 请求中提取 HTTP 密码
- (5)从服务器和客户端抓包 Cookie
- (6)抓包所有 ICMP 数据包
- (7)非 ECHO/REPLY 的 ICMP 数据包
- (8)抓包 SMTP/POP3 电子邮件
- (9)NTP 的查询和响应的故障排除
- (10)抓包 SNMP 的查询和响应
- (11)抓包 FTP 的凭证和命令
- (12)抓包 IPv6 流量
- (13)检测网络流量中的端口扫描
- (14)抓包非本地主机上的开始和结束的数据包
- (15)抓包 DNS 请求和响应
- (16)抓包 HTTP 数据包
- (17)在 tcpdump 中抓包,在 Wireshark 中查看
- (18)按数据包数量排名主机
- (19)DHCP 示例
0. 安装
// ubuntu
$ apt-get install tcpdump
1. 基础知识
(1)常用参数
$ tcpdump -i ens18 -nn -s0 -v port 80
- -i : 进行抓包的接口,通常使用 ip addr 查看可使用的接口
- -nn : 单个 (n) 不会解析主机名。两个 (nn) 不会解析主机名或端口
- -s0 :抓包大小。 -s0 会将大小设置为无限制
- -v : 详细,使用 (-v) 或 (-vv) 会增加输出中显示更详细信息,通常会显示更多协议特定的信息。
- port 80 :端口过滤器,这里设置的是抓包端口 80 上的流量
(2)显示 ASCII 文本
-A
参数使得输出中包含抓包的 ascii 字符串。这样便于结合 grep 或其他命令解析输出。
另一个可以同时显示十六进制输出和 ascii 的参数是 -X
。
$ tcpdump -A -s0 port 80
(3)根据协议抓包
比如,过滤 UDP 流量,可以指定udp,也可以指定使用协议17
,这两个命令效果一样。TCP 对应的协议是 6
。
$ tcpdump -i eth0 udp
$ tcpdump -i eth0 proto 17
(4)根据 IP 抓包
使用 host 过滤器将同时抓包前往(目标)和来自(源)IP 地址的流量。
$ tcpdump -i eth0 host 10.10.1.1
或者使用 src 或 dst 仅抓包单向流量。
$ tcpdump -i eth0 src 10.10.1.20
$ tcpdump -i eth0 dst 10.10.1.20
(5)抓包内容写入文件
将抓包文件写入磁盘,这样就可以用其它工具,比如 Wireshark 来分析。
$ tcpdump -i ens18 -s0 -w test.pcap
(6)行缓冲模式
指定缓冲模式,比如行缓冲(-l
)或数据包缓冲(-C
),可以让 tcpdump 的输出立即发送到管道命令,在故障排除时立即做出响应。
$ tcpdump -i ens18 -s0 -l port 80 | grep 'Server:'
不指定缓冲模式,有可能会得不到预期的结果。
(7)组合过滤器
在上面的示例中,可以使用使用下面的逻辑符号来组合不同的过滤器。
and or &&
or or ||
not or !
2. 使用示例
(1)提取 HTTP 用户代理
从 HTTP 请求标头中提取 HTTP 用户代理。
$ tcpdump -nn -A -s1500 -l | grep "User-Agent:"
通过使用 egrep 和多个匹配规则,可以从请求中获取用户代理和主机(或任何其他标头)。
$ tcpdump -nn -A -s1500 -l | egrep -i 'User-Agent:|Host:'
(2)仅捕获 HTTP GET 和 POST 数据包
仅指定与 GET 匹配的数据包。
$ tcpdump -s 0 -A -vv 'tcp[((tcp[12:1] & 0xf0) >> 2):4] = 0x47455420'
只选择 POST 请求。
$ tcpdump -s 0 -A -vv 'tcp[((tcp[12:1] & 0xf0) >> 2):4] = 0x504f5354'
注意,使用此过滤器抓包的数据中可能不包含 POST 数据,因为POST 请求很可能会被拆分为多个 TCP 数据包。上面的表达式中的十六进制是与 GET 和 POST 请求中的 ascii 对应的。
(3)提取 HTTP 请求的 URL
从流量中解析主机和 HTTP 请求位置。如果服务不在80 端口,则需要指定端口。
$ tcpdump -s 0 -v -n -l | egrep -i "POST /|GET /|Host:"
(4)在 POST 请求中提取 HTTP 密码
$ tcpdump -s 0 -A -n -l | egrep -i "POST /|pwd=|passwd=|password=|Host:"
(5)从服务器和客户端抓包 Cookie
通过搜索 Set-Cookie(来自服务器)和 Cookie(来自客户端)来抓包 cookie
$ tcpdump -nn -A -s0 -l | egrep -i 'Set-Cookie|Host:|Cookie:'
(6)抓包所有 ICMP 数据包
$ tcpdump -n icmp
(7)非 ECHO/REPLY 的 ICMP 数据包
对 icmp 类型进行过滤,以选择非标准 ping 包的 icmp 包。
$ tcpdump 'icmp[icmptype] != icmp-echo and icmp[icmptype] != icmp-echoreply'
(8)抓包 SMTP/POP3 电子邮件
可以提取电子邮件正文和其他数据,下面的例子中仅解析电子邮件收件人。
$ tcpdump -nn -l port 25 | grep -i 'MAIL FROM\|RCPT TO'
(9)NTP 的查询和响应的故障排除
NTP 的查询和响应的故障排除
$ tcpdump dst port 123
(10)抓包 SNMP 的查询和响应
$ tcpdump -n -s0 port 161 and udp
(11)抓包 FTP 的凭证和命令
$ tcpdump -nn -v port ftp or ftp-data
(12)抓包 IPv6 流量
$ tcpdump -nn ip6 proto 6
$ tcpdump -nr ipv6-test.pcap ip6 proto 17 // 从先前保存的抓包文件中读取UDP 的 IPv6 流量
(13)检测网络流量中的端口扫描
$ tcpdump -nn
(14)抓包非本地主机上的开始和结束的数据包
通过选择 tcp-syn 和 tcp-fin 数据包,可以显示每个已建立的 TCP 会话,其中包含时间戳,但不包含数据。
$ tcpdump 'tcp[tcpflags] & (tcp-syn|tcp-fin) != 0 and not src and dst net localnet'
(15)抓包 DNS 请求和响应
比如下面的示例中可以看到对 Google 公共 DNS 的出站 DNS 请求和 A 记录(IP 地址)响应。
$ tcpdump -i wlp58s0 -s0 port 53
(16)抓包 HTTP 数据包
仅抓包端口 80 上的 HTTP 流量,避免抓包 TCP 会话 (SYN / FIN / ACK)。
$ tcpdump 'tcp port 80 and (((ip[2:2] - ((ip[0]&0xf)<<2)) - ((tcp[12]&0xf0)>>2)) != 0)'
(17)在 tcpdump 中抓包,在 Wireshark 中查看
一般方法是通过tcpdump抓包之后保存成文件,再将文件拷贝到Wireshark中查看。不过,除此之外,还可以通过 SSH 连接将抓包的内容实时提供给 Wireshark。不要忘记 not port 22 ,加上这个就不会捕获 SSH 流量了。
$ ssh root@remotesystem 'tcpdump -s0 -c 1000 -nn -w - not port 22' | wireshark -k -i -
(18)按数据包数量排名主机
列出一段时间内或数据包数量最多的通话者。使用简单的命令行字段提取来获取 IP 地址,对出现的次数进行排序和计数。用于排序和计数的流量与计数参数 -c相关。
$ tcpdump -nnn -t -c 200 | cut -f 1,2,3,4 -d '.' | sort | uniq -c | sort -nr | head -n 20
(19)DHCP 示例
监视 DHCP 请求和回复, DHCP 请求在端口 67 上显示,回复在端口 68 上显示。
使用参数 -v 可以查看协议选项和其他详细信息。
$ tcpdump -v -n port 67 or 68
最后编辑:jackzang 更新时间:2025-01-26 19:36