安装
$ sudo yum install tcpdump
常用参数
-i interface
: 设置抓取的网卡名(可以使用-i any
抓取所有网卡的数据包)
tcpdump -i eth0
-D
: 列出可用的网卡列表
$ sudo tcpdump -D
1.eth0
2.nflog (Linux netfilter log (NFLOG) interface)
3.nfqueue (Linux netfilter queue (NFQUEUE) interface)
4.usbmon1 (USB bus number 1)
5.any (Pseudo-device that captures on all interfaces)
6.lo
-w file
: 把捕获的包数据写入到文件中(可以使用-w -
输出到标准输出)
tcpdump -i eth0 -w debug.cap
-C size
: 使用-w
写入文件时,限制文件的最大大小,超出时新开一个文件(单位是 1,000,000 bytes)
$ sudo tcpdump -i eth0 -w debug.cap -C 1
$ ls debug* -l
-rw-r--r-- 1 tcpdump tcpdump 1000956 Jan 14 10:16 debug.cap
-rw-r--r-- 1 tcpdump tcpdump 1000323 Jan 14 10:32 debug.cap1
-rw-r--r-- 1 tcpdump tcpdump 1000017 Jan 14 10:51 debug.cap2
-rw-r--r-- 1 tcpdump tcpdump 970705 Jan 14 11:08 debug.cap3
-r file
: 从文件中读取包数据
tcpdump -r debug.cap
-v
: 启用 verbose output,抓包时输出包的附加信息(可以使用多个-v
:-v
,-vv
,-vvv
多个v
会显示更多更详细的信息)
tcpdump -v
tcpdump -vv
-A
: 以 ASCII 码方式显示每一个数据包(不会显示数据包中链路层头部信息). 在抓取包含网页数据的数据包时, 可方便查看数据-x
: 打印每个包的头部数据, 同时会以16进制打印出每个包的数据(但不包括连接层的头部)-xx
: 打印每个包的头部数据, 同时会以16进制打印出每个包的数据, 其中包括数据链路层的头部-X
: 打印每个包的头部数据, 同时会以16进制和 ASCII 码形式打印出每个包的数据(但不包括连接层的头部)-XX
: 打印每个包的头部数据, 同时会以16进制和 ASCII 码形式打印出每个包的数据, 其中包括数据链路层的头部-c count
: 设置抓取到多少个包后就退出
tcpdump -i eth0 -c 100
-n
: 不要把地址转换为主机名(直接显示 ip 不要解析为域名)
tcpdump -n
-nn
: 不要把转换协议和端口号(直接显示协议和端口号,不要转换为协议名称,比如 http)
tcpdump -nn
-s snaplen
: 设置 tcpdump 的数据包抓取长度为 snaplen , 为 0 时表示让 tcpdump 自动选择合适的长度来抓取数据包.
tcpdump -s 0
-S
: 打印TCP 数据包的顺序号时, 使用绝对的顺序号, 而不是相对的顺序号.
tcpdump -S
-Z user
: 使tcpdump 放弃自己的超级权限(如果以root用户启动tcpdump, tcpdump将会有超级用户权限), 并把当前tcpdump的用户ID设置为user, 组ID设置为user首要所属组的ID
sudo tcpdump -Z user2
常用的参数组合:
sudo tcpdump -i eth0 -nnS -s 0 -c 100 -Avvv [<expression>]
sudo tcpdump -i eth0 -nnS -s 1024 -c 100 -Avvv [<expression>]
sudo tcpdump -i eth0 -nnS -s 1024 -C 10 -c 10000 -v -w debug.cap [<expression>]
默认 tcpdump 会抓取所有的数据,可以通过指定过滤规则来过滤数据包。
过滤筛选
网卡过滤
指定eth1网卡
tcpdump -i eth1
所有网卡
tcpdump -i any
主机过滤
要获取指定 IP 的数据包,不管是作为源地址还是目的地址,使用下面命令:
tcpdump host 192.168.3.7
要指定 IP 地址是源地址或是目的地址则使用:
tcpdump src 192.168.1.100
tcpdump dst 192.168.1.100
或者
tcpdump src host 192.168.1.100
tcpdump dst host 192.168.1.100
网段过滤
tcpdump -i eth1 net 192.168
tcpdump -i eth1 src net 192.168
tcpdump -i eth1 dst net 192.168
端口过滤
tcpdump port 22
tcpdump src port 22
tcpdump dst port 22
端口范围过滤
tcpdump portrange 22-125
协议过滤
tcpdump -i eth1 arp
tcpdump -i eth1 ip
tcpdump -i eth1 tcp
tcpdump -i eth1 udp
tcpdump -i eth1 icmp
常用表达式
非 : ! or "not" (去掉双引号)
且 : && or "and"
或 : || or "or"
我们还可以使用“与” (and
,&&
)、“或” (or
,||
) 和“非”(not
,!
) 来将两个条件组合起来。当我们需要基于某些条件来分析网络报文是非常有用。
写入读取文件
将捕获的包写入文件
tcpdump -i eth1 -w file.cap
读取tcpdump写入的文件
tcpdump -r file.cap
当然,一般都是下载下来使用Wireshark查看
具体案例
tcpdump tcp -i eth1 -t -s 0 -c 100 and dst port ! 22 and src net 192.168.1.0/24 -w ./target.cap