首页 > 系统相关 >linux运维一天一个shell命令之tcpdump详解

linux运维一天一个shell命令之tcpdump详解

时间:2024-08-05 22:53:03浏览次数:15  
标签:shell 运维 tcpdump ## IP xx Flags linux 数据包

一、tcpdump 的概念

tcpdump 是一个数据包捕获工具,能够拦截和显示通过网络接口的数据包。它可以实时捕获数据包,也可以将捕获的数据保存到文件中以便后续分析。tcpdump 支持基于多种条件(如 IP 地址、端口号、协议等)来捕获特定的数据包。

二、主要功能和特点

1.数据包捕获:

tcpdump 可以捕获通过指定网络接口的数据包,这些数据包包括以太网帧、IP 数据包、TCP/UDP 数据包等。

2.实时分析:

捕获的数据包可以实时显示在终端,供用户即时分析。

3.过滤功能:

tcpdump 使用 Berkeley Packet Filter (BPF) 语法,允许用户指定复杂的过滤条件,仅捕获感兴趣的数据包。

4.数据包存储:

捕获的数据包可以保存到文件中(如 .pcap 文件),可以使用 tcpdump 或其他网络分析工具(如 Wireshark)进行离线分析。

5.协议支持:

tcpdump 支持多种协议,包括但不限于 Ethernet、IP、TCP、UDP、ICMP、ARP 等。

三、衍生概念:数据包

1.什么是数据包:

数据包(Data Packet)是网络通信中的一个基本单位。在计算机网络中,数据包是用于传输数据的结构化单元,它通常包含了发送方和接收方的信息、数据内容以及用于控制和校验的数据。在不同的网络层中,数据包的结构和术语可能有所不同,但其核心概念是相似的。

2.数据包的组成:

  • 头部(Header):
    头部包含控制信息和元数据,用于确保数据包能够正确到达目标地址。例如,在IP数据包中,头部包括源地址、目标地址、协议类型、长度、校验和等信息。

  • 有效载荷(Payload):
    有效载荷是数据包中实际传输的数据内容。例如,在HTTP请求中,有效载荷可能是请求的网页内容。

  • 尾部(Footer,也称Trailer)
    有时数据包的末尾还会包含一些用于校验的额外信息,如帧校验序列(Frame Check Sequence, FCS),用于检测数据传输过程中是否发生了错误。

3.数据包在不同网络层中的表现

  • 物理层:
    数据以比特或电信号的形式传输,通过物理介质(如电缆、光纤、无线电波)传播。

  • 数据链路层:
    数据包在这一层表现为帧(Frame),例如以太网帧。头部一般包含源和目的MAC地址以及帧类型等信息。

  • 网络层:
    在这一层,数据包被称为数据报(Datagram),例如IP数据报。头部信息包括源和目的IP地址、数据包长度、分片信息等。

  • 传输层:
    数据包在这一层被称为段(Segment)或数据报(Datagram),分别用于TCP和UDP协议。头部信息包括源和目的端口号、序列号、确认号、校验和等。

  • 应用层:
    数据包在这一层通常为应用数据单元(Application Data Unit),例如HTTP请求或响应。

4.数据包的传输过程

  • 封装:
    数据在应用层生成,逐层向下传递,每一层都会添加相应的头部信息,形成数据包。

  • 传输:
    数据包通过物理介质传输,经过网络设备(如路由器、交换机)时,可能会被转发、路由或过滤。

  • 解封装:
    数据包到达目标地址后,逐层向上传递,每一层都会剥离相应的头部信息,还原为原始数据。

5.数据包的示例

  • 应用层:HTTP GET 请求
GET /index.html HTTP/1.1     ##请求方法  uri  协议版本
Host: www.example.com        ##指定请求的目标主机和端口,通常是域名
  • 传输层(TCP段)
TCP Header:   ##TCP 头部包含了控制和管理 TCP 连接的信息,它位于 IP 数据包的负载部分
- Source Port: 12345         ##源端口号,标识发送数据包的应用程序端口
- Destination Port: 80       ##目的端口号,标识接收数据包的应用程序端口
- Sequence Number: 1         ##序列号,用于标识数据包的顺序,确保数据可以按序重组。对于第一个数据包,通常是一个初始序列号(ISN)
- Ack Number: 1              ##确认号,用于确认收到的数据包的序列号。只有在 ACK 标志设置时,此字段才有效。
- Flags: SYN, ACK            ##用于控制 TCP 连接的状态和数据传输,一共有9个
- Window Size: 4096          ##用于流量控制,指示接收方可接受的最大数据量(以字节为单位)。
- Checksum: 0x1A2B           ##校验和,用于校验数据包在传输过程中是否损坏,包括头部和数据的校验

Payload: HTTP GET Request     ##在 TCP 数据包中传输的实际应用数据。此处是一个http请求

##补充:
Flags 标志位

URG(紧急指针有效):指示紧急指针字段有效。
ACK(确认号有效):指示确认号字段有效。
PSH(推送):指示接收方应用程序应立即处理该数据包。
RST(重置):用于重置连接。
SYN(同步):用于建立连接。
FIN(结束):用于关闭连接。
ECE(ECN-Echo):用于显式拥塞通知(ECN)。
CWR(Congestion Window Reduced):用于显式通知已减少的拥塞窗口。
NS(Nonce Sum):用于增强的安全性。

  • 网络层(IP数据报):
IP Header:      ##IP头部是 IP 数据包的第一个部分,包含用于路由和传送数据的控制信息。IPv4 和 IPv6 是两种常见的 IP 协议版本
- Version: 4     ##版本(Version),IP 协议的版本号,对于 IPv4,该值为 4
- Header Length: 20 bytes  ##头部长度,IP 头部的长度,以 32 位字(4 字节)为单位。最小值为 5(即 20 字节),最大值为 15(即 60 字节)
- Total Length: 60 bytes     ##总长度,整个 IP 数据包的长度,包括头部和数据,以字节为单位。
- Time to Live: 5  ##指定数据包在网络中的最大生存时间。每经过一个路由器,该值会减少 1。当 TTL 值减到 0 时,数据包会被丢弃,而不会继续在网络中传输。
- Protocol: TCP      ## 协议,承载的上层协议,如 TCP(值为 6)或 UDP(值为 17)
- Source Address: 192.xx.xx.xx  ##源IP 地址,发送数据包的源 IP 地址
- Destination Address: 95.xx.xx.xx   ##目的 IP 地址,接收数据包的目的 IP 地址

Payload: TCP Segment  ##发送方将大块数据分段为适合传输的小块,每一块成为一个 TCP 段
  • 数据链路层(以太网帧)
Ethernet Header:   ##
- Destination MAC: 00:11:22:33:44:55  ##目标MAC地址,帧的接收方MAC地址
- Source MAC: 66:77:88:99:AA:BB   ##源MAC地址,帧的发送方MAC地址
- EtherType/Length: 0x0800    ##类型字段,如果值大于等于 0x0600(1536),表示帧的类型(0x0800 表示 IPv4 | 0x0806 表示 ARP  | 0x86DD 表示 IPv6;如果值小于 0x0600,表示数据字段的长度,这是 IEEE 802.3 帧格式中的用法)

Payload: IP Datagram

6.TCP 段的传输过程

  • 连接建立:
    使用三次握手(Three-way Handshake)过程建立 TCP 连接。
    三个步骤:SYN(同步)→ SYN-ACK(同步确认)→ ACK(确认)。

  • 数据传输:
    分段:应用层数据被分成多个 TCP 段。
    发送:通过网络将段传输给接收方。
    确认:接收方对每个段发送 ACK 确认。

  • 连接终止:
    使用四次挥手(Four-way Handshake)终止 TCP 连接。
    包括四个步骤:FIN(终止)→ ACK(确认)→ FIN(终止)→ ACK(确认)

四、tcpdump的常用选项

1.选项

  • 选项
--i <interface>:指定要抓包的网络接口。例如,-i eth0。

-w <file>:将抓取的数据包保存到文件中。例如,-w capture.pcap。

-r <file>:读取并分析保存的抓包文件。例如,-r capture.pcap。

-c <count>:指定捕获的数据包数量。例如,-c 100 只抓取 100 个数据包。

-s <snaplen>:设置捕获数据包的最大字节数。例如,-s 128 只抓取每个数据包的前 128 字节。

-v、-vv、-vvv:增加详细输出的级别。

-A:以 ASCII 格式显示数据包内容。

-X:同时以十六进制和 ASCII 格式显示数据包内容。

-n:不将地址解析为主机名(禁用 DNS 解析)。

-nn:不将端口号解析为服务名。

-tttt:打印时间戳详细格式。
  • 表达式
    表达式用于过滤数据包,以便只捕获所关心的数据包类型。表达式可以包括一个或多个条件,条件可以使用逻辑运算符进行组合。
host <host>:过滤与指定主机相关的流量。例如,host 192.168.1.1。

net <network>:过滤与指定网络相关的流量。例如,net 192.168.1.0/24。

port <port>:过滤与指定端口相关的流量。例如,port 80。

tcp、udp、icmp:过滤指定协议的流量。

src、dst:过滤源或目标。例如,src 192.168.1.1 或 dst 192.168.1.1。

逻辑运算符:可以使用 and、or 和 not 来组合条件。例如,tcp and port 80。

3.tcpdump的基本用法:

  • 指定网络接口:
tcpdump -i <interface>

#捕获 eth0 接口的数据包
tcpdump -i eth0
  • 捕获数量:
tcpdump -c <count>

#捕获 10 个数据包:
tcpdump -c 10
  • 保存到文件:
tcpdump -w <filename>

#将捕获的数据包保存到 capture.pcap 文件:
tcpdump -w capture.pcap
  • 从文件读取:
tcpdump -r <filename>

#从 capture.pcap 文件读取数据包:
tcpdump -r capture.pcap
  • 过滤表达式:
tcpdump <expression>

#捕获来自特定 IP 地址的数据包:
tcpdump src xx.xx.xx.xx
  • 详细输出:
tcpdump -v      # 提供详细信息

tcpdump -vv     # 提供更详细的信息

tcpdump -vvv    # 提供最详细的信息

4.tcpdump的高级用法

1)逻辑操作符(AND、OR、NOT)

  • 捕获源地址为 xx.xx.xx.xx 且目标端口为 80 的数据包:
tcpdump src xx.xx.xx.xx and dst port 80
tcpdump: verbose output suppressed, use -v or -vv for full protocol decode
listening on bond0, link-type EN10MB (Ethernet), capture size 262144 bytes
20:21:16.112245 IP 10.xx.xx.xx.30346 > ubuntu-8-xx.http: Flags [S], seq 2552390436, win 62780, options [mss 1460,nop,nop,sackOK,nop,wscale 11], length 0
20:21:16.114159 IP 10.xx.xx.xx.30346 > ubuntu-8-xx.http: Flags [.], ack 1323695319, win 31, length 0
20:21:16.114193 IP 10.xx.xx.xx.30346 > ubuntu-8-xx.http: Flags [P.], seq 0:75, ack 1, win 31, length 75: HTTP: GET / HTTP/1.1
20:21:16.116243 IP 10.xx.xx.xx.30346 > ubuntu-8-xx.http: Flags [.], ack 2921, win 31, length 0
20:21:16.116259 IP 10.xx.xx.xx.30346 > ubuntu-8-xx.http: Flags [.], ack 7301, win 29, length 0
20:21:16.116281 IP 10.xx.xx.xx.30346 > ubuntu-8-xx.http: Flags [.], ack 10221, win 30, length 0
20:21:16.116284 IP 10.xx.xx.xx.30346 > ubuntu-8-xx.http: Flags [.], ack 11572, win 30, length 0
20:21:16.121233 IP 10.xx.xx.xx.30346 > ubuntu-8-xx.http: Flags [F.], seq 75, ack 11572, win 31, length 0
20:21:16.123125 IP 10.xx.xx.xx.30346 > ubuntu-8-xx.http: Flags [.], ack 11573, win 31, length 0

  • 捕获源地址为 xx.xx.xx.xx 或目标端口为 8080 的数据包:
tcpdump src xx.xx.xx.xx or dst port 8080
  • 捕获所有非 udp 的数据包:
tcpdump not udp
tcpdump: verbose output suppressed, use -v or -vv for full protocol decode
listening on eth0, link-type EN10MB (Ethernet), capture size 262144 bytes
20:16:59.986437 IP www.test01.com.ssh > seg-admin-xx-xx.17140: Flags [P.], seq 1527365653:1527365841, ack 3439942592, win 31, length 188
20:16:59.986764 IP www.test01.com.ssh > seg-admin-xx-xx.17140: Flags [P.], seq 188:368, ack 1, win 31, length 180
20:16:59.986815 IP www.test01.com.ssh > seg-admin-xx-xx.17140: Flags [P.], seq 368:524, ack 1, win 31, length 156
20:16:59.986848 IP www.test01.com.ssh > seg-admin-xx-xx.17140: Flags [P.], seq 524:680, ack 1, win 31, length 156
20:16:59.986876 IP www.test01.com.ssh > seg-admin-xx-xx.17140: Flags [P.], seq 680:836, ack 1, win 31, length 156
20:16:59.986902 IP www.test01.com.ssh > seg-admin-xx-xx.17140: Flags [P.], seq 836:992, ack 1, win 31, length 156


2)协议类型和端口范围

  • 捕获所有 TCP 和 UDP 数据包:
tcpdump tcp or udp
  • 捕获目标端口在 100 到 500 之间的数据包:
tcpdump dst portrange 100-500

3)特定网络和子网

  • 捕获源地址在 10.10.0.1/24 子网中的数据包
tcpdump src net 10.10.0.1/24

4)数据包长度限制

  • 捕获前 100 字节的数据包,以使用 -s(snaplen)选项来限制捕获的数据包的最大长度,这有助于减少捕获文件的大小
tcpdump -s 100

五、tcpdump示例和解析

1.抓取指定主机到指定网口的tcp包

1)命令和输出

oot@xxx:~# tcpdump -i eth0 tcp and host  10.xx.xx.xx
tcpdump: verbose output suppressed, use -v or -vv for full protocol decode
listening on eth0, link-type EN10MB (Ethernet), capture size 262144 bytes
21:46:22.748962 IP www.test01.com.57036 > ubuntu-8-136.8140: Flags [S], seq 303897082, win 62780, options [mss 1460,nop,nop,sackOK,nop,wscale 11], length 0
21:46:22.751006 IP ubuntu-8-136.8140 > www.test01.com.57036: Flags [S.], seq 1574485005, ack 303897083, win 29200, options [mss 1460,nop,nop,sackOK,nop,wscale 7], length 0
21:46:22.751121 IP www.test01.com.57036 > ubuntu-8-136.8140: Flags [.], ack 1, win 31, length 0
21:46:22.751736 IP www.test01.com.57036 > ubuntu-8-136.8140: Flags [P.], seq 1:225, ack 1, win 31, length 224
21:46:22.753667 IP ubuntu-8-136.8140 > www.test01.com.57036: Flags [F.], seq 1:189, ack 225, win 237, length 188
21:46:22.753778 IP www.test01.com.57036 > ubuntu-8-136.8140: Flags [R.], seq 225, ack 190, win 31, length 0
21:46:26.879108 IP ubuntu-8-136.50216 > www.test01.com.microsoft-ds: Flags [S], seq 1927937680, win 29200, options [mss 1460,sackOK,TS val 471337684 ecr 0,nop,wscale 7], length 0
21:46:26.879165 IP www.test01.com.microsoft-ds > ubuntu-8-136.50216: Flags [S.], seq 3316735515, ack 1927937681, win 62780, options [mss 1460,nop,nop,sackOK,nop,wscale 11], length 0
21:46:26.880957 IP ubuntu-8-136.50216 > www.test01.com.microsoft-ds: Flags [.], ack 1, win 229, length 0
21:46:30.052234 IP ubuntu-8-136.50216 > www.test01.com.microsoft-ds: Flags [P.], seq 1:7, ack 1, win 229, length 6
21:46:30.052265 IP www.test01.com.microsoft-ds > ubuntu-8-136.50216: Flags [.], ack 7, win 31, length 0
21:46:31.771616 IP ubuntu-8-136.50216 > www.test01.com.microsoft-ds: Flags [F.], seq 7, ack 1, win 229, length 0
21:46:31.777194 IP www.test01.com.microsoft-ds > ubuntu-8-136.50216: Flags [F.], seq 1, ack 8, win 31, length 0
21:46:31.779066 IP ubuntu-8-136.50216 > www.test01.com.microsoft-ds: Flags [.], ack 2, win 229, length 0
### 2)主要字段解释
- 时间戳:
```bash
21:46:22.748962:每行的开头是时间戳,表示捕获的数据包的时间
  • 协议类型:
IP:协议类型,显示数据包使用的协议(其他常见的协议类型包括 IP、 ARP、ICMP 等)。
  • 源地址和目标地址:
www.test01.com.57036 表示源 主机名或ip 和源端口(57036)
ubuntu-8-136.8140 表示源 主机名或ip 和目标端口(8140)
  • TCP 标志位:
Flags [S]  ##表示这是一个 SYN 包(用于连接请求)。
Flags [S.]  ##表示 SYN-ACK 包(表示确认连接请求)。
Flags [.]  ## 表示 ACK 包(表示确认已收到数据)。

###
SYN(同步,Synchronize)
标志位:S
用于初始化连接,标志这是一个连接请求。通常在三次握手的第一个数据包中设置。
如果一个数据包的 SYN 标志被设置,那么它也很可能会携带一个初始序列号。

ACK(确认,Acknowledgment)
标志位:A
表示确认前一个包已经接收,包含确认号。这个标志在三次握手的第一个数据包之后的所有数据包中都会设置。

FIN(终止,Finish)
标志位:F
用于释放连接,表示发送方已经完成发送数据。通常在四次挥手中的第一个和第三个数据包中设置。

RST(重置,Reset)
标志位:R
表示连接出现错误,需要立即终止。重置连接时设置这个标志,通常用于异常或错误的情况下。

PSH(推送,Push)
标志位:P
表示数据应该立即发送给应用程序,而不是在缓冲区中等待。它告知接收方接收数据后立即处理。

URG(紧急,Urgent)
标志位:U
表示数据包含紧急指针,紧急数据应该优先处理。紧急指针字段指出要优先处理的数据偏移量。

ECE(ECN-Echo,显式拥塞通知回显)
标志位:E
用于支持显式拥塞通知(ECN)。当接收到带有 CE 标志的数据包时,接收方在发送的确认包中设置 ECE 标志。

CWR(Congestion Window Reduced,拥塞窗口减少)
标志位:C
发送方在收到带有 ECE 标志的确认包后,发送带有 CWR 标志的包,表示它已经降低了发送速率以应对拥塞。
  • 序列号:
seq 1574485005  ##表示序列号
ack 303897083   ##表示确认号
  • 窗口大小:
win 31  ##TCP  窗口大小。
  • 选项
options [mss 1460,nop,nop,sackOK,nop,wscale 11]   ##TCP 选项,包括最大段大小(MSS)、.nop 选项用于填充,使得TCP选项部分的长度对齐到4字节边界,nop 是 No Operation 的缩写,表示不执行任何操作,只是一个占位符、选择性确认(SACK)、时间戳(TS)和窗口缩放(wscale)

  • 数据长度:
length 188:数据包数据部分的长度(字节)。

标签:shell,运维,tcpdump,##,IP,xx,Flags,linux,数据包
From: https://blog.csdn.net/weixin_46546303/article/details/140878383

相关文章

  • 医院IT运维解决方案
    医院IT运维解决方案      随着大数据、人工智能等技术融入医疗领域,医院信息化发展的下一阶段目标将是走向智慧医院,而智慧医院离不开大数据分析和数字化运维的支撑。由于医院数据的高商业以及敏感度,医院的信息中心必须确保信息系统的稳定运行,提升医院信息系统的服务质量。客......
  • Linux——线程互斥与同步
    一、线程互斥1.1线程间互斥的概念在学习管道的时候,管道是自带同步与互斥的。而在线程中,当多个线程没有加锁的情况下同时访问临界资源时会发生混乱。在举例之前,先了解几个概念。临界资源:多个线程执行流共享的资源叫做临界资源临界区:每个线程内部访问临界资源的代码叫做临界......
  • Kali Linux 安装
    KaliLinux安装前言1、KaliLinux基本介绍(1)KaliLinux的起源和前身(2)Debian系与Redhat系区别(3)下载和安装kali1.下载Kali2.解压压缩包3.打开kali镜像4.修改root密码(4)修改语言为中文(5)替换ATP源(6)配置远程连接(7)启动SSH服务(8)更新kali下期前言本期主要学习了Kali的基......
  • 驱动开发系列09 - Linux设备模型之设备,驱动和总线
    一:概述     Linux设备模型(LDM)是Linux内核中引入的一个概念。用于管理内核对象(那些需要引用计数的对象、例如文件、设备、总线甚至驱动程序),以及描述它们之间的层次结构,以及这些内核对象之间绑定关系。Linux设备模型引入了对象生命周期管理、引用计数、以及面向对象......
  • [20240804]关于kitty设置与linux LANG环境设置问题.txt
    [20240804]关于kitty设置与linuxLANG环境设置问题.txt--//更正我以前理解的一个混沌的地方:--//我以前个人的工作习惯:LANG=en_US,kittyRemotecharacterset选择Usefontencoding.--//目前这样的设置存在一些问题:--//kitty设置LANG=en_US.UTF-8的情况下,kittywindow->Trans......
  • FinalShell远程连接centos7
    一.引言我们在VMware中安装好centos7版本的Linux后,经常需要在虚拟机和真实机之间来回切换,特别是要上传文件到centos7中的时候,很不方便。因此我们可以通过FinalShell软件来远程连接到centos7,FinalShell支持多标签页功能,用户可以同时打开多个连接,并在不同的标签页中切换,提高了工......
  • linux运维一天一个shell命令之vim详解
    前言:在日常运维工作中,掌握好Vim的使用可以极大地提高工作的效率。Vim作为一个强大的文本编辑器,广泛应用于各种运维场景一、定义Vim是一个非常强大的文本编辑器,在Unix/Linux环境中非常流行。它具有许多高级功能和快捷键,适合编写代码、编辑配置文件等。1、特点:高级......
  • Linux 添加环境变量
    1.添加环境变量编辑环境变量配置文件。vim/etc/profile在最后面新增一行,导出PATH变量并在之前的PATH变量后面添加冒号,然后添加上你的可执行文件的目录。exportPATH=$PATH:/usr/local/aspnetcore/aspnetcore-runtime-8.0.7-linux-x64/2.加载环境变量保存环境变量配......
  • 云计算实训21——mysql-8.0.33-linux-glibc安装及使用
    一、mysql-8.0.33-linux-glibc安装安装步骤1.解压tar-xvfmysql-8.0.33-linux-glibc2.12-x86_64.tar.xz2.清空其他环境rm-rf/etc/my.cnf3.安装依赖库yumlistinstalled|greplibaio4.创建用户useradd-r-s/sbin/nologinmysql查看idmysql5.创建......
  • Linux的特殊权限
    特殊权限是什么在Linux中,特殊权限是指针对文件或目录的特殊权限设置,包括SetUID、SetGID和StickyBit。特殊权限说明SetUIDSetUserID当一个可执行文件被设置了SetUID权限后,当任何用户执行该文件时,文件的所有者权限会被赋予执行者,而不是执行者的权限。这使得用户可......