Linux命令--tcpdump命令--使用与详解

原文网址:Linux命令--tcpdump命令--使用与详解_IT利刃出鞘的博客-CSDN博客

简介

本文介绍Linux的tcpdump命令的用法。

tcpdump可以输出网络的通信记录,可以用来排查问题、查看被攻击网站的详细情况等。

示例

捕获eth0的数据包

tcpdump -i ens33

捕获从指定ip进来的数据包

tcpdump -i ens33 src 192.168.1.1

获取本机123端口的UDP协议包 

tcpdump udp port 123

在eth0口抓取dhcp所有报文,并详细输出

tcpdump -i ens33 -s 0 'udp and port 67 and port 68' -XX -vvv -nn

捕获协议类型为tcp,80端口的包 

tcpdump -nni ens33 'tcp port 80' 

截获主机210.27.48.1 和主机210.27.48.2 或210.27.48.3的通信

tcpdump host 210.27.48.1 and \(210.27.48.2 or 210.27.48.3 \)

指捕获SYN(TCP握手请求) 

tcpdump -i ens33 'tcp[tcpflags] = tcp-syn'

也可以这么写:

tcpdump -i ens33 'tcp[tcpflags] & tcp-syn != 0'

抓SYN, ACK(可以用来查看http三次握手)

tcpdump -i ens33 'tcp[tcpflags] & tcp-syn != 0 and tcp[tcpflags] & tcp-ack != 0'

监视指定网络的数据包

如本机与192.168网段通信的数据包,"-c 10"表示只抓取10个包 

tcpdump -i ens33 -c 10 net 192.168

使用tcpdump抓取HTTP包 

tcpdump -i ens33 tcp[20:2]=0x4745 or tcp[20:2]=0x504f

tcp[20:2]=0x4745 为HTTP-GET 请求,0x504f为HTTP-POST请求,利用该条命令抓取HTTP的GET和POST请求。 

解析包数据

tcpdump -c 2 -q -XX -vvv -nn -i ens33 tcp port 22

命令格式

tcpdump [option] [proto] [dirction] [type]
  • option:选项
  • proto:协议过滤器
    • 可识别的关键词有:http,tcp,udp,icmp,ip,ip6,arp,rarp
  • type:类型过滤器。
    • 可识别的关键词有:host,net,port,portrange。这些词后面还需要再接参数
  • directiron:数据流向过滤器
    • 可识别的关键字有:src,dst,src or dst

选项

  • -A:以ASCII码方式显示每一个数据包(不显示链路层头部信息). 在抓取包含网页数据的数据包时, 可方便查看数据;
  • -c:tcpdump 到捕获 count 个包就退出;
  • -C:file-size,tcpdump在把原始数据包直接保存到文件中之前, 检查此文件大小是否超过file-size,如果超过了, 将关闭此文件,另创一个文件继续用于原始数据包的记录,新创建的文件名与-w选项指定的文件名一致,但文件名后多了一个数字,该数字会从1开始随着新创建文件的增多而增加,file-size的单位是百万字节(这里指1,000,000个字节,并非1,048,576个字节,后者是以1024字节为1k, 1024k字节为1M计算所得,即1M=1024 * 1024 = 1,048,576);
  • -d:打印出易读的包匹配码;
  • -dd:以C语言的形式打印出包匹配码
  • -ddd:以十进制数的形式打印出包匹配码
  • -D:显示所有可用网络接口的列表;
  • -e:每行的打印输出中将包括数据包的数据链路层头部信息;
  • -E:解析IPSEC数据;
  • -F:使用file 文件作为过滤条件表达式的输入,此时命令行上的输入将被忽略;
  • -i:指定的网卡接口。若不带-i参数,默认监视第一个网络接口(非lo口)上的数据包。
    • 查看某个网卡(比如ens33):tcpdump -i ens33
    • 查看所有网卡的方法:-i any;
  • -n:不把ip转化成域名,直接显示 ip;
  • -nn:不把协议和端口号转化成域名;
    • 这样不仅方便查看 IP 和端口号,而且非常高效,因为域名解析会降低抓取速度。
  • -N:不打印出host 的域名部分。
    • 比如:如果设置了此选现,tcpdump 将会打印'nic' 而不是 'nic.ddn.mil'。
  • -l:基于行的输出,便于保存查看,或者交给其它工具分析;
  • -L:列出指定网络接口所支持的数据链路层的类型后退出;
  • -q:简洁地打印输出。即打印很少的协议相关信息, 从而输出行都比较简短;
  • -Q:选择是入方向还是出方向的数据包,可选项有:in, out, inout;
  • -r:从文件中读取数据。也可使用参数过滤。
    • 例1:tcpdump icmp -r all.pcap
    • 例2:tcpdump icmp -r all.pcap -A -s 0
  • -s:tcpdump默认只会截取前96字节的内容,要想截取所有的报文内容,可以使用 -s number,number就是你要截取的报文字节数,如果是0的话,表示截取报文全部内容。
  • -S:使用绝对序列号,而不是相对序列号。
  • -t:在每行的输出中不输出时间;
  • -tt:在每行的输出中输出时间戳;
  • -ttt:输出时,每两行打印会延迟一段时间(以毫秒为单位);
  • -tttt:在每行打印的时间戳之前添加日期的打印(此选项输出的时间最直观);
  • -v:产生详细的输出。比如:包的TTL,id标识,数据包长度,以及IP包的一些选项。还会打开一些附加的包完整性检测,比如对IP或ICMP包头部的校验和;
  • -vv:产生比-v更详细的输出。比如:打印NFS回应包中的附加域将,解码SMB数据包。
  • -vvv:产生比-vv更详细的输出。比如 telent 时所使用的各种扩展选项都会被打印,如果telnet同时使用的是图形界面,其相应的图形选项将会以16进制的方式打印出来。
  • -w:将 tcpdump 抓到的数据生成到文件。生成的文件可以用wireshark等分析。
    • 例如:tcpdump icmp -w icmp.pcap
  • -x:以16进制的形式打印每个包的头部数据(但不包括数据链路层的头部);
  • -xx:以16进制的形式打印每个包的头部数据(包括数据链路层的头部);
  • -X:以16进制和 ASCII码形式打印出每个包的数据(但不包括连接层的头部);
  • -XX:以16进制和 ASCII码形式打印出每个包的数据(包括连接层的头部);
  • -Z:后接用户名,在抓包时会受到权限的限制。如果以root用户启动tcpdump,tcpdump将会有超级用户权限;

结果的含义

输出示例

21:26:49.013621 IP 172.20.20.1.15605 > 172.20.20.2.5920: Flags [P.], seq 49:97, ack 106048, win 4723, length 48
  • 第一列:时分秒毫秒 21:26:49.013621
  • 第二列:网络协议 IP
  • 第三列:发送方的ip地址+端口号,其中172.20.20.1是 ip,而15605 是端口号
  • 第四列:箭头 >, 表示数据流向
  • 第五列:接收方的ip地址+端口号,其中 172.20.20.2 是 ip,而5920 是端口号
  • 第六列:冒号
  • 第七列:数据包内容,包括Flags 标识符,seq 号,ack 号,win 窗口,数据长度 length,其中 [P.] 表示 PUSH 标志位为 1,更多标识符见下面

Flags 标识符

使用 tcpdump 抓包后,会遇到的 TCP 报文 Flags,有以下几种:

  • [S] : SYN(开始连接)
  • [P] : PSH(推送数据)
  • [F] : FIN (结束连接)
  • [R] : RST(重置连接)
  • [.] : 没有 Flag (意思是除上面四种类型外的其他情况,有可能是 ACK 也有可能是 URG)

过滤规则

常用规则

基于主机(host)过滤

tcpdump host 210.21.48.1
tcpdump host www.baidu.com

数据包的 ip 可以再细分为源ip和目标ip两种

# 根据源ip进行过滤
tcpdump -i eth2 src 192.168.10.100# 根据目标ip进行过滤
tcpdump -i eth2 dst 192.168.10.200

基于网段(net)过滤

若你的ip范围是一个网段,可以直接这样指定 

tcpdump net 192.168.10.0/24

网段同样可以再细分为源网段和目标网段

# 根据源网段进行过滤
tcpdump src net 192.168# 根据目标网段进行过滤
tcpdump dst net 192.168

基于端口(port)过滤

使用 port 可以指定特定端口进行过滤

tcpdump port 8088

端口同样可以再细分为源端口,目标端口

# 根据源端口进行过滤
tcpdump src port 8088# 根据目标端口进行过滤
tcpdump dst port 8088

同时指定两个端口(下边两个方法都可以):

tcpdump port 80 or port 8088
tcpdump port 80 or 8088

指定端口范围:

tcpdump portrange 8000-8080

也是可以指定源和目标:

tcpdump src portrange 8000-8080
tcpdump dst portrange 8000-8080

对于一些常见协议的默认端口,可以直接使用协议名,比如 http == 80,https == 443 等:

tcpdump tcp port http

基于协议(proto)过滤

只查看 icmp 的包:

tcpdump icmp

protocol 可选值:tcp, udp, icmp, http, ip,ipv6, arp, rarp, atalk, aarp, decnet, sca, lat, mopdl, moprc, iso, stp, ipx, or netbeui 

基于IP协议的版本进行过滤

查看 tcp 的包,也许会这样写:tcpdump tcp,这样会包括IPV4和IPV6的。

指定IPV4的tcp包的方法(数字 6 表示的是 tcp 在ip报文中的编号):

tcpdump 'ip proto tcp'
tcpdump ip proto 6
tcpdump 'ip protochain tcp'
tcpdump ip protochain 6

指定IPV6的tcp包的方法:

tcpdump 'ip6 proto tcp'
tcpdump ip6 proto 6
tcpdump 'ip6 protochain tcp'
tcpdump ip6 protochain 6

关于上面这几个命令示例,有两点需要注意:

跟在 proto 和 protochain 后面的如果是 tcp, udp, icmp ,那么过滤器需要用引号包含,这是因为 tcp,udp, icmp 是 tcpdump 的关键字。

规则组合

支持如下逻辑操作符:

  • and:所有的条件都需要满足。也可以表示为 &&
  • or:只要有一个条件满足就可以。也可以表示为 ||
  • not:取反。也可以使用 !

例1:来自10.5.2.3,发往任意主机的3389端口的包

tcpdump src 10.5.2.3 and dst port 3389

例2:主机10.0.16.10和主机1.15.63.152或1.15.63.153的通信 

tcpdump -i eth0 host 10.0.16.10 and (1.15.63.152 or 1.15.63.153)

使用多个过滤器进行组合时,有可能需要用到括号,而括号在 shell 中是特殊符号,因为你需要使用引号将其包含。例子如下:

tcpdump 'src 10.0.2.4 and (dst port 3389 or 22)'

在单个过滤器里,常常会判断一条件是否成立,这时候,就要使用下面的符号

  • =:判断二者相等
  • ==:判断二者相等
  • !=:判断二者不相等

当你使用这两个符号时,tcpdump 还提供了一些关键字的接口来方便我们进行判断,比如

  • if:表示网卡接口名、
  • proc:表示进程名
  • pid:表示进程 id
  • svc:表示 service class
  • dir:表示方向,in 和 out
  • eproc:表示 effective process name
  • epid:表示 effective process ID

比如我现在要过滤来自进程名为 nc 发出的流经 en0 网卡的数据包,或者不流经 en0 的入方向数据包,可以这样写:

tcpdump "( if=en0 and proc =nc ) || (if != en0 and dir=in)"

其他示例 

例1:接口eth0,协议tcp,端口为80,目的ip为 1.15.63.151 和 1.15.63.152

tcpdump -i eth0 '((tcp) and (port 80) and ((dst host 1.15.63.151) or (dst host 1.15.63.152)))'

例2:接口eth0,协议为tcp,网络为1.15.63,但不为  1.15.63.152 端口

tcpdump -i eth0 '((tcp) and ((dst net 1.15.63) and (not dst host 1.15.63.152)))'

高级过滤

可以从包头过滤信息,例如:

proto[x:y]          : 过滤从x字节开始的y字节数。比如ip[2:2]过滤出3、4字节(第一字节从0开始排)
proto[x:y] & z = 0  : proto[x:y]和z的与操作为0
proto[x:y] & z !=0  : proto[x:y]和z的与操作不为0
proto[x:y] & z = z  : proto[x:y]和z的与操作为z
proto[x:y] = z      : proto[x:y]等于z

支持的操作符:

>, <, >=, <=, =, !=

IP头(IPV4)

0                   1                   2                   3
0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|Version|  IHL  |Type of Service|          Total Length         |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|         Identification        |Flags|      Fragment Offset    |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|  Time to Live |    Protocol   |         Header Checksum       |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|                       Source Address                          |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|                    Destination Address                        |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|                    Options                    |    Padding    | <-- optional
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|                            DATA ...                           |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
/*IP头定义,共20个字节*/
typedef struct _IP_HEADER
{char m_cVersionAndHeaderLen;       //版本信息(前4位),头长度(后4位)char m_cTypeOfService;           // 服务类型8位short m_sTotalLenOfPacket;        //数据包长度short m_sPacketID;             //数据包标识short m_sSliceinfo;            //分片使用char m_cTTL;                 //存活时间char m_cTypeOfProtocol;         //协议类型short m_sCheckSum;             //校验和unsigned int m_uiSourIp;         //源ipunsigned int m_uiDestIp;         //目的ip
} __attribute__((packed))IP_HEADER, *PIP_HEADER ;

抓取特定包头实例

抓取源端口大于1024的TCP数据包

tcpdump -i eth1 'tcp[0:2] > 1024'

只抓SYN包,第十四字节是二进制的00000010,也就是十进制的2

tcpdump -i eth1 'tcp[13] = 2'

抓SYN, ACK (00010010 即十进制的18)

tcpdump -i eth1 'tcp[13] = 18'

抓所有包含FIN标记的包(FIN通常和ACK一起,表示会话结束)

tcpdump -i eth1 'tcp[13] & 1 = 1'

抓RST

tcpdump -i eth1 'tcp[13] & 4 = 4'

常用的字段偏移名字

tcpdump考虑了一些数字恐惧症者的需求,提供了部分常用的字段偏移名字:

  • icmptype (ICMP类型字段)
  • icmpcode (ICMP符号字段)
  • tcpflags (TCP标记字段)

TCP标记值:

tcp-fin, tcp-syn, tcp-rst, tcp-push, tcp-push, tcp-ack, tcp-urg

这样上面按照TCP标记位抓包的就可以写直观的表达式了:

抓SYN包

tcpdump -i ens33 'tcp[tcpflags] = tcp-syn'

使用tcpdump抓取HTTP的GET包

tcpdump -XvvennSs 0 -i ens33 tcp[20:2]=0x4745 or tcp[20:2]=0x4854

0x4745 为"GET"前两个字母"GE",0x4854 为"HTTP"前两个字母"HT"。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/833407.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

GORM的常见命令

文章目录 一、什么是GORM&#xff1f;二、GORM连接mysql以及AutoMigrate创建表三、查询1、检索此对象是否存在于数据库&#xff08;First,Take,Last方法&#xff09;2、Find()方法检索3、根据指定字段查询 四、更新1、Save() 保存多个字段2、更新单个字段 五、删除 一、什么是G…

Python中设计注册登录代码

import hashlib import json import os import sys # user interface 用户是界面 UI """ 用户登录系统 1.注册 2.登陆 0.退出 """ # 读取users.bin def load(path): return json.load(open(path, "rt")) # 保存user.bin def save(dic…

Figma 高效技巧:设计系统中的图标嵌套

Figma 高效技巧&#xff1a;设计系统中的图标嵌套 在设计中&#xff0c;图标起着不可或缺的作用。一套便捷易用的图标嵌套方法可以有效提高设计效率。 分享一下我在图标嵌套上走过的弯路和经验教训。我的图标嵌套可以分三个阶段&#xff1a; 第一阶段&#xff1a;建立图标库 一…

目标检测实战(八): 使用YOLOv7完成对图像的目标检测任务(从数据准备到训练测试部署的完整流程)

文章目录 一、目标检测介绍二、YOLOv7介绍三、源码/论文获取四、环境搭建4.1 环境检测 五、数据集准备六、 模型训练七、模型验证八、模型测试九、错误总结9.1 错误1-numpy jas mp attribute int9.2 错误2-测试代码未能跑出检测框9.3 错误3- Command git tag returned non-zero…

【unity】(2)GameObject

GameObject类是基本的游戏对象类型&#xff0c;它可以用来代表场景中的任何实体。 基本属性 name 类型&#xff1a;string说明&#xff1a;GameObject的名称。用法&#xff1a; GameObject go new GameObject(); go.name "My GameObject";activeSelf 类型&#xf…

Apple OpenELM设备端语言模型

Apple 发布的 OpenELM&#xff08;一系列专为高效设备上处理而设计的开源语言模型&#xff09;引发了相当大的争论。一方面&#xff0c;苹果在开源协作和设备端AI处理方面迈出了一步&#xff0c;强调隐私和效率。另一方面&#xff0c;与微软 Phi-3 Mini 等竞争对手相比&#xf…

森林消防新利器:高扬程水泵的革新与应用/恒峰智慧科技

随着全球气候变化的加剧&#xff0c;森林火灾的频发已成为威胁生态安全的重要问题。在森林消防工作中&#xff0c;高效、快速的水源供给设备显得尤为重要。近年来&#xff0c;高扬程水泵的广泛应用&#xff0c;为森林消防工作带来了新的希望与突破。 一、高扬程水泵的技术优势 …

【Node.js】使用 PostgreSQL、Sequelize 和 Express.js 进行 Node.js 认证

使用 PostgreSQL、Sequelize 和 Express.js 进行 Node.js 认证 作者&#xff1a;Racheal Kuranchie 来源&#xff1a;https://medium.com/rachealkuranchie/node-js-authentication-with-postgresql-sequelize-and-express-js-20ae773da4c9 使用 PostgreSQL、Sequelize 和 Expr…

Linux上安装及卸载OpenJDK

Linux上安装Java Development Kit (JDK) 8的步骤如下&#xff1a; 1. 添加Java JDK 8的Yum源 首先&#xff0c;你需要添加Java JDK 8的Yum源到系统。这可以通过下载并安装Oracle JDK的方式完成&#xff0c;但由于Oracle JDK在某些情况下可能需要遵守特定的许可协议&#xff0c…

探索Baidu Comate:编程世界中的新利器

文章目录 Baidu Comate 介绍Baidu Comate的优势Baidu Comate安装过程Baidu Comate实战演练代码调优代码解释代码生成注释生成 总结 Baidu Comate 介绍 随着GPT的大火&#xff0c;衍生了各种AI工具&#xff0c;这些AI工具遍布在各行业各领域中&#xff0c;有AI写作、AI办公、AI…

[力扣题解] 216. 组合总和 III

题目&#xff1a;216. 组合总和 III 思路 回溯法 代码 class Solution { private:vector<vector<int>> result;vector<int> path;public:void function(int k, int n, int startindex, int sum){int i;// 剪枝// 超过了, 不用找了;if(sum > n){return…

向各位请教一个问题

这是菜鸟上的一道题目&#xff0c;单单拿出来问问大家&#xff0c;看看能不能解惑 &#xff0c;谢谢各位&#xff01; 题目25&#xff1a;求12!3!...20!的和 解题思路&#xff1a;这个题不知道为什么我用DEV C 5.11显示出来为0.000000&#xff0c;可能版本有问题&#xff1f;&a…

linux挂载数据盘详细步骤

在 Linux 上挂载数据盘通常涉及以下步骤&#xff1a; 1. **识别数据盘**&#xff1a;首先&#xff0c;你需要找到要挂载的磁盘设备。在命令行中使用 lsblk 或 fdisk -l 命令查看系统中的磁盘和分区。你会看到类似 sda, sdb, sdc 这样的设备名称&#xff0c;以及各自的分区。 l…

jenkins部署服务到windows系统服务器

1、安装openSSH windows默认不支持ssh协议&#xff0c;需要下载安装&#xff0c;主要适用于jenkins传输文件已经执行命令使用 点击查看下载openSSH 2、项目配置 这里简单说说怎么配置&#xff0c;主要解决点就是ssh执行cmd或shell命令时不能开启新窗口导致应用部署失败或者断…

【论文阅读笔记】MAS-SAM: Segment Any Marine Animal with Aggregated Features

1.论文介绍 MAS-SAM: Segment Any Marine Animal with Aggregated Features MAS-SAM&#xff1a;利用聚合特征分割任何海洋动物 Paper Code(空的) 2.摘要 最近&#xff0c;分割任何模型&#xff08;SAM&#xff09;在生成高质量的对象掩模和实现零拍摄图像分割方面表现出卓越…

阿里/腾讯/华为云国际使用须知

一&#xff1a;针对国内客户业务&#xff1a;务必限制国内IP的访问。建议客户使用代理进行访问&#xff0c;或者考虑使用第三方CDN服务来屏蔽腾讯云国际服务器的IP或域名&#xff0c;以降低客户投诉和风控服务器风险。 二&#xff1a;对于国外客户业务&#xff1a;务必设置禁止…

【spark实战:报错】spark序列化报错:Kryo serialization failed: Buffer overflow

文章目录 spark序列化报错问题解决 spark序列化报错 org.apache.spark.SparkException: Kryo serialization failed: Buffer overflow. Available: 0, required: 61186304. To avoid this, increase spark.kryoserializer.buffer.max value.at org.apache.spark.serializer.Kry…

第 7 章 MyBatis 缓存配置

第 7 章 MyBatis 缓存配置 一. 一级缓存1. 代码讲解一级缓存2. 关闭一级缓存的方法二. 二级缓存1. 介绍2. 配置二级缓存2.1 开启二级缓存全局配置2.2 两种配置方法2.3 mapper.xml中配置二级缓存 ❤❤❤默认配置配置参数讲解2.4 Mapper 接口中配置二级缓存❤❤❤2.5 同时使用时注…

海云安受邀参加诸子云 4.27南京「金融互联网」私董会

4月27日&#xff0c;“安在新媒体网安用户行业活动”第四期私董会在南京顺利举办。活动以“金融&互联网”为主题&#xff0c;邀请十余位业内资深的甲方用户以及典型厂商代表。摒弃传统的议题分享&#xff0c;采取“随时问答&#xff0c;自由讨论”的形式&#xff0c;提问题…

Poisson_Image-Editing

1.算法介绍 快速泊松图像编辑&#xff08;Fast Poisson Image Editing&#xff09;是一种图像处理算法&#xff0c;用于将源图像的某个区域无缝地嵌入到目标图像中。它基于泊松方程的性质&#xff0c;通过求解离散化的泊松方程来实现图像的融合。该算法的核心思想是&#xff0c…