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

一、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 请求
bash 复制代码
GET /index.html HTTP/1.1     ##请求方法  uri  协议版本
Host: www.example.com        ##指定请求的目标主机和端口,通常是域名
  • 传输层(TCP段)
bash 复制代码
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 标志位

bash 复制代码
URG(紧急指针有效):指示紧急指针字段有效。
ACK(确认号有效):指示确认号字段有效。
PSH(推送):指示接收方应用程序应立即处理该数据包。
RST(重置):用于重置连接。
SYN(同步):用于建立连接。
FIN(结束):用于关闭连接。
ECE(ECN-Echo):用于显式拥塞通知(ECN)。
CWR(Congestion Window Reduced):用于显式通知已减少的拥塞窗口。
NS(Nonce Sum):用于增强的安全性。
  • 网络层(IP数据报):
bash 复制代码
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 段
  • 数据链路层(以太网帧)
bash 复制代码
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.选项

  • 选项
bash 复制代码
--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:打印时间戳详细格式。
  • 表达式
    表达式用于过滤数据包,以便只捕获所关心的数据包类型。表达式可以包括一个或多个条件,条件可以使用逻辑运算符进行组合。
bash 复制代码
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的基本用法:

  • 指定网络接口:
bash 复制代码
tcpdump -i <interface>

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

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

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

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

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

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

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

4.tcpdump的高级用法

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

  • 捕获源地址为 xx.xx.xx.xx 且目标端口为 80 的数据包:
bash 复制代码
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 的数据包:
bash 复制代码
tcpdump src xx.xx.xx.xx or dst port 8080
  • 捕获所有非 udp 的数据包:
bash 复制代码
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 数据包:
bash 复制代码
tcpdump tcp or udp
  • 捕获目标端口在 100 到 500 之间的数据包:
bash 复制代码
tcpdump dst portrange 100-500

3)特定网络和子网

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

4)数据包长度限制

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

五、tcpdump示例和解析

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

1)命令和输出

bash 复制代码
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:每行的开头是时间戳,表示捕获的数据包的时间
  • 协议类型:
bash 复制代码
IP:协议类型,显示数据包使用的协议(其他常见的协议类型包括 IP、 ARP、ICMP 等)。
  • 源地址和目标地址:
bash 复制代码
www.test01.com.57036 表示源 主机名或ip 和源端口(57036)
ubuntu-8-136.8140 表示源 主机名或ip 和目标端口(8140)
  • TCP 标志位:
bash 复制代码
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 标志的包,表示它已经降低了发送速率以应对拥塞。
  • 序列号:
bash 复制代码
seq 1574485005  ##表示序列号
ack 303897083   ##表示确认号
  • 窗口大小:
bash 复制代码
win 31  ##TCP  窗口大小。
  • 选项
bash 复制代码
options [mss 1460,nop,nop,sackOK,nop,wscale 11]   ##TCP 选项,包括最大段大小(MSS)、.nop 选项用于填充,使得TCP选项部分的长度对齐到4字节边界,nop 是 No Operation 的缩写,表示不执行任何操作,只是一个占位符、选择性确认(SACK)、时间戳(TS)和窗口缩放(wscale)
  • 数据长度:
bash 复制代码
length 188:数据包数据部分的长度(字节)。
相关推荐
_.Switch43 分钟前
高级Python自动化运维:容器安全与网络策略的深度解析
运维·网络·python·安全·自动化·devops
2401_8504108344 分钟前
文件系统和日志管理
linux·运维·服务器
JokerSZ.1 小时前
【基于LSM的ELF文件安全模块设计】参考
运维·网络·安全
XMYX-01 小时前
使用 SSH 蜜罐提升安全性和记录攻击活动
linux·ssh
芯盾时代1 小时前
数字身份发展趋势前瞻:身份韧性与安全
运维·安全·网络安全·密码学·信息与通信
心灵彼岸-诗和远方2 小时前
DevOps业务价值流:架构设计最佳实践
运维·产品经理·devops
一只哒布刘3 小时前
NFS服务器
运维·服务器
苹果醋33 小时前
Java8->Java19的初步探索
java·运维·spring boot·mysql·nginx
二十雨辰3 小时前
[linux]docker基础
linux·运维·docker
Jason-河山4 小时前
【自动化更新,让商品信息跳舞】——利用API返回值的幽默编程之旅
运维·自动化