ARTICLE DETAIL

资讯详情

深耕郑州网站建设与运营推广的一线实战洞察。

用Wireshark和VMware亲手实验:从数据包封装到企业三层网络

用Wireshark和VMware亲手实验:从数据包封装到企业三层网络 如果你问我网络基础最值得亲手做一遍的实验是什么我的答案不是配路由器也不是敲交换机命令而是把一个数据包从应用层到物理层的完整封装过程抓出来看一遍。最近我把 Windows 主机和 VMware 虚拟机搭成一个小型实验网用 Wireshark 盯着一路 ping、HTTP 请求的包从起源到目的地顺带把企业里常见的接入、汇聚、核心三层架构也复现了一份。这篇文章就是这次复盘的记录适合刚学完 TCP/IP 理论、但对“数据包到底怎么走”还停留在背概念阶段的同学。我个人一直有个感觉网络协议这种东西光看书的效率特别低。一个数据包从应用层到物理层经过 TCP、IP、以太网层层封装中间还要过交换机、路由器、防火墙如果不亲眼看一遍很难把这些概念串成一张完整的图。这次实验我搭了一个最小但很完整的网络环境把数据包的封装与解封装、ARP 寻址、同网段和跨网段转发、以及企业局域网的三层架构全部跑了一遍所以这篇文章会按照我实际操作的顺序来写尽量给你一条能照着复现的路径。1. 数据包的一生从应用层到比特流1.1 先理解为什么必须分层刚开始学网络的时候最让我困惑的问题之一是为什么要分这么多层都是通信直接把数据从一台电脑传到另一台电脑不就行了吗后来在实际抓包和排障过程中才慢慢理解分层不是为了考试而是为了让网络变得可维护、可替换。TCP/IP 模型通常被简化为四层应用层、传输层、网络层、网络接口层。很多教材还会对照 OSI 七层模型来解释但我实际工作中几乎没见过直接按 OSI 七层来排障的大家说的都是 TCP/IP 这套。两者对照关系大致是这样OSI 七层常见协议与设备TCP/IP 四层应用层HTTP、DNS、DHCP、FTP应用层表示层SSL/TLS 加密转换应用层会话层Socket 连接管理应用层传输层TCP、UDP传输层网络层IP、ICMP、路由器网络层数据链路层以太网、交换机、MAC 地址网络接口层物理层网线、光纤、集线器网络接口层为什么实际要用四层而不是七层因为 OSI 的应用层、表示层、会话层在实际协议栈里很难划清边界。比如 TLS 握手它既管加密表示层的事又管会话状态会话层的事硬拆反而给自己找麻烦。TCP/IP 把这三层合并成应用层概念更干净排障时也更实用。分层最大的好处是“每一层只关心自己的事”。应用层不关心数据是走网线还是 WiFi传输层不关心 IP 地址是 IPv4 还是 IPv6网络层不关心底层是以太网还是光纤。这样任何一个环节出问题我都能通过分层定位先看应用层通不通再看四层端口通不通然后看三层 IP 通不通最后看二层链路通不通。整个排障思路就是沿着这个分层模型往下走的。1.2 一次 HTTP 请求的封装与解封装理解了分层再来看数据包就轻松了。我找一个最常见的场景在 Windows 主机上用浏览器访问一个网站。这个请求从产生到发出去一共经历了多次加头部的工作这就是封装。应用层先产生 HTTP 请求内容是一段文本比如GET /index.html HTTP/1.1这个时候它叫“数据”Data。传输层 TCP 拿到这段数据后会在前面加一个 TCP 头里面包含源端口、目的端口、序列号、确认号等信息封装出来的东西叫“数据段”Segment。网络层 IP 再给数据段加一个 IP 头包含源 IP、目的 IP 和协议号这时候叫“数据包”Packet。网络接口层以太网协议再给数据包加一个以太网头包含源 MAC、目的 MAC 和类型字段最终封装成“数据帧”Frame。帧最后会被网卡转换成光信号或电信号发送出去就是“比特流”Bits。这个过程看起来是层层往下加头但接收方是反着来的。目标主机收到比特流后网卡先把电信号还原成帧去掉以太网头交给 IP 层IP 层去掉 IP 头交给 TCPTCP 去掉 TCP 头按顺序组装数据最后交给应用层处理。这几个名词特别容易搞混我整理了一个简单对照表名称所在层关键头部一次实验中如何观察数据应用层无HTTP 报文内容数据段传输层TCP/UDP 头源端口、目的端口数据包网络层IP 头源 IP、目的 IP、TTL数据帧网络接口层以太网头源 MAC、目的 MAC、Type 0x0800比特流物理层无网线上的电信号用示波器才能看我自己最容易出错的地方是把“数据包”和“数据帧”混用。严格来说只有经过 IP 层封装后才能叫数据包而在同一个以太网内传输时实体是数据帧。后面用 Wireshark 抓包时会看得特别清楚抓包工具里默认显示的每一行其实都是“帧”帧里面才装着 IP 包。1.3 在 Wireshark 里看真实的数据帧这次实验里我先在 Windows 主机上 ping 一台 VMware 虚拟机然后用 Wireshark 抓包。重点不是看 ping 通没通而是看一个帧的完整结构。Wireshark 抓到 ICMP Echo Request 后点开这一帧可以看到三个大段Frame、Ethernet II、Internet Protocol Version 4、Internet Control Message Protocol。Frame 段显示的是物理层和链路层的通用信息比如帧长度是 74 字节Ethernet II 段就是我们说的以太网头里面的 Destination 和 Source 是 MAC 地址Type 是 0x0800 表示上层是 IPv4IP 段里有源地址、目的地址、TTL、协议号1 表示 ICMPICMP 段里则是 Type 8请求和校验和。这里我第一次看的时候有个疑问为什么一个 ping 包前面还要先看到几个 ARP 包其实是因为 Windows 主机知道目标 IP但不知道目标 MAC而以太网传输必须填目的 MAC所以要先发 ARP 请求询问“谁是 192.168.56.101”被询问的主机回复自己的 MAC 后真正的 ICMP 包才能发出去。抓包时有个特别重要的经验一定要选对网卡。VMware 创建虚拟网络时会在 Windows 上生成对应的虚拟网卡比如 VMnet8 对应 NAT 网卡VMnet1 对应仅主机网卡。如果 Wireshark 选择的是物理网卡那只能看到物理网络的流量看不到虚拟机的流量。这次实验我用的自定义 VMnet2在 Wireshark 里显示的网卡名就是“VMware Virtual Ethernet Adapter for VMnet2”。2. Windows VMware 实验环境搭建2.1 网络拓扑设计与 VMware 网络模式选择既然要复现 TCP/IP 通信全过程就需要至少两台设备。我选了 Windows 物理机 两台 VMware 虚拟机一台装 Ubuntu Server 当服务器一台装 Windows 10 当客户端。拓扑很朴素但已经足够还原“端到端通信”的完整链条。VMware Workstation 的虚拟网络模式有三类桥接、NAT、仅主机另外还可以自定义 VMnet。很多人第一次接触时容易纠结选哪个。我的建议是做通信过程分析时优先用“仅主机”或自定义 VMnet原因很简单桥接模式会让虚拟机直接和物理网络里的真实设备混在一起容易收到邻居广播包的干扰NAT 模式下虚拟机躲在虚拟网关后面虽然能上网但不利于观察本机到虚拟机之间的帧结构仅主机模式相当于把物理机和虚拟机连到同一个虚拟交换机上干净、可控非常适合抓包分析。当然如果你的目标是想模拟虚拟机访问互联网时的 NAT 过程那另说。但这次实验的目的是“从数据包到企业网络”我选择把物理机、两台虚拟机都放在同一个自定义 VMnet 下模拟一个最小二层网络。这样既能观察二层寻址也能通过增加路由角色来观察三层转发。VMware 的虚拟网络编辑器里可以创建多个 VMnet每个 VMnet 本质上就是一个虚拟交换机。我创建了 VMnet2模拟办公楼接入网段和 VMnet3模拟服务器网段后面做跨网段实验时会在一台 Linux 虚拟机上配置两个网卡分别接这两个 VMnet充当路由器。2.2 IP 规划与网卡配置这次实验的 IP 规划我做了三套对应三种场景。第一套是最简单的同网段场景所有设备都在 192.168.56.0/24 网段Windows 物理机和两台虚拟机互通。第二套是跨网段场景客户端在 192.168.56.0/24服务器在 192.168.57.0/24中间用一台 Linux 路由器转发。第三套是复现企业三层架构时用到的多网段规划会在第四节详细说。先看第一套配置设备网卡连接IP 地址子网掩码默认网关Windows 物理机VMnet2192.168.56.10255.255.255.0无同网段直连Ubuntu Server 虚拟机VMnet2192.168.56.101255.255.255.0无Windows 10 虚拟机VMnet2192.168.56.102255.255.255.0无配置方法不复杂。VMware 里先打开“编辑 - 虚拟网络编辑器”添加网络 VMnet2保持“使用本地 DHCP 服务”不勾选因为我要手动指定 IP避免 DHCP 分配的地址和预期不一致。然后把每台虚拟机的网卡连接方式都改成“自定义 - VMnet2”最后在系统内设置静态 IP。Windows 系统里修改 IP 的路径是“网络和共享中心 - 更改适配器设置 - 右键属性 - Internet 协议版本 4”填上对应的 IP 和掩码。Ubuntu Server 可以编辑 netplan 配置文件比如/etc/netplan/01-netcfg.yaml配置完后执行sudo netplan apply让配置生效。这里有个小坑Ubuntu 的网卡名在 VMware 里通常是 ens33但也可能因为虚拟机版本不同变成 ens32 或者 ens160一定要先用ip addr查看当前网卡名别抄网上的配置直接写。2.3 Wireshark 抓包验证连通性同网段拓扑配置好以后我在 Windows 物理机上执行ping 192.168.56.101同时在 Wireshark 里选择 VMnet2 对应的网卡开始抓包。第一次抓的时候我犯了个错误只是把 Wireshark 打开了但没注意它是否真的抓到了 VMnet2 上的流量结果半天看不到数据包。后来才发现Wireshark 默认可能抓的是物理网卡需要手动切换到 VMnet2 的虚拟网卡。抓到包以后能明显看到前几个包是 ARP 广播ARP 请求的目标 MAC 是ff:ff:ff:ff:ff:ff来源是 Windows 物理机的 MAC。紧接着 Ubuntu 虚拟机回应了一个 ARP 单播包告诉 Windows 自己的 MAC 地址。之后就是连续的 ICMP Echo Request 和 Echo Reply每个帧里 Ethernet II 头部的源目 MAC 都保持不变因为两台设备就在同一个二层网段内不经过路由器。这里顺便说一下我在 Wireshark 里还开启了一个 “Colorize Conversation” 的功能可以直接把同一对 IP 之间的对话标成同一种颜色这样在大量协议混杂的时候很容易定位通信双方。对复盘来说这个功能比单纯看列表要直观很多。3. 跨越物理边界网络设备层次与寻址转发3.1 二层设备和三层设备的分工同网段通信跑通之后我开始理解为什么企业网络里既要有交换机又要有路由器。交换机是二层设备它只看 MAC 地址靠 MAC 地址表决定从哪个端口把帧发出去路由器是三层设备它看的是 IP 地址靠路由表决定从哪个接口把包转发出去。用生活化的类比来说交换机就像小区里的物业管理处它知道每栋楼的具体房间号MAC只要在同一个小区内送信就直接送到门口。路由器就像城市的邮局分拣中心它不认识每栋楼但它知道哪个片区该交给哪个分局跨片区寄信时必须先到邮局走一圈。这也是为什么企业里常说“VLAN 划分后跨 VLAN 必须走三层”的原因。在实验环境里VMware 的 VMnet 本身就是一台虚拟交换机所有连接到同一个 VMnet 的设备都能直接二层互通。当我想让两个不同网段互通时只靠 VMnet2 是不够的需要有一台设备同时连接到 VMnet2 和 VMnet3并且开启 IP 转发这台设备就成了路由器。3.2 ARP 解析与 MAC 地址转发全过程二层通信离不开 ARP。很多刚接触网络的同学会问IP 地址已经能标识一台设备了为什么还要 MAC 地址核心原因是IP 地址是逻辑地址负责跨网络寻址MAC 地址是物理地址负责在同一段物理链路上精确交付。就像快递的收件地址是“XX市XX区XX路XX号”IP但快递员最终要找到的是“你家门口的信箱”MAC没有信箱编号他只能在楼下转圈。ARP 的工作过程是这样的当主机 A 要向同网段主机 B 发送数据时A 首先检查自己的 ARP 缓存表中是否有 B 的 IP 对应的 MAC 地址。如果没有A 会发送一个以太网广播帧目标 MAC 是全 F内容里写着“谁的 IP 是 192.168.56.101请告诉我你的 MAC”。网段内所有设备都会收到这个广播但只有 IP 匹配的那台设备会响应一个 ARP 单播包。A 收到响应后把 IP 到 MAC 的映射写进 ARP 缓存以后再发数据就不用广播了。在 Windows 上可以通过arp -a查看本机的 ARP 缓存表。实验里我 ping 完 Ubuntu 虚拟机后执行arp -a能看到 192.168.56.101 对应的 MAC 地址。如果网络环境变了需要清空缓存可以用arp -d删除指定条目或者netsh interface ip delete arpcache清空全部缓存否则容易用旧的 MAC 信息去访问新设备导致通信异常。3.3 同网段与跨网段转发全过程同网段通信我们已经验证过了接下来关键点是跨网段转发。我在 VMnet3 上新增了一台 Ubuntu 虚拟机当作服务器IP 是 192.168.57.101网关指向 192.168.57.1原来的 Windows 10 虚拟机保留在 VMnet2IP 是 192.168.56.102网关指向 192.168.56.1。这台充当路由器的 Linux 虚拟机有两个网卡一个接 VMnet2IP 192.168.56.1另一个接 VMnet3IP 192.168.57.1并开启内核 IP 转发。Windows 客户端去 ping 192.168.57.101 时会发生什么它会先拿自己的 IP 和掩码做一次“AND”运算判断目标 IP 192.168.57.101 和源 IP 192.168.56.102 不在同一个网段。既然不在同一个网段客户端就不会直接广播寻找目标主机的 MAC而是把帧的目的 MAC 设为默认网关 192.168.56.1 的 MACIP 层的目标 IP 仍然写成 192.168.57.101。路由器收到这个帧后发现目的 IP 不是自己于是查询路由表确定该从连接到 VMnet3 的接口转发出去并再次通过 ARP 查找 192.168.57.101 的 MAC重新封装成帧发给服务器。这个过程中最容易忽视的是数据帧经过路由器后源 MAC 和目的 MAC 会被改写但 IP 地址始终不变。之前我在 Wireshark 里抓过从客户端到服务器的一段流量分别在两个网段接口上抓看到的帧 MAC 完全不同这就是三层转发的证据。场景数据包目的 IP数据帧目的 MAC是否需要路由器同网段通信目标主机 IP目标主机 MAC不需要跨网段通信目标主机 IP默认网关 MAC需要只要理解了上面这张表很多“ping 不通”的问题就能很自然地排查先确认两边的 IP 是不是同网段再看默认网关对不对然后用抓包确认 MAC 地址有没有被正确解析。4. 企业网络怎么搭局域网三层架构拆解4.1 接入层、汇聚层、核心层的职责当网络规模从两台设备变成几百上千台设备时企业网络不会让所有设备都接到一台交换机上而是采用“接入层、汇聚层、核心层”三层架构。这次实验里我也用 VMware 模拟了这个架构的基本形式虽然规模很小但分层逻辑和大企业一模一样。接入层是最贴近终端用户的层次它把电脑、打印机、IP 电话、AP 等设备接入网络。接入层交换机的特点是有大量千兆甚至百兆端口支持 VLAN 划分能配置端口安全和风暴控制。它不需要太强的路由能力因为它的主要任务是“接入”而不是“转发大量跨网段流量”。汇聚层是接入层和核心层之间的桥梁它把多台接入交换机连接起来承担 VLAN 间路由、流量汇聚、策略控制等工作。很多企业会把网关设在汇聚层这样每个 VLAN 的广播域就被隔离在接入和汇聚之间核心层不必处理大量广播。汇聚层设备通常要求支持三层路由、ACL、QoS、链路聚合性能和可靠性比接入层高一个档次。核心层是整个网络的心脏它的任务只有一个高速转发。核心设备不需要接太多终端也不需要复杂的策略过滤因为任何复杂的处理都会降低转发性能。优秀的核心层设计讲究“简洁、高速、冗余”常见做法是两台核心交换机堆叠或者做集群配合双链路连接到汇聚层确保任何一条链路断了也不影响业务。我按照实际项目经验总结了一个分层职责对照表层次典型设备主要职责设计要点接入层二层交换机终端接入、VLAN 划分、端口安全端口密度、POE 供电、广播抑制汇聚层三层交换机VLAN 间路由、ACL、流量汇聚三层转发能力、链路聚合、冗余核心层高端三层交换机/路由器高速路由转发高吞吐、高可靠、配置简洁4.2 三层架构下的 VLAN 与路由设计三层架构不只是物理设备的堆叠更关键的是 VLAN 和路由的设计。接入层交换机一般按部门或功能划分 VLAN比如财务部 VLAN 10、研发部 VLAN 20、服务器区 VLAN 30。每个 VLAN 就是一个独立的二层广播域VLAN 之间的通信必须通过三层设备完成。在实际项目里我经常看到两种网关部署方式。第一种是把网关放在接入层交换机上适用于小型网络但每个接入交换机都要配路由管理起来麻烦。第二种是把网关放在汇聚层交换机上这也是大中型网络最常见的方式接入层只负责二层透传汇聚层配置 VLAN 的 Virtual InterfaceSVI作为网关。核心层则只跑三层路由通常是 OSPF 或者静态路由。举个例子一个 500 人的企业网络办公区划分了 VLAN 10管理、VLAN 20办公、VLAN 30访客服务器区划分了 VLAN 100。接入层交换机把端口加入对应 VLAN汇聚层交换机配置三个 VLAN 的 SVI 网关地址分别是 192.168.10.1、192.168.20.1、192.168.30.1。终端设备的默认网关就指向各自 VLAN 的网关地址。访问服务器时终端把包发给自己的网关汇聚层查路由表把包转发到服务器区网关核心层在这里其实是提供高速连通性的骨干。这里有个常见理解难点同一个 VLAN 内通信靠二层跨 VLAN 通信靠三层。很多初学 VLAN 的人以为划分 VLAN 就是划分为不同 IP 网段实际上 VLAN 和 IP 网段是两个概念只是通常一个 VLAN 对应一个网段。接入层交换机如果端口配置了 VLAN 20那这个端口连接的终端就应该使用 192.168.20.0/24 网段的 IP否则即使交换机允许通过网络层也无法正确路由。4.3 用 VMware 复现一个小型企业三层网络要完整复现企业三层架构纯用 VMware 虚拟机还不够因为 VMware 的 VMnet 只是虚拟交换机不支持 VLAN 透传和 SVI 配置。我这次的做法是VMware 负责搭终端和路由器再用一个额外的虚拟化网络模拟工具来跑接入层交换机和汇聚层交换机。如果你的手头没有模拟器其实用 VMware 也能做一个简化版使用多台 Linux 虚拟机分别充当接入交换机用 Linux bridge、汇聚交换机用 VLAN 子接口和核心路由器用 IP 转发。但这种做法的配置比较繁琐而且会偏离“网络设备”本身容易让人陷入路由配置细节反而不利于理解三层架构。我自己实际用的是 VMware Workstation 配合 eNSP 模拟器在 eNSP 里创建一台核心交换机、两台汇聚交换机、两台接入交换机再在 VMware 里运行两个 Windows 终端把它们通过 eNSP 的云设备连接到 VMnet 网段。这样 VMware 虚拟机作为真实终端eNSP 里的交换机负责 VLAN 和三层转发两者结合非常接近真实企业环境。具体配置流程可以这样走在 eNSP 里创建两台接入交换机 SW1 和 SW2分别把连接终端的端口划入 VLAN 10 和 VLAN 20汇聚交换机 SW3 启用 Vlanif 接口作为网关核心交换机 SW4 配置三层接口连接汇聚交换机并通过静态路由指向外部。两台 VMware 虚拟机分别连接 eNSP 云设备对应的 VMnetIP 设置为不同网段。完成后在终端 A ping 终端 B能通就说明三层路由链路没问题。这个实验里最值得体会的是“数据包每经过一台三层设备帧头就被重新封装一次”。在 VMware 和 eNSP 结合的拓扑中你在 eNSP 的接口上抓包能看到客户端发来的帧目的 MAC 是网关的 MAC而从汇聚交换机出去到服务器的帧目的 MAC 已经变成了服务器所在网段的下一跳地址。这种“换信封不换信纸”的过程是理解企业网络转发模型的关键。5. 常见坑与排查经验5.1 抓包看不到数据包或只看到广播包这个问题我在实验里至少遇到两次。第一次是 Wireshark 没选对网卡第二次是交换机端口没有加入正确的 VLAN。排查思路非常简单先看 Wireshark 左下角的状态有没有实际收到包如果一直显示 0先切换网卡如果能看到 ARP 但看不到 ICMP说明二层通了但三层有问题这时候检查 IP 配置和防火墙。虚拟机环境里还有一个常见坑VMware 的虚拟网卡默认开启了“VMware 加速”特性某些版本的 Wireshark 可能抓不到本例主机的入站流量。解决方法是关闭虚拟机的“加速 3D 图形”和“虚拟化引擎”里的硬件加速或者在 Wireshark 的“捕获选项”里关闭“开启混杂模式”再重新打开。这个方法不一定对所有版本都有效但值得试一下。5.2 跨网段 ping 不通网关与路由排查跨网段实验最容易出现的问题是“单方向通另一方向不通”。比如客户端能 ping 通服务器但服务器 ping 不通客户端。这种情况八成是服务器这边的默认网关没配置对或者路由器的回程路由缺失。我建议用tracert -d或者pathping查看每一跳的响应时间在哪一跳开始超时问题就出在哪一段。还有一个隐藏很深的问题Windows 防火墙默认会阻止 ICMP Echo Request如果虚拟机里没关防火墙ping 就会超时。在实验环境里我通常直接在 Windows 防火墙的高级设置里放行“文件和打印机共享 (回显请求 - ICMPv4-In)”规则不要直接把整个防火墙关掉这样更贴近企业环境的安全习惯。5.3 VMware 网络模式切换后 IP 地址残留VMware 虚拟机从 NAT 模式切换到自定义 VMnet 后经常出现网卡配置还是旧的 DHCP 地址导致 IP 和拓扑规划不符。我遇到过最尴尬的情况是一台虚拟机明明应该接 VMnet2结果它还在用 NAT 网段 192.168.137.x抓包时完全看不到期望的流量。解决方法是进入系统后先查看网卡名称和 IP再手动设置为静态地址并且确认虚拟机的“网络连接”选项里选择的是正确的 VMnet。我还整理了一张速查表适合实验排障时对照故障现象可能原因排查命令ping 同网段 IP 不通ARP 解析失败、防火墙拦截arp -a、ping -a、抓 ARP跨网段 ping 不通网关配置错误、路由缺失route print、tracert -d抓包只有广播没有单播网卡抓错、VLAN 不匹配切换网卡、检查交换机端口IP 总是变DHCP 未关闭、VMware 干扰关闭 DHCP、设置静态 IP虚拟机之间可通物理机不通物理机防火墙拦入站放行 ICMPv4 回显请求每次实验做完我习惯把所有配置恢复到初始状态再重新走一遍配置流程这样才能确认自己是真的理解了而不是靠“记忆”碰运气。我个人体会比较深的是网络基础学到最后拼的不是背了多少协议号而是能不能看着一个数据包讲清楚它从哪来、到哪去、经过哪几台设备、每一层做了什么事。这次用 Windows 和 VMware 搭环境复盘下来最大的收获就是把“分层”“封装”“寻址”“路由”这些抽象词全部变成了抓包工具里看得见的一行行内容。如果你也在学网络别急着记命令先把数据包的旅程跑通后面看什么协议都会顺很多。
返回列表