前言

最近为了入门 NetDevOps,买了知乎上弈心大佬写的一本书,叫《网络工程师的 Python 之路》。写的还可以,从网络工程师的视角讲解了 Python 的基本用法。也让我补足了之前碎片化的 Python 语法。

不过,进入到第 4 章后,就需要完成一些虚拟或是真机实验,然而我从来没有成功地在 GNS3 上运行过一次虚拟实验,更别提真机实验了。因此,搭建实验环境成了一个挑战。毕竟,实验的内容是通过 Python 程序来自动化运维路由器和交换机,如果 Python 程序访问不到这些网络设备,何谈运维?

因此,这篇文章的写作目的在于整理一下环境配置的心得。

环境

  • 主机:Windows11
  • 虚拟机:VMWare Workstation
  • GNS3: v3.0.4

配置虚拟机的方法我就不赘述了,印象中我大概是根据浙大网站上的实验流程配置下来的,只不过 GNS3 的版本和它要求的似乎有些出入。总之,最后配置完成的效果是,虚拟机中运行 GNS3 的后端软件,Windows11 上的 GNS3 前端能够连接到后端服务。

GNS3后端截屏

GNS3前端连接后端服务

需要导入 Cisco 的路由器和交换机镜像,下载地址在这个 Github 链接中。
为了方便,我把具体内容复制过来。L2 交换机需要从 7 ~ 9 中选一个下载,而 L3 交换机在前几个里面选择一个下载吧。

导入的方法是在 GNS3 中选择 File->Image Managment->Upload,之后选择下载的文件。我不知道直接选择压缩包是否可以,我是把压缩包解压,选择其中的 qcow2 格式的文件导入的。

SR NAME DOWNLOAD
1 vios-adventerprisek9-m.spa.158-3.m2.tgz Download here
2 vios-adventerprisek9-m.SPA.159-3.M2.tgz Download here
3 vios-adventerprisek9-m.SPA.159-3.M3.tgz Download here
4 vios-adventerprisek9-m.SPA.159-3.M4.tgz Download here
5 vios-adventerprisek9-m.SPA.159-3.M6.tgz Download here
6 vios-adventerprisek9-m.vmdk.SPA.157-3.M3.tgz Download here
7 viosl2-adventerprisek9-m.SSA.high_iron_20180619.tgz Download here
8 viosl2-adventerprisek9-m.ssa.high_iron_20200929.tgz Download here
9 viosl2-adventerprisek9-m-v152_6_0_81_e-20190423.tgz Download here

实验准备

本次实验的拓扑结构如下。拓扑结构的中心是一个二层交换机,它连接了五个路由器和一个 Cloud。Cloud 的作用是让主机和 GNS3 中的虚拟网络能够访问。

比如,GNS3 虚拟网络中有一台路由器的 IP 是 192.168.223.11,那么在 Windows 主机的控制台中输入 ping 192.168.223.11 这一 IP,能够得到响应。

实验拓扑结构

连接准备

一般来说,在 VMware 安装 GNS3 虚拟机的教程里,我们已经配置好了虚拟网卡,分别有三个网卡,负责 NAT 模式、桥接模式和仅主机模式。下面是 AI 对这三种模式的区别总结。

VMware 网络模式 能否让主机访问 GNS3 VM? 说明
桥接 (VMnet0) ✅ 可以 VM 直接在物理网同一网段,Windows 可以 ping 到 VM 内部 IP
NAT (VMnet8) ⚠️ 一般不直接可达 VM 访问外网没问题,但主机访问 VM 需要额外端口转发
Host-only (VMnet1) ✅ 可以(仅主机与 VM) VM 与主机可互相 ping,但 VM 无法访问外网

当然,桥接的时候注意,选择的外部连接应该和当前主机的网络环境相同。这里引用浙大计网实验网站上的提示。

如果你使用无线网卡上网,你的无线网卡名称可能类似:Intel® Wifi6 xxxx 或 Realtek xxx Wifi6 或 Mediatek Wifi6 xxxx

如果你使用有线网卡上网,你的有线网卡名称可能类似:Realtek PCIe GbE Family Controller 或 Realtek PCIe FE Family Controller

虚拟网络编辑器界面

Cloud 的配置

现在虚拟机的准备工作已经完成,需要处理 GNS3 中 Cloud 的连接。右键一下界面中的 Cloud,点击 Configure,可以看到如下的端口。

Cloud->Configure

如何理解这三个端口?为什么不像有些教程中显示的那样,会出现许多 VMWare 的端口可供选择?

事实上这篇文章说的是正确的,这三个接口就够了,它们就分别对应了 VMware 虚拟网络编辑器中的三个 VMnet。

那么,问题来了,如何知道 eth -> VMnet 的对应关系?换言之,如果我想通过 NAT 模式连接主机,该让 Cloud 的哪个 eth 端口连接虚拟交换机?

这时候只需要回到 VMware 虚拟机中,按下回车进入到下面的控制界面。选择 Shell,输入 ip a | less,就能查看到 eth 和 VMnet 的对应关系。这里在管道运算符后添加 less 是为了方便滚动阅读,如果不加 less,有可能我们需要的配置信息会被顶到屏幕外。

选项卡

输出内容

推测一下,我们之前给仅主机模式配置的 IP 段是 192.168.223.0/24,所以 eth0 多半是仅主机模式;eth2 和我物理 Windows 主机在家中局域网的 IP 段是一样的,多半是桥接模式;剩下的 eth1 多半是 NAT 模式了。

这篇文章说的很不错,这里引用一下:

根据实验要求,如果只和物理机进行私网通信,则选择仅主机模式对应的网络接口(即 eth0),如果想共享使用物理机的 IP 对外通信,则选择 NAT 模式对应的网卡接口(即 eth1),需要使用与物理机相同网段的独立 IP 实现对外通信,则选择桥接模式对应的网卡接口(即 eth2)。

一般情况下,使用主机模式即可,此时路由器仅能与物理机上的软件通信, 比如不同的虚拟机之间互相访问。如需要访问物理机以外的其他服务器,则可以使用 NAT 模式或者桥接模式。NAT 模式是路由器以物理机的 IP 身份向外访问,
有些功能可能无法实验,比如物理机之外的其他外部设备 Ping 路由器的接口 IP。桥接模式是路由器以独立的 IP 身份向外访问,外部看来是同时存在物理机和路由器两个设备的。

既然我们需要让 Windows 主机上的 Python 程序能够连接到 GNS3 中虚拟的路由器进行配置,主机模式就足够了。因此,在 GNS3 中选择线缆,把 Cloud 的 eth0 接口和另外的网络设备的接口联系起来,完成了线路连接。

路由器配置

这还不够,因为如果想让路由器和 Windows 主机访问,还需要确保路由器的 IP 和主机在同一个子网内。例如我这里显示 VMnet1(eth0) 的子网是 192.168.223.0/24,那么所有的路由器必须以 192.168.223 开头,也就是处在同一子网内。

配置路由器的命令是

1
2
3
4
5
conf t
int g0/0
ip address 192.168.223.11 255.255.255.0
no shut
end wr

到此为止,在 Windows 主机上 ping 路由器就通了。

1
2
3
4
5
6
7
8
9
10
11
12
C:\Users\summe>ping 192.168.223.11

正在 Ping 192.168.223.11 具有 32 字节的数据:
来自 192.168.223.11 的回复: 字节=32 时间=5ms TTL=255
来自 192.168.223.11 的回复: 字节=32 时间=10ms TTL=255
来自 192.168.223.11 的回复: 字节=32 时间=10ms TTL=255
来自 192.168.223.11 的回复: 字节=32 时间=7ms TTL=255

192.168.223.11 的 Ping 统计信息:
数据包: 已发送 = 4,已接收 = 4,丢失 = 0 (0% 丢失),
往返行程的估计时间(以毫秒为单位):
最短 = 5ms,最长 = 10ms,平均 = 8ms

防火墙设置

然而,此时如果从 GNS3 的虚拟路由器尝试 ping Windows 主机,得不到响应,显示

1
2
3
4
5
Router#ping 192.168.223.1
Type escape sequence to abort.
Sending 5, 100-byte ICMP Echos to 192.168.223.1, timeout is 2 seconds:
.....
Success rate is 0 percent (0/5)

这里 Windows 主机的 IP 通过 ipconfig 可查,确实就是 192.168.223.1,但是为什么得不到回复呢?因为 Windows 的防火墙屏蔽了 ICMP 流量。我们需要在 Windows 防火墙的界面中添加入站规则。

入站规则界面

规则类型:自定义。程序:所有程序。协议和端口:协议名称 ICMPv4。操作:允许连接。

这样,在 GNS3 内部就可 ping 通 Windows 主机了。

1
2
3
4
5
6
Router#ping 192.168.223.1
Type escape sequence to abort.
Sending 5, 100-byte ICMP Echos to 192.168.223.1, timeout is 2 seconds:
!!!!!
Success rate is 100 percent (5/5), round-trip min/avg/max = 6/8/10 ms