Linux:tcpdump抓包指令

学习自:Linux 网络命令必知必会之 tcpdump,一份完整的抓包指南请查收! - Linux云计算网络 - SegmentFault 思否

tcpdump命令详解_tcpdump抓包命令-CSDN博客

0、常用

本节为常用指令,初学者请从第一节开始看

#监听某个网卡
tcpdump -i eh0
#监听全部网卡
tcpdump -i any

#监听端口8080
tcpdump -i any port 8080

#监听端口8080和主机172.124.36.44(必须用and做连接,因为port和host是等价的)
tcpdum -i any port 8080 and host 182.124.36.44
#输出信息到pcap文件中:
-w tcpdump -i any port 8080 -w /tmp/20240412.pcap #格式化日期 tcpdump tcp -nne port 8080 -w /tmp/$(date +%Y%m%d_%H%M).pcap #指定抓包数量:-c tcpdump -i any -c 50 #以IP:Port的形式显示通信双方, tcpdump -nn #显示双方的mac地址 tcpdump -e #以IP:Port的形式显示通信双方,并显示双方的mac地址 tcpdump -nne #显示相对时间 tcpdump -ttt #显示相对报文序号(seq、ack) tcpdump -S

 问题

1、如果不写-i参数,那么可能会由于使用默认网卡导致抓不到任何包,所以使用tcpdump时请确保使用了-i any或者确认有进入流量的那个网卡。

2、TCP连接开始、结束的判断:

1)由于三次握手、四次挥手不带任何数据,所以抓到的这些包的length为0(如下图,为三次握手),这是区分TCP连接开始和结束的标志。

 2)通过抓包获取到的Flags:S——SYN、F——FIN

S只会出现在三次握手的前2次,F只会出现在四次挥手的1、3次。

 

 

1、用途

tcpdump是一个Linux平台抓包工具。

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

需要注意的是,抓包一般是在nginx服务器上(或者主动发出HTTP请求的那台机器)抓,如果在nginx之下提供服务的机器上抓,可能会抓不到一些异常响应码的HTTP响应包。

2、用法

tcpdump [选项 参数] [not and or] [过滤器 过滤器参数]

3、说明

1)[选项 参数]

不带参数的选项可以一起写,如-nnettt;

选项

参数

(不写代表无参)

说明

-A

 

只用ASCII打印报文的全部数据。

与参数-X冲突。

-b ip、arp、rarp、ipx 数据链路层上选择协议,包括ip、arp、rarp、ipx
-c 数字 抓包数量
-C 数字

保存文件的大小,单位M

常配合-W使用,代表抓取的包构成多少个pcap文件,每个文件大小多少

-D   列出OS所有可用于抓包的接口
-e   显示src和dst的mac地址
-i

网卡名、any

-i 网卡名:指定监听网卡

-i any:监听所有网卡

-n  

不解析主机名,直接用IP显示。

默认用hostname显示。

不带该参数会导致回显很慢。

-nn  

不解析主机名和端口,直接用Port显示。

默认显示Port对应的服务名。

-p   关闭接口的混杂模式
-P

in、out、inout

指定抓取的包是进入还是流出的,可选参数有in、out、inout

默认inout。

-q   快速打印输出,只输出少量的协议相关信息。
-r 某个pcap文件的路径

读取抓包文件

-s 数字

设置要抓取的包长,默认96B。

如果-s 0,会截取全部内容

-S   绝对值形式输出TCP序列号,缺省时以相对值形式输出
-t   不打印时间戳
-tt   显示时间戳
-ttt   显示请求与响应的时间间隔而非绝对时间
-vv   输出详细信息
-w 某个pcap文件的路径

输出到指定pcap文件。

缺省时默认保存在系统的默认路径下。

当指定输出文件时,就不会输出到屏幕了。

-W 数字

抓取多少个pcap文件,配合-C使用

-x   用16进制显示从ip层及以上开始的帧内容
-X   用16进制和ascii显示ip层及以上的报文头
-xx   同-x,但是从数据链路层开始打印
-XX   同-X,但是从数据链路层开始打印
-Z 用户名 用该用户名来执行

2)过滤器

用途:对抓取的包进行过滤,排除无用包

用法:tcpdump [选项 参数] [过滤器 参数]

参数:参数可以是多个合法参数的逻辑组合(使用and、or、!)

类型:

  • proto:协议
  • dir:报文方向
  • type:类型

不同类型的过滤器可以同时使用,但此时需要用逻辑运算符(and、or、!)来表示它们之间的关系

过滤器类型 选项及后跟参数 说明
proto

ip、arp、rarp、tcp、udp、icmp、ether。默认全部。

单独使用,无参

 
dir

src、dst、src and dst、src or dst(默认)

单独使用,无参。

该项不能用于修饰proto,只能用于修饰type
type

host IP

net 网段前缀

port 端口

portrange(端口范围)

 

3)过滤器的例子

①过滤主机:host

a)抓取主机172.18.82.173上所有收到、发出的数据包

tcpdump host 178.18.82.173

b)抓取主机172.18.82.173上经过指定网卡eth0的所有包

tcpdump -i eth0 host 172.18.82.173

3)抓取经过网卡eth0,从主机172.18.82.173发出的包、发往主机172.18.82.173的包

tcpdump -i eth0 src host 172.18.82.173
tcpdump -i eth0 dst host 172.18.82.173

4)抓取200.200.200.1和(200.200.200.2或200.200.200.3)通信的包

抓取200.200.200.1和除了200.200.200.2之外所有主机通信的包

说明:

  • 1)host之后的表达式中要用到逻辑关系;

  • 2)表达式中的特殊符号如括号()需要加转义符,或者用单引号

tcpdump host 200.200.200.1 and \(200.200.200.2 or 200.200.200.3\)
tcpdump host 200.200.200.1 and '(200.200.200.2 or 200.200.200.3)'

tcpdump ip host 200.200.200.1 and ! 200.200.200.2

②筛选端口:Port

tcpdump port 22
tcpdump src port 22
tcpdump dst port 22
tcpdump -i eth0 port 22

#发送到host 172.18.82.173的网卡eth0,接收端口为22的包
tcpdump -i eth0 dst host 172.18.82.173 and port 22

#端口范围
tcpdump portrange 2000-2500

③筛选网段:net

tcpdump net 172.18.82
tcpdump src net 172.18.82
tcpdump dst net 172.18.82

④筛选协议:协议名

tcpdump -i eth0 icmp
tcpdump -i eth0 ip
tcpdump -i eth0 tcp
tcpdump -i eth0 udp
tcpdump -i eth0 arp

协议是双向的,不能用src、dst修饰。

 

4)参数的例子

①-n和-nn

-n:不显示主机名,显示通信协议。将主机名用IP表示。

-nn:不显示主机名和通信协议,将主机名用IP表示,将通信协议用通信端口表示

#只接收一个包
tcpdump -c 1

10:32:45.830452 IP hostname.ssh > 172.29.94.103.57782


#-n
tcpdump -c 1 -n

10:32:45.830452 IP 172.29.198.119.ssh > 172.29.94.103.57782

#-nn
tcpdump -c 1 -n

10:32:45.830452 IP 172.29.198.119.22 > 172.29.94.103.57782

②序列号 -S

TCP通信时有两种序列号,seq和ack

-S代表了以绝对值或相对值的形式显示这两种序列号,通常情况下绝对值序列号会是一个很大的数。

tcpdump -nS
…… seq 2589090780:2589090988 ack 4014984328……

tcpdum -n
…… seq 288:704 ack 1

③包之间的时间间隔:-ttt

 

④逻辑表达式

tcpdump -c 5 tcp and port 22 and dst host 172.29.198.119

如果用到了括号,需要用转义符单引号,其中单引号更方便一些:

tcpdump -i eth0 -nntvv '((dst net 172.18) and (not dst host 172.18.82.173) and (tcp) and (not port 22))'

tcpdump -i eth0 -nntvv \(dst port 22 and host 172.198.10.22 \)

  

4、结合wireshark:-w

tcpdump抓包时,默认打印到屏幕,这在包很多的时候会来不及看清内容。

此时可以用参数-w把抓取到的数据保存到文件:

tcpdump [选项 参数] [过滤选项 参数] -w 文件名.pcap

.pcap文件需要用wireshark工具查看,不能用vim或cat。

有时候我们为了对抓取的包进行区分,通常把文件名中加入时间、日期等变量,此时上式可以写为:

tcpdump 选项 参数 [过滤 参数] /tmp/$(date +%Y%m%d_%H%M).pcap

其中的%Y、%m、%d、%H、%M为各时间项的格式化表示形式(完整版如下)。

%y 两位数的年份表示 (00-99)
%Y 四位数的年份表示 (0000-9999)
%m 月(01-12)
%d 日(0-31)
%H 24小时制小时数(0-23)
%I 12小时制小时数(01-12)
%M 分钟(00-59)
%S 秒(00-59)
%a 星期几,简写
%A 星期几,完整
%b 月份,简写
%B 月份,完整
%c 本地的日期、时间表示
%j 一年第几天 (001-366)
%p 本地A.M.或P.M.等价符
%U 一年第几周(00-53),星期天为一周开始
%w 星期几,数字(0-6%W 一年第几周(00-53),星期一为一周开始
%x 本地日期
%X 本地时间,13:22:44这种形式
%Z 当前时区名称
%% 转义%
%f 微秒

 5、不同协议的输出格式

1)通用格式:时间戳 链路层 arp层 ip层 tcp层 udp层。

2)时间戳

相关选项:-t -tt -ttt

格式:小时 、分钟、带6位小数的秒。

如果用参数-ttt,则显示的是上下两个包之间的时间差。

3)链路层

相关选项:-e -xx -XX

格式:源MAC > 目的MAC,length 链路层总字节

4)IP层

过滤器:icmp

格式:在最后显示tos、ttl、id、offset、flags、proto、length

标识

含义

tos  
ttl

存活时间,代表该包被丢弃前允许通过的最大网段数量。

一般情况下,ttl=64代表直连网络不经过路由器。

id  
offset  
flags 分片标志
proto ip层承载的协议
length  

特点:来包、回包的src、dst的MAC地址互相交换

正常情况下每次交流都伴随着echo requestecho reply交替出现。根据request和reply的id、seq是否一直判断是否通信正常。

当出现超时时,会显示unreachable,可能是host、port、net中某一项出问题导致的:

 当出现没有reply时,多半与防火墙、回程路由有关。

5)arp层

格式:一行Request、一行Reply

过滤器:arp

6)TCP层

格式:src > dst:Flags data seq ack window urgent options

过滤器:tcp

TCP的Flag

Flag 含义
S SYN
F FIN
P PUSH
R RST
U URG
W ECN CWR
E ECN-Echo
. ACK
none  

允许组合,如[S.]就是[SYN+ACK],[R.]就是[RESET+ACK]

问题一般出现在三步握手上,需要注意syn消息是否收到,是否回复syn+ack,ack是否收到。

7)UDP

格式:src的ip:port > dst的ip:port:udp 长度

若收到udp包,但是发出icmp包,说明端口未开放。

 

posted @ 2024-04-15 11:31  ShineLe  阅读(2428)  评论(0编辑  收藏  举报