what

tcpdump 将网络中传送中的数据包的头完全截获下来提供分析,支持对网络层、协议、主机、网络或端口的过滤,并提供and、or、not等逻辑语句帮助去掉无用信息

  • 使用了独立于系统的libpcap的接口
  • tcpdump将打印网络接口上与自己定义的布尔表达式相匹配的信息包的包头部分
  • -w选项可以将抓包数据保存下来,利用wireshark等工具进一步分析。解码分析时,分析的大部分对象都是16进制,所以一般都会用该参数配合wireshark使用
  • -r选项可以指定从文件中读取抓包数据,而不是从网络接口(网卡)中读取数据包
  • -c选项可以指定tcpdump捕获一定数量的数据包,但是SIGINT(终止进程、ctrl+c)或SIGTERM(软件终止信号、kill(1))可以让tcpdump提前中断
  • -S 将tcp的序列号以绝对值形式输出,默认相对值
  • 可以通过原语来进行针对某一协议、地址、主机或者端口的过滤
  • 使用tcpdump需要有root权限
  • tcpdump调用libpcap的接口在linux系统链路层抓包, linux本身指定的许多访问控制规则都是基于三层或三层以上的过滤规则,所以tcpdump可以抓取过滤规则之前的数据包

tcpdump

tcpdump

tcpdump的Flags代表了这个数据包的用途,这些标记是TCP首部的内容:
[S]:SYN同步标识
[.]:.表示ACK确认标识
[S.]:SYN同步标识,以及确认[S]的ACK
[P.]:PSH,push推送,数据传输
[R.]:RST,连接重置
[F.]:FIN结束连接
[DF]:Don’t Fragment(不要碎裂),当DF=0时,表示允许分片,一般-v时才有这个标识
[FP.]:标记FIN、PUSH、ACK组合,这样做是为了提升网络效率,减少数据来回确认等

使用说明

  1. 监听指定网络接口的数据包

    tcpdump -i eth0
    如果不指定网卡,默认tcpdump只会监视第一个网络接口,一般为eth0

  2. 使标准输出变成缓冲行形式

    tcpdump -i eth0 -l
    确保tcpdump遇到的内容一旦是换行符即将缓冲的内容输出到标准输出,以便于利用管道或重定向方式来进行后续处理。Linux/UNIX的标准I/O提供了全缓冲、行缓冲和无缓冲三种缓冲方式。标准错误是不带缓冲的,终端设备常为行缓冲,而其他情况默认都是全缓冲的。

  3. 指定将每个监听到数据包中的域名转换成IP地址后显示,不把网络地址转换成名字

    tcpdump -i eth0 -i -n

    -nn 指定将每个监听到的数据包中的域名转换成IP、端口从应用名称转换成端口号后显示

  4. 在输出的每一行不打印时间戳

    tcpdump -i eth0 -t

  5. 输出一个稍微详细的信息,例如在ip包中可以包括ttl和服务类型的信息

    tcpdump -i eth0 -v

  6. 在收到指定的包的数目后,tcpdump就会停止

    tcpdump -i eth0 -c 3

  7. 直接将包写入文件中,并不分析和打印出来

    tcpdump -i eth0 -w cp.pcap

    tcpdump -i eth0 -r cp.pcap tcp 从cp.pcap文件中读取数据包tcp

  8. 过滤表达式: 类型、方向、协议

  • 类型关键词: host、net、port、ip proto、protochain
  • 传输方向关键词: src、dst、 dst or src 、dst and src
  • 协议关键词: ether、ip、ip6、arp、rarp、tcp、udp
  • 逻辑运算关键词: not 、!、and、&&、or、||
  • 信息包长度关键词: less、 greater

    查目标机器端口是21或80的网络包

    tcpdump -i eth0 -c 10 dst port 21 or dst port 80
    截获主机172.16.0.11 和主机210.45.123.249或 210.45.123.248的通信
    tcpdump host 172.16.0.11 and (210.45.123.249 or 210.45.123.248)
    获取使用ftp端口和ftp数据端口的网络包
    tcpdump port ftp or ftp-data
    获取主机172.16.0.11除了和主机210.45.123.249之外所有主机通信的ip包
    tcpdump host 172.16.0.11 and ! 210.45.123.249
    抓172.16.0.11的80端口和110和25以外的其他端口的包
    tcpdump host 172.16.0.11 and ! port 80 and !port 110 and ! port 25
    获取172.16.10.11和google.com之间建立TCP三次握手中带有SYN标记位的网络包
    tcpdump -i eth0 ‘host 172.16.10.11 and host google.com and tcp[tcpflags]&tcp-syn!=0’ -c 3 -nn
    基本格式: 协议 + [传输方向] + 类型 + 数值
    抓取ip协议的数据包
    tcpdump -i eth0 -vnn ip proto ip
    tcpdump -i eth0 -vnn ip
    过滤长度大于200字节的报文
    tcpdump -i eth0 greater 200

  1. 防止包截断

    tcpdump -s 0

  2. 以16进制显示包内容

    tcpdump -X

  3. 显示mac地址

    tcpdump -e

  4. 抓取所有经过 en0,目标 MAC 地址是 00:01:02:03:04:05 的 ICMP 数据

    tcpdump -i en0 icmp and ether dst host 00:01:02:03:04:05

  5. 抓取所有经过 en0,目的网络是 192.168,但目的主机不是 192.168.1.200 的 TCP 数据

    tcpdump -i en0 tcp and dst net 192.168 and not dst host 192.168.1.200

  6. 只抓 SYN 包

    tcpdump tcp[tcpflags]=tcp-syn

13 表示 tcp包中第14个字节

抓取FIN包 tcpdump tcp[13] & 1
抓取syn包 tcpdump tcp[13] & 2
抓取rst包 tcpdump tcp[13] & 4
抓取psh包 tcpdump tcp[13] & 8
抓取ack包 tcpdump tcp[13] & 16
抓取urg包 tcpdump tcp[13] & 32

  1. 抓 SYN, ACK

    tcpdump tcp[tcpflags]
    tcpflags 的值: tcp-fin, tcp-syn, tcp-rst, tcppush, tcp-ack, tcp-urg

查看包的详细数据

tcpdump -A host www.baidu.com

高级包头过滤

proto[x:y] : 过滤从x字节开始的y字节数,如ip[2:2]过滤出 3、4字节(第一字节从0开始)

  1. 抓 SMTP 数据,抓取数据区开始为”MAIL”的包,”MAIL”的十六进制为 0x4d41494c

    tcpdump port 25 and tcp[(tcp[12]>>2):4] = 0x4d41494c

  2. 抓 HTTP GET 数据,”GET “的十六进制是 0x47455420

    tcpdump tcp[(tcp[12]>>2) : 4] = 0x47455420

  3. 抓 SSH 返回,”SSH-“的十六进制是 0x5353482D

    tcpdump tcp[(tcp[12]>>2):4] = 0x5353482D

  4. 抓取端口大于1024的tcp数据报

    tcpdump tcp[0:2] > 1024

文档更新时间: 2021-01-29 01:57   作者:周国强