1. 前言
最近开始折腾华为 eNSP。
原本以为这只是一个“装好软件、拖几个路由器、敲命令”的普通实验,结果第一步就撞上了兼容性问题。
我的宿主系统比较新,是 Windows 11 26H2,而传统 eNSP 使用的是一套相对古老的软件栈:
- eNSP
- Oracle VirtualBox 5.x
- WinPcap 4.1.3
- Wireshark 3.x
直接在新系统上安装这套环境并不是一个特别理想的选择。
所以最后采取了一个看起来有些“套娃”,但实际上很干净的方案:
Windows 11 26H2 宿主机 │ ▼ VMware │ ▼ Windows 10 22H2 │ ▼ VirtualBox │ ▼ eNSP │ ▼ AR / LSW / PC / Server也就是专门开一台 Windows 10 虚拟机,把整套旧版网络实验环境都关在里面。
事实证明,真正麻烦的地方也正是这里:
虚拟化里面还要继续虚拟化。
2. 为什么不用宿主机直接装 eNSP
老版 eNSP 和新版 Windows 之间存在不少兼容性问题。
特别是它依赖的 VirtualBox、WinPcap 等组件,本身就是很多年前的软件。
为了避免:
- 老驱动直接进入宿主系统
- VirtualBox 和新版 Windows 虚拟化组件冲突
- eNSP 环境污染日常使用的系统
- 后续卸载留下大量虚拟网卡和驱动
我最后选择:
Windows 11 ↓VMware ↓Windows 10 ↓完整安装 eNSP 软件栈这样即使 eNSP 环境彻底炸掉,也只需要处理这一台虚拟机。
TIP对于这种依赖大量旧版驱动、虚拟网卡和旧虚拟化平台的软件,用专用虚拟机隔离通常比直接折腾宿主机舒服得多。
3. 第一关:eNSP 能打开,但 AR 一启动系统就卡死
一开始,eNSP 本身能够正常运行。
PC 可以启动,交换机也能启动。
但是只要启动 AR 路由器,整个 VMware Guest 就会直接卡住,甚至鼠标都无法正常移动。
这显然已经不是一个普通的“设备启动失败”。
当时的实际结构是:
物理 CPU │Windows 11 │ VMware │Windows 10 │VirtualBox │ eNSP AR而 eNSP 中的 AR 设备需要由里面的 VirtualBox 真正启动一个虚拟设备。
问题就在这里。
3.1 VMware 没有成功拿到 VT-x/EPT
最关键的一条报错是 VMware 启动时提示:
此平台不支持虚拟化的 Intel VT-x/EPT。
不使用虚拟化的 Intel VT-x/EPT,是否继续?这一下基本就把问题定位了。
VMware 本身虽然可以运行 Windows 10,但它没办法继续把 CPU 的硬件虚拟化能力暴露给 Guest。
于是结构实际上变成了:
物理 CPU │ ├── VT-x/EPT │Windows 11 │ VMware │ X 无法继续传递 VT-x/EPT │Windows 10 │VirtualBox │ eNSP AR里面那一层 VirtualBox 拿不到它需要的虚拟化支持。
IMPORTANT这次问题真正的核心并不是 eNSP 配置错误,也不是网线、IP 地址或 AR 命令错误,而是 嵌套虚拟化没有真正跑通。
4. Hyper-V 为什么会影响 VMware 嵌套虚拟化
检查宿主机以后发现,Windows 中还启用了:
Windows 虚拟机监控程序平台虚拟机平台这些组件会使用微软自己的 Hyper-V 虚拟化体系。
对于普通 VMware 使用,它们不一定会导致 VMware 完全不能运行。
但是我这里不是简单的:
宿主机↓VMware↓Guest而是:
宿主机↓VMware↓Guest↓VirtualBox↓eNSP我要把硬件虚拟化能力继续往下一层传递。
于是把当前不需要的 Windows 虚拟化功能关闭,并禁用了 Hyper-V Hypervisor 开机启动。
管理员 CMD:
bcdedit /set hypervisorlaunchtype off同时关闭:
Windows 虚拟机监控程序平台虚拟机平台重启物理机之后,再进入 VMware 的处理器设置:
☑ 虚拟化 Intel VT-x/EPT 或 AMD-V/RVI
☐ 虚拟化 CPU 性能计数器☐ 虚拟化 IOMMU然后再次启动 Windows 10。
这次 VMware 不再提示 VT-x/EPT 无法使用。
再启动 eNSP AR:
Please press enter to start cmd line!
<Huawei>成功。
NOTE关闭“虚拟机平台”以后会影响 WSL2;关闭 Hyper-V Hypervisor 也会使 Hyper-V 虚拟机暂时无法启动。
如果以后需要恢复,可以执行:
Terminal window bcdedit /set hypervisorlaunchtype auto然后重新启用对应 Windows 功能并重启。
5. 从“模拟器能开”到“设备真的启动”
AR 成功出现:
<Huawei>这一刻其实才算真正解决环境问题。
因为之前只是:
eNSP 图形界面能运行。
而现在则是:
eNSP 后面的虚拟网络设备真的跑起来了。
这两件事完全不同。
之后就可以正式进入网络实验。
6. 第一个双网段实验
搭建的基本拓扑如下:
192.168.1.0/24
PC1 ─┐ │Server1 │ LSW1 │ │ GE0/0/0 │ 192.168.1.1 AR1 │ 192.168.2.1 │ GE0/0/1 LSW2 │ ┌──┴─────┐ PC2 Client1
192.168.2.0/24AR1 左右两个接口分别配置:
GE0/0/0192.168.1.1/24
GE0/0/1192.168.2.1/24配置命令如下:
system-view
interface GigabitEthernet 0/0/0ip address 192.168.1.1 255.255.255.0quit
interface GigabitEthernet 0/0/1ip address 192.168.2.1 255.255.255.0quit检查:
display ip interface brief最后得到:
GigabitEthernet0/0/0 192.168.1.1/24 up upGigabitEthernet0/0/1 192.168.2.1/24 up up两个 up 意味着:
Physical = upProtocol = up物理链路和协议状态都正常。
7. 路由器为什么会有两个 IP
刚开始这里其实很容易产生一个疑问:
AR1 到底是 192.168.1.1,还是 192.168.2.1?
答案是:
都是。
不是整台路由器只有一个 IP。
IP 地址实际上配置在接口上。
因此:
AR1 GE0/0/0 = 192.168.1.1/24AR1 GE0/0/1 = 192.168.2.1/24可以理解成路由器的两只脚分别踩在两个网络里:
192.168.1.0/24 │ 192.168.1.1 │ AR1 │ 192.168.2.1 │192.168.2.0/24对于左边网络来说:
192.168.1.1就是出口。
对于右边网络来说:
192.168.2.1也是出口。
于是它们分别成为两个网段的默认网关。
8. 默认网关到底是什么
假设 PC2:
IP:192.168.2.2Mask:255.255.255.0Gateway:192.168.2.1如果它访问:
192.168.2.3主机会先利用子网掩码判断:
192.168.2.2/24192.168.2.3/24双方都属于:
192.168.2.0/24因此:
目标就在本地网络,不需要找路由器。
但如果目标是:
192.168.1.2PC2 会发现:
本机:192.168.2.2/24→ 192.168.2.0
目标:192.168.1.2/24→ 192.168.1.0不是同一个网络。
这时候 PC2 才会使用:
Default Gateway = 192.168.2.1所以可以把默认网关理解成:
如果目标不属于我的本地网络,而我又没有更具体的路由,那就先把数据交给这个设备。
TIP一个非常实用的判断:
目标和自己同网段?│┌────┴────┐│ │是 否│ │ARP目标 ARP网关│ │直接发送 交给路由器
9. 为什么网关必须和主机在同一个网段
例如:
PC2:192.168.2.2/24正确网关:
192.168.2.1如果错误地设置成:
192.168.1.1就会产生一个逻辑问题:
我需要通过网关才能前往其他网络,但这个“网关”本身就已经位于另一个网络。
相当于:
我要出门↓先去找大门↓但是大门本身就在墙外↓那我怎么去找这个门?所以默认网关通常必须是:
本机能够通过当前二层网络直接到达的三层设备接口。
10. 同一个交换机里的 Ping 到底怎么走
假设:
PC A:192.168.2.3PC B:192.168.2.2双方都在:
192.168.2.0/24那么:
192.168.2.3 ping 192.168.2.2根本不会经过 AR1。
10.1 主机首先需要知道 MAC
PC A 知道:
目的 IP = 192.168.2.2但是以太网真正发送数据时需要的是:
目的 MAC如果 ARP 表里没有对应记录,就发送:
Who has 192.168.2.2?Tell 192.168.2.3即 ARP Request。
这个帧目的 MAC 是:
FF:FF:FF:FF:FF:FF也就是广播。
11. 交换机到底学什么
交换机收到 PC A 的 ARP 广播以后,会先观察:
这个帧是从哪个端口进来的?它的源 MAC 是多少?然后学习:
MAC_A → GE0/0/1这就是交换机 MAC 地址表。
因为 ARP Request 是广播,交换机会把它从同 VLAN 的其他端口发出去。
PC B 收到以后发现:
目标 IP = 192.168.2.2正是自己。
于是返回:
192.168.2.2 is at MAC_B交换机又学到:
MAC_B → GE0/0/2最终:
交换机 MAC 表:
MAC_A → GE0/0/1MAC_B → GE0/0/2而 PC A 的 ARP 表中则会出现:
192.168.2.2 → MAC_B这是两个不同的概念:
主机 ARP 表:IP → MAC
交换机 MAC 表:MAC → 端口之后真正的 ICMP Ping 才能进行。
12. 跨网段 Ping 又有什么不同
现在变成:
192.168.1.2 ↓ ping ↓192.168.2.2源主机发现:
192.168.2.2不属于自己的:
192.168.1.0/24因此它不会 ARP 查询 192.168.2.2。
而是:
ARP:谁是 192.168.1.1?也就是寻找自己的默认网关。
得到 AR1 左侧接口 MAC 后,PC 封装:
IP:源 IP = 192.168.1.2目的 IP = 192.168.2.2
Ethernet:源 MAC = PC1目的 MAC = AR1 左接口这里有一个非常重要的区别:
IP 的目的地仍然是真正的远程主机,但 MAC 的目的地只是当前这一跳的路由器。
13. 路由器收到以后发生了什么
AR1 收到数据帧以后:
首先发现:
目的 MAC = 自己于是接收帧。
然后去掉这一层 Ethernet 封装,查看 IP:
目的 IP = 192.168.2.2接着查询路由表。
因为:
GE0/0/1 = 192.168.2.1/24所以 AR1 天生就拥有一条直连路由:
192.168.2.0/24 → GE0/0/1不需要额外添加静态路由。
AR1 接下来在右边网段 ARP:
Who has 192.168.2.2?拿到 PC2 MAC 后,重新封装一个新的 Ethernet Frame:
源 MAC = AR1 右接口目的 MAC = PC2但里面的 IP 仍然是:
源 IP = 192.168.1.2目的 IP = 192.168.2.2所以:
PC1 │ │ MAC: │ PC1 → AR1-left │ │ IP: │ 1.2 → 2.2 ▼AR1 │ │ MAC: │ AR1-right → PC2 │ │ IP: │ 1.2 → 2.2 ▼PC2IMPORTANT普通路由过程中:
二层 MAC 地址会逐跳改变。
而:
源 IP 和目的 IP 通常不会改变。
如果中间存在 NAT,则是另一个问题。
14. 第一次 Ping 为什么可能丢包
实验时还遇到过一个很有意思的现象:
PC> ping 192.168.2.2
Request timeout!Request timeout!
From 192.168.2.2: bytes=32 seq=3 ttl=127From 192.168.2.2: bytes=32 seq=4 ttl=127From 192.168.2.2: bytes=32 seq=5 ttl=127看起来像:
40% packet loss但随后再次 Ping 往往就正常了。
原因之一就是第一次通信之前,网络设备可能还需要完成:
PC → ARP 网关AR1 → ARP 目的主机交换机 → 学习 MAC等 ARP 与 MAC 表项建立完成之后,后面的通信就不需要重新做这一整套过程。
而且 eNSP 本身又运行在:
VMware↓Windows 10↓VirtualBox↓虚拟网络设备处理延迟本身也会比真实硬件更加明显。
15. TTL = 127 也说明了数据经过路由器
在跨网段 Ping 中还观察到了:
ttl=127如果发送端初始 TTL 为:
128经过一个三层路由器:
128 → 127于是也可以侧面验证数据路径:
PC1 ↓LSW1 ↓AR1 TTL - 1 ↓LSW2 ↓PC2交换机二层转发不会像路由器一样减少 IP TTL。
16. 从 Ping 到 HTTP
在基本 ICMP 测试成功以后,又继续加入了:
ServerClient拓扑变成:
Server1 │ LSW1 │ AR1 │ LSW2 │Client1Server1 配置在:
192.168.1.0/24默认网关:
192.168.1.1Client1 配置在:
192.168.2.0/24默认网关:
192.168.2.1最开始 HTTP Client 使用了:
http://0.0.0.0/default.htm自然无法访问。
0.0.0.0 通常代表未指定地址或监听所有本地接口,并不是一个正常的远程服务器目的地址。
修改为 Server1 的真实 IP,同时在 HTTP Server 中指定网页根目录并启动 80 端口以后,再次访问:
http://192.168.1.x/default.htm最终获得:
200 OK17. 为什么 HTTP 200 OK 比 Ping 通更有意义
Ping 成功只能证明:
ICMP↓IP↓二层网络基本工作正常。
而 HTTP 成功意味着:
HTTP ↓TCP ↓IP ↓Router ↓Ethernet / ARP这一整条路径都已经能够正常工作。
于是这次实验从最底层的虚拟化环境,一直打通到了应用层。
可以画成:
应用层:HTTP ↓传输层:TCP ↓网络层:IP + Router ↓数据链路层:Ethernet + MAC + ARP ↓虚拟化环境:eNSP ↓VirtualBox ↓Windows 10 ↓VMware ↓Windows 11最终:
HTTP/1.x 200 OK18. 这次真正串起来的知识
原本很多概念都是分开的:
IP 地址子网掩码MAC 地址ARP交换机默认网关路由器HTTP但搭完这套网络以后,它们开始变成了一条完整的链。
同网段
IP↓判断同网段↓ARP 目标 IP↓得到目标 MAC↓交换机查 MAC 表↓直接到目标跨网段
IP↓判断不同网段↓ARP 默认网关↓把帧交给路由器↓路由器查询路由表↓路由器在下一网段 ARP↓重新封装 Ethernet Frame↓到达目标归根结底:
主机:IP → MAC
交换机:MAC → Port
路由器:Destination Network → Next Hop / Interface三者职责完全不同。
19. 几个这次踩到的坑
WARNINGVMware 能运行不代表嵌套虚拟化正常
Windows 10 Guest 能正常开机,只能说明第一层虚拟化正常。
真正需要检查的是:
VMware↓能不能把 VT-x/EPT 再暴露给 Guest对于 eNSP + VirtualBox 这种结构,这是决定 AR 能否运行的关键。
WARNING不要把交换机 CLI 当成路由器 CLI
有一次打开的是 LSW1,但是执行了:
sysname AR1于是提示符真的变成:
[AR1]但设备实际上仍然是一台交换机。
设备名称只是名称,并不会把交换机变成路由器。
WARNING192.168.1.0/24 中的 .0 不是普通主机
例如:
192.168.1.0/24通常:
192.168.1.0 = 网络地址192.168.1.255 = 广播地址普通终端应使用中间的可用主机地址。
CAUTION如果为了 VMware 嵌套虚拟化关闭了:
Hyper-V虚拟机平台Windows 虚拟机监控程序平台那么 WSL2、Windows Sandbox、Hyper-V 虚拟机等功能可能暂时不可用。
修改之前最好明确自己当前是否使用这些功能。
20. 总结
这次看起来只是在搭一个简单的双网段实验,但实际做的事情比预想中多得多。
首先解决的是:
Windows 11 26H2↓VMware↓Windows 10↓VirtualBox↓eNSP这一整套嵌套虚拟化环境。
真正的关键是:
让 Intel VT-x/EPT 成功从宿主机经过 VMware 继续提供给 Guest 中的 VirtualBox。
解决这个问题以后,AR 才真正能够正常启动。
接下来又搭建了:
192.168.1.0/24 │ AR1 │192.168.2.0/24并把下面这些知识真正串了起来:
IP 地址 ↓子网掩码 ↓同网段判断 ↓ARP ↓MAC 地址 ↓二层交换 ↓默认网关 ↓路由 ↓TCP ↓HTTP最后成功得到:
200 OK到这里,环境折腾阶段基本结束。
接下来终于可以正式开始学网络了。
TIP这次最大的收获其实不是“把 eNSP 装好了”。
而是第一次能够真正看见:
一个数据包为什么要找 MAC、什么时候找网关、交换机到底看什么、路由器为什么有多个 IP,以及一个 HTTP 请求究竟是怎样穿过两个局域网到达服务器的。