一、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:数据包数据部分的长度(字节)。