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 request与echo 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包,说明端口未开放。