Linux 命令之 tcpdump

简介

tcpdump 是一款 Linux 平台的抓包工具。它可以抓取涵盖整个 TCP/IP 协议族的数据包,支持针对网络层、协议、主机、端口的过滤,并提供 and、or、not 等逻辑语句来过滤无用的信息.。

安装

1
yum install tcpdump

语法

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
Usage: tcpdump [-aAbdDefhHIJKlLnNOpqStuUvxX#] [ -B size ] [ -c count ]
[ -C file_size ] [ -E algo:secret ] [ -F file ] [ -G seconds ]
[ -i interface ] [ -j tstamptype ] [ -M secret ] [ --number ]
[ -Q|-P in|out|inout ]
[ -r file ] [ -s snaplen ] [ --time-stamp-precision precision ]
[ --immediate-mode ] [ -T type ] [ --version ] [ -V file ]
[ -w file ] [ -W filecount ] [ -y datalinktype ] [ -z postrotate-command ]
[ -Z user ] [ expression ]

常用的命令选项:
-A 只使用 ASCII 打印报文的全部数据,不要和 `-X` 一起使用,获取 http 可以用 `tcpdump -nSA port 80`
-b 在数据链路层上选择协议,包括 ip, arp, rarp, ipx 等
-c 指定要抓取包的数量
-D 列出操作系统所有可以用于抓包的接口
-e 输出链路层报头
-i 指定监听的网卡,`-i any` 显示所有网卡
-n 表示不解析主机名,直接用 IP 显示,默认是用 hostname 显示
-nn 表示不解析主机名和端口,直接用端口号显示,默认显示是端口号对应的服务名
-p 关闭接口的混杂模式
-P 指定抓取的包是流入的包还是流出的,可以指定参数 in, out, inout 等,默认是 inout
-q 快速打印输出,即只输出少量的协议相关信息
-s len 设置要抓取数据包长度为 len,默认只会截取前 96bytes 的内容,`-s 0` 的话,会截取全部内容。
-S 将 TCP 的序列号以绝对值形式输出,而不是相对值
-t 不要打印时间戳
-vv 输出详细信息(比如 tos、ttl、checksum等)
-X 同时用 hex 和 ascii 显示报文内容
-XX 同 -X,但同时显示以太网头部

过滤器

过滤器简单可分为三类:协议(proto)、传输方向(dir)和类型(type)。

一般的 表达式格式 为:tcpdump [options] [not] proto dir type

  • 关于 proto:可选有 ip, arp, rarp, tcp, udp, icmp, ether 等,默认是所有协议的包。
  • 关于 dir:可选有 src, dst, src or dst, src and dst,默认为 src or dst。
  • 关于 type:可选有 host, net, port, portrange(端口范围,比如 21-42),默认为 host。

连接运算符

  • and:所有的条件都满足
  • or:只要满足一个条件
  • not:取反,也可以用!

示例

  1. 抓取主机172.0.0.1的eth0网口的8080、8081端口传输的数据包并保存文件
    tcpdump -i eth0 -s0 port 8080 or port 8081 host 172.0.0.1 -w 1.pcap

  2. 简单查看数据包内容:tcpdump -r 1..pcap

    • 按 crtl+c 停止抓包,当前目录会生成一个1.pcap文件
    • 一般对抓取的数据包用Wireshark工具进行分析

Linux 命令之 tcpdump
https://flepeng.github.io/002-Linux-21-命令-Linux-命令之-tcpdump/
作者
Lepeng
发布于
2021年7月5日
许可协议