Linux教程网

一定要了解的tcpdump命令实用技巧

常见抓包用法

1. 抓取指定主机的网络包

1
tcpdump -ni eth0 host 192.168.1.100 

eth0网卡上抓与主机192.168.1.100相关的数据包,默认直接将数据包打印到屏幕上。

2. 抓取指定端口的网络包

1
tcpdump -ni eth0 dst port 443

eth0网卡上抓目的端口为443的数据包,直接打印在屏幕上。

3. 抓取指定数量的数据包

1
tcpdump -ni eth0 host 192.168.1.100 -c 1024

指定-c参数,抓取 1024 个数据包就停止

4. 抓包并以文本方式打印显式

1
tcpdump -ni eth0 port 80 -A

指定-A选项,将以ASCII格式打印数据包的应用层内容,比如 HTTP 请求就很方便打印可见内容。

常见选项总结

一、基础选项参数

  • -i:指定从哪个网卡抓包,any 表示抓所有网卡;
  • -n:不解析主机和端口为名称,不指定会影响抓包性能;
  • -c:指定抓包的数量,抓够就停止;
  • -s:指定抓包数据包最大长度,0表示抓取完整数据包,不指定使用默认的最大值
  • -D:列出可用于抓包的接口
  • -w:将抓包数据保存在文件中
  • -r:从文件中读取数据
  • -C:指定文件大小,与-w配合使用
  • -F:从文件中读取抓包的表达式;
  • -P:指定要抓取的包是流入还是流出,取值inoutinout

二、输出选项

  • -A:以 ASCII 格式打印数据包的应用层内容;
  • -x:以十六进制格式打印数据包,不包括链路层;
  • xx:以十六进制格式打印数据包,包括链路层;
  • -X:以十六进制和 ASCII 格式打印数据包,不包括链路层;
  • XX:以十六进制和 ASCII 格式打印数据包,包括链路层;
  • -e:输出信息中包含数据链路层头部信息
  • -t:显式时间戳,tttt显示更详细的时间
  • -v:显式详细的报文信息,v越多显示越详细

过滤表达式

一、操作对象

  • type:表示对象的类型
    • hostnetportportrange 如果不指定默认是host
  • dir:表示传输的方向
    • srcdst
  • proto:表示协议
    • etheripip6arpicmptcpudp

二、组合条件

  • or:表示或操作
  • and:表示与操作
  • not:表示非操作

三、表达式示例

  • host 192.168.1.100:抓取 目的地址源地址192.168.1.100的数据包;
  • src host 192.168.1.100:抓取 源地址192.168.1.100的数据;
  • dst host 192.168.1.200:抓取 目的地址192.168.1.200的数据;
  • port 443:抓取 源端口目的端口443的数据包;
  • src port 339:抓取 源端口339的数据包;
  • dst port 443:抓取 目的端口443的数据包;
  • net 192.168.1.0/24:抓取指定网段的数据包;
  • portrange 900-905:抓取指定端口范围的数据包;

组合条件用法

1. 抓取指定主机和端口的数据包

1
tcpdump -ni eth0 src host 192.168.1.100 and dst port 80

抓取源地址为192.168.1.100且目标端口为80的数据包。

2. 抓取指定主机但非 ssh 数据包

1
tcpdump -ni eth0 host 192.168.1.100 and not dst port 22

3. 指定复杂与或逻辑过滤数据包

1
tcpdump -ni eth0 'host 192.168.1.100 and (dst port 3389 or 22)'

抓取主机为192.168.1.100且非3389和非22端口的数据包,注意这里要加单引号,括号是特殊符号。

报文字段过滤

1. 仅抓取TCP连接中的SYN数据包

1
tcpdump -ni eth0 'tcp[tcpflags] & (tcp-syn) != 0'

2. 仅抓取TCP连接中的RST数据包

1
tcpdump -ni eth0 'tcp[tcpflags] & (tcp-rst) != 0'

3. 仅抓取TCP连接中的FIN数据包

1
tcpdump -ni eth0 'tcp[tcpflags] & (tcp-fin) != 0'

4. 抓取TCP连接中的SYNFIN

1
tcpdump -ni eth0 'tcp[tcpflags] & (tcp-syn|tcp-fin) != 0'

5. 抓取 TCP 连接中包含数据,非SYNFINACK等数据包

1
tcpdump -ni eth0 '((ip[2:2] - ((ip[0]&0xf)<<2)) - ((tcp[12]&0xf0)>>2)) != 0'
  • ip[2:2] IP 包第 3-4 个字节(16 位总长度)
  • (ip[0]&0xf)<<2 IP 包第 1 字节低 4 位,最后结果乘以 4
  • (tcp[12]&0xf0)>>2 TCP 包第 13 字节高 4 位(数据偏移)x 4,实际应用数据长度。

6. 仅抓取 HTTP 报文

1
2
3
4
5
6
7
# 应用数据前四个字符是 'GET '
tcpdump -ni eth0 'tcp[((tcp[12:1]&0xf0)>>2):4] = 0x47455420'
# 应用数据前四个字符是 'POST'
tcpdump -ni eth0 'tcp[((tcp[12:1]&0xf0)>>2):4] = 0x504f5354'
# 应用数据前四个字符是 'HTTP'
tcpdump -ni eth0 'tcp[((tcp[12:1]&0xf0)>>2):4] = 0x48545450'
# PUT:0x50555420 DELETE:0x44454C45

专题:

本文发表于 2024-12-02,最后修改于 2025-10-03。

本站永久域名「 golinuxblog.com 」,也可搜索「 Linux教程网 」找到我。


上一篇 « 使用knot搭建DNS域名服务 下一篇 » Linux系统性能分析利器lsof

推荐阅读

Big Image