linux下的网络抓包(tcpdump)介绍

linux下的网络抓包[tcpdump]介绍

  • 前言
  • tcpdump
    • [1. 安装 tcpdump](#1. 安装 tcpdump)
    • [2. 基本抓包命令](#2. 基本抓包命令)
    • [3. 过滤器使用](#3. 过滤器使用)
    • [4. 保存捕获的数据包](#4. 保存捕获的数据包)
  • 异常指标
    • [1. 连接建立与断开相关指标](#1. 连接建立与断开相关指标)
      • [异常 SYN 包](#异常 SYN 包)
      • [异常 FIN 或 RST 包](#异常 FIN 或 RST 包)
    • [2. 流量相关指标](#2. 流量相关指标)
    • [3. 端口相关指标](#3. 端口相关指标)
    • [4. 数据包大小相关指标](#4. 数据包大小相关指标)
  • 注意事项
    • [1. 权限问题](#1. 权限问题)
    • [2. 性能影响](#2. 性能影响)
    • [3. 数据安全](#3. 数据安全)
    • [4. 法律合规](#4. 法律合规)

前言

  • 抓包原理

    抓包工具通过将网络接口设置为混杂模式(Promiscuous Mode)来工作,在混杂模式下,网络接口会接收所有经过它的数据包,而不仅仅是目标地址为本机的数据包,抓包工具会捕获这些数据包,并将其存储或显示出来,以便后续分析

  • 数据包结构

    数据包通常由头部和数据两部分组成,头部包含了源地址、目的地址、协议类型、端口号等信息,而数据部分则是实际传输的内容,不同的协议有不同的头部结构,了解这些结构有助于分析数据包

  • 协议分析

    常见的网络协议如 TCP、UDP、HTTP、HTTPS 等,每个协议都有其特定的工作方式和数据包格式,抓包后,需要根据协议的特点来分析数据包,例如 TCP 协议的三次握手、四次挥手过程,HTTP 协议的请求和响应报文结构等

tcpdump

1. 安装 tcpdump

bash 复制代码
yum install tcpdump

2. 基本抓包命令

  • 捕获所有数据包:
bash 复制代码
tcpdump

该命令会捕获所有经过网络接口的数据包,并将其显示在终端上,由于会捕获大量数据包,可能会导致终端输出信息过多,所以一般会结合过滤器配合使用

  • 指定网络接口进行抓包:
bash 复制代码
tcpdump -i ens33

这里的 ens33 是网络接口的名称,可以根据实际情况替换为其他接口,可通过ifconfig查看,使用 -i 选项可以指定要捕获数据包的网络接口

  • 抓包示例数据分析:
bash 复制代码
15:37:56.674379 IP 192.168.3.7.50852 > localhost.localdomain.pqsp: Flags [S], seq 3449650029, win 64240, options [mss 1460,nop,wscale 8,nop,nop,sackOK], length 0
15:37:56.932674 IP 192.168.3.7.50852 > localhost.localdomain.pqsp: Flags [.], ack 1083, win 1022, length 0
15:37:56.982326 IP 192.168.3.7.50852 > localhost.localdomain.pqsp: Flags [P.], seq 169:179, ack 1097, win 1022, length 10

以其中一条记录 15:37:56.932674 IP 192.168.3.7.50852 > localhost.localdomain.pqsp: Flags [.], ack 1083, win 1022, length 0 为例:

  • 时间戳
bash 复制代码
15:37:56.932674

这是数据包被捕获的时间,精确到微秒,格式为 时:分:秒.微秒 ,这里表示数据包是在当天的 15 时 37 分 56 秒 932674 微秒被捕获的

  • 协议类型
bash 复制代码
IP

表示该数据包使用的是 IP(Internet Protocol,网际协议),这是网络层的基础协议,用于在不同网络之间传输数据包

  • 源地址和端口、目的地址和端口
bash 复制代码
192.168.3.7.50852 > localhost.localdomain.pqsp
  • 源地址和端口:192.168.3.7 是发送数据包的主机的 IP 地址,50852 是该主机上发送此数据包的应用程序所使用的端口号

  • 目的地址和端口:localhost.localdomain 是接收数据包的主机名,通常 localhost 代表本地主机,对应的 IP 地址是 127.0.0.1pqsp 代表接收方应用程序使用的端口,不过这里的 pqsp 可能是一个不太常见的服务名,在网络中端口一般用数字表示,系统可能将某个端口号映射成了 pqsp 这个服务名

  • 标志位(Flags)

bash 复制代码
Flags [.]

标志位用于表示 TCP 数据包的不同状态或操作,常见的标志位有:

  • S(SYN):用于建立连接的同步信号
  • F(FIN):表示请求关闭连接
  • R(RST):用于重置连接
  • P(PSH):表示需要尽快将数据推送给应用层
  • A(ACK):用于确认收到数据包
  • U(URG):表示紧急指针有效

这里的 [.] 表示只有 ACK 标志位被设置,说明这是一个确认数据包

  • 确认号(ack)
bash 复制代码
ack 1083

确认号表示发送方期望接收的下一个数据包的序列号,这里表示接收方已经成功接收了序列号小于 1083 的所有数据包,期望下一个收到的数据包序列号为 1083

  • 窗口大小(win)
bash 复制代码
win 1022

窗口大小表示接收方当前可用的缓冲区大小,单位是字节,这里表示接收方当前有 1022 字节的缓冲区可以用来接收数据,发送方在发送数据时,需要考虑接收方的窗口大小,以避免发送过多数据导致接收方缓冲区溢出

  • 数据包长度(length)
bash 复制代码
length 0

表示该数据包中携带的数据长度为 0 字节,此数据包可能只包含控制信息,如确认信息等,而没实际的应用层数据

  • 其他示例分析
bash 复制代码
15:37:56.982326 IP 192.168.3.7.50852 > localhost.localdomain.pqsp: Flags [P.], seq 169:179, ack 1097, win 1022, length 10
  • Flags [P.]:表示 PSH 和 ACK 标志位被设置,PSH 标志表示发送方希望接收方尽快将数据推送给应用层,ACK 表示确认
  • seq 169:179:序列号范围,说明此数据包中数据的起始序列号是 169,结束序列号是 179,数据包携带的数据长度为 179 - 169 = 10 字节,与后面的 length 10 相呼应
  • ack 1097:表示期望接收的下一个数据包序列号为 1097
  • win 1022:接收方可用缓冲区大小为 1022 字节
  • length 10:数据包携带的数据长度为 10 字节
bash 复制代码
15:37:56.674379 IP 192.168.3.7.50852 > localhost.localdomain.pqsp: Flags [S], seq 3449650029, win 64240, options [mss 1460,nop,wscale 8,nop,nop,sackOK], length 0
  • Flags [S]:表示 SYN 标志位被设置,说明是一个用于建立 TCP 连接的同步数据包,是 TCP 三次握手的第一步
  • seq 3449650029:发送方随机选择的初始序列号
  • win 64240:发送方的初始窗口大小为 64240 字节
  • options [mss 1460,nop,wscale 8,nop,nop,sackOK] :TCP 选项字段,包含了一些额外的信息:
    • mss 1460:最大段大小(Maximum Segment Size),表示发送方期望接收的最大 TCP 数据段大小为 1460 字节
    • wscale 8:窗口缩放因子,用于扩大窗口大小
    • sackOK:表示支持选择确认(Selective Acknowledgment),允许接收方更精确地确认收到的数据包
  • length 0:此数据包只用于建立连接,不携带实际数据

3. 过滤器使用

  • 根据 IP 地址过滤:
    • 捕获源 IP 地址为 192.168.1.100 的数据包:
bash 复制代码
tcpdump -i ens33 ip src 192.168.1.100
  • 捕获目的 IP 地址为 192.168.1.200 的数据包:
bash 复制代码
tcpdump -i ens33 ip dst 192.168.1.200
  • 根据端口号过滤:
    • 捕获源端口为 80 的数据包:
bash 复制代码
tcpdump -i ens33 tcp src port 80
  • 捕获目的端口为 443 的数据包:
bash 复制代码
tcpdump -i ens33 tcp dst port 443
  • 根据协议过滤:
  • 捕获 TCP 协议的数据包:
bash 复制代码
tcpdump -i ens33 tcp
  • 捕获 UDP 协议的数据包:
bash 复制代码
tcpdump -i ens33 udp
  • host 选项
    host 是一个过滤表达式,用于指定要捕获特定主机(IP 地址或主机名)发送或接收的数据包
bash 复制代码
tcpdump host <host>
  • 捕获来自或发往 IP 地址为 192.168.1.100 的主机的所有数据包:
bash 复制代码
tcpdump host 192.168.1.100
  • 捕获来自或发往主机名为 example.com 的主机的所有数据包:
bash 复制代码
tcpdump host example.com

-i 和 host 组合使用

可以将 -i 和 host 结合起来,指定在某个特定的网络接口上捕获特定主机的数据包

bash 复制代码
tcpdump -i <interface> host <host>
  • 在接口 ens33 上捕获来自或发往 IP 地址为 192.168.1.100 的主机的所有数据包:
bash 复制代码
tcpdump -i ens33 host 192.168.1.100
  • 在无线接口 wlan0 上捕获来自或发往主机名为 example.com 的主机的所有数据包:
bash 复制代码
tcpdump -i wlan0 host example.com

还可以在上述命令的基础上添加其他过滤条件,例如指定协议、端口等

  • 在 ens33 接口上捕获来自或发往 192.168.1.100 主机的 TCP 数据包:
bash 复制代码
tcpdump -i ens33 host 192.168.1.100 and tcp
  • 在 wlan0 接口上捕获来自或发往 example.com 主机的端口为 80 的 HTTP 数据包:
bash 复制代码
tcpdump -i wlan0 host example.com and port 80

4. 保存捕获的数据包

bash 复制代码
tcpdump -i ens33 > test.log

这里的 test.log 是保存的文件名,保存后的文件可以使用 Wireshark 等工具进行进一步分析

异常指标

1. 连接建立与断开相关指标

异常 SYN 包

  • 指标特征 :大量 SYN 包但缺少后续的 SYN - ACKACK 响应,正常的 TCP 连接建立需要经过三次握手(客户端发送 SYN ,服务器返回 SYN - ACK ,客户端再发送 ACK ),如果只有大量的 SYN 包发送出去,而没有完成后续的握手过程,可能是遭受了 SYN 洪水攻击
  • 判断方法 :使用 tcpdump 命令结合过滤规则,例如:
bash 复制代码
tcpdump -i ens33 'tcp[tcpflags] & tcp-syn != 0 and tcp[tcpflags] & tcp-ack == 0'

捕获只有 SYN 标志位设置的数据包,如果在短时间内此类数据包数量急剧增加,就可能存在异常

异常 FIN 或 RST 包

  • 指标特征 :频繁出现 FINRST 包,FIN 包用于正常关闭 TCP 连接,RST 包用于异常终止连接,如果在短时间内某个 IP 地址频繁发送 FINRST 包,可能表示该主机存在应用程序崩溃、网络故障或者遭受攻击等情况
  • 判断方法:使用过滤规则,如:
bash 复制代码
tcpdump -i ens33 'tcp[tcpflags] & (tcp-fin|tcp-rst) != 0'

捕获设置了 FINRST 标志位的数据包,统计特定 IP 地址发送这些包的频率,如果频率过高则可能存在异常

2. 流量相关指标

异常流量峰值

  • 指标特征 :某个时间段内网络流量突然大幅增加或减少,流量突然增加可能是因为遭受了 DDoS 攻击、有大文件下载或者某个应用程序出现异常;流量突然减少可能是网络设备故障、线路中断等原因
  • 判断方法 :可以通过 tcpdump 持续捕获数据包并统计流量,例如,每隔一段时间(如 1 分钟)统计捕获的数据包总字节数,绘制流量变化曲线,当曲线出现明显的峰值或谷值时,需要进一步分析原因

异常源或目的 IP 流量

  • 指标特征:某个特定 IP 地址的流量远远高于或低于其他 IP 地址,如果某个 IP 地址的流量异常高,可能是该主机正在进行大规模的数据传输、遭受攻击或者存在恶意软件;如果某个 IP 地址的流量异常低,可能是该主机出现故障或者被隔离
  • 判断方法:使用 tcpdump 捕获数据包,并结合工具(如 awk)统计每个 IP 地址的流量,例如:
bash 复制代码
tcpdump -i ens33 -c 1000 | awk '{print $3}' | cut -d '.' -f 1-4 | sort | uniq -c | sort -nr

可以统计前 1000 个数据包中每个源 IP 地址的出现次数,间接反映其流量情况

3. 端口相关指标

异常端口使用

  • 指标特征:使用了不常见的端口进行通信,一些恶意软件或攻击者可能会使用不常见的端口来绕过防火墙或隐藏其活动,例如,通常 Web 服务使用 80443 端口,如果发现有大量数据通过其他不常见的端口(如 12345)传输,就可能存在异常
  • 判断方法:使用 tcpdump 捕获数据包并分析端口号,例如:
bash 复制代码
tcpdump -i ens33 'tcp port not (80 or 443)'

可以捕获除 80443 端口之外的 TCP 数据包,对这些数据包进行进一步分析,查看是否存在异常的通信行为

端口扫描

  • 指标特征:短时间内对大量端口进行连接尝试,攻击者通常会使用端口扫描工具来发现目标主机开放的端口,以便寻找攻击漏洞,如果在短时间内某个 IP 地址对多个端口发送 SYN 包,就可能是在进行端口扫描
  • 判断方法:使用过滤规则:
bash 复制代码
tcpdump -i ens33 'tcp[tcpflags] & tcp-syn != 0'

捕获 SYN 包,然后统计每个源 IP 地址尝试连接的端口数量,如果某个 IP 地址在短时间内尝试连接的端口数量较多,就可能存在端口扫描行为

4. 数据包大小相关指标

异常大或小的数据包

  • 指标特征:出现大量异常大或小的数据包,异常大的数据包可能是因为应用程序发送了大文件、存在数据泄露或者遭受了分片攻击;异常小的数据包可能是因为应用程序设计不合理、存在网络故障或者遭受了攻击
  • 判断方法:使用 tcpdump 捕获数据包并查看其长度,例如:
bash 复制代码
tcpdump -i ens33 -vvv

可以显示详细的数据包信息,包括数据包长度,统计数据包长度的分布情况,当发现有大量数据包的长度偏离正常范围时,需要进一步分析原因

注意事项

1. 权限问题

由于抓包涉及到对网络接口的底层操作,需要具有管理员权限

2. 性能影响

长时间或大规模的抓包操作可能会对系统性能产生一定的影响,尤其是在高流量的网络环境中,因此,在进行抓包时,应尽量使用过滤器来减少捕获的数据包数量

3. 数据安全

捕获的数据包可能包含敏感信息,如用户名、密码、信用卡号等,在处理和存储捕获的数据包时,应注意保护这些信息的安全,避免泄露

4. 法律合规

在某些情况下,未经授权的抓包行为可能违反法律法规,在进行抓包操作前,应确保有合法的权限,并且遵守相关的法律规定

相关推荐
安 当 加 密1 小时前
基于USB Key的Web系统双因素认证解决方案:构建安全与便捷的登录体系
运维·网络·安全
云上艺旅2 小时前
K8S学习之基础二十:k8s的coredns
学习·容器·kubernetes
沉默的八哥2 小时前
K8S日常问题优化
运维·kubernetes
666HZ6662 小时前
从0到1入门Docker
运维·docker·容器
c7_ln2 小时前
编程视界:C++命名空间
开发语言·c++·笔记
路由侠内网穿透2 小时前
本地部署资源聚合搜索神器 Jackett 并实现外部访问
linux·运维·服务器·网络协议·tcp/ip
mercyT2 小时前
Kotlin学习笔记之类与对象
笔记·学习·kotlin
四夕白告木贞2 小时前
stm32week6
stm32·单片机·嵌入式硬件·学习
慕容魏2 小时前
入门到入土,Java学习 day16(算法1)
java·学习·算法
啥都想学的又啥都不会的研究生2 小时前
Redis设计与实现-服务器中的数据库
运维·服务器·数据库·redis·笔记·缓存·性能优化