Hyper-V 和 OpenWrt 搭建 Windows 用软路由
笔记本上虚拟机越开越多,于是怎么给它们划分网络就是一个问题,例如代理软件什么的。
因为咱不想每一个虚拟机上就单独设置一遍,就想起来了咱给咱手上不支持代理设置的设备(例如游戏主机什么的)连的那个运行有代理软件的路由器了。然后发现已经有人尝试过了,那就开工咯。
介于随便汝等说咱是更想授之以渔还是就是在偷懒都好的想法,咱不会给出事无巨细的操作方法。当然如果汝也想跟着做的话,遇到问题时也可以来问咱(或者上网搜索一番)。 以及基于 Hyper-V 的特殊性,启用完以后可能会导致老的虚拟机软件无法启动。嘛最新的 VMware Workstation 和 VirtualBox 应该是已经支持了的。
准备工作 - Hyper-V 管理器、映像和创建虚拟机
要使用 Hyper-V 的话,汝得有一个 Windows 8.1/10 专业版或者企业版,或者 Windows Server 2012 以后的 Windows Server 才行。同时也要求汝的 CPU 支持必要的虚拟化技术。(Intel VT-x 或者 AMD-V 什么的)可以通过 PowerShell 里的 systeminfo 命令确定是否可以开启 Hyper-V 。
在满足了前置要求之后,可以这样启用 Hyper-V:
# 如果提示找不到命令的话,换以管理员身份运行的 PowerShell 窗口。 Enable-WindowsOptionalFeature -Online -FeatureName Microsoft-Hyper-V -All
或者用“启用或关闭 Windows 功能”也是可以的。

下载和转换 OpenWrt 映像
接下来到 OpenWrt 的网站上下载映像[1]。(这时候最新的版本是 19.07,于是链接就是 https://downloads.openwrt.org/releases/19.07.7/targets/x86/64/)

这里咱们选择包含有内核和 rootfs 的 combined 那俩,区别在于 squashfs 那个安装好以后系统分区像在普通路由器一样是只读的,可以实现像是升级或者复位等功能。不过咱大概会用检查点来实现这些,那就直接用 ext4 的好了。下载和解压以后汝大概就可以得到一个像是 openwrt-19.07.7-x86-64-combined-ext4.img 这样的文件了。
但是 Hyper-V 只能用微软自己的 VHD 或者 VHDX 格式,所以还需要转换一下。转换的方法有很多,咱这里给出咱的一个例子。
创建一个虚拟磁盘。这里用了 diskpart 命令。如果汝更偏好用磁盘管理操作的话,可以参考 这篇文章。
Microsoft DiskPart version 10.0.21332.1000 Copyright (C) Microsoft Corporation. On computer: DESKTOP-H6MANBV # 创建一个虚拟磁盘文件 # create vdisk file=<汝要存放虚拟磁盘文件的位置> maximum=<它的最大大小,以 MiB 为单位> type=expandable # 假如汝有充足的硬盘空间的话,可以把上面的 type=expandable 改为 type=fixed 创建一个固定大小的虚拟磁盘。 # 可以提高一些虚拟磁盘的性能。当然动态扩展对 OpenWrt 来说也够用就是了…… DISKPART> create vdisk file=c:\test.vhd maximum=8192 type=expandable 100 percent completed DiskPart successfully created the virtual disk file. # 选择刚才创建的虚拟磁盘 # select vdisk file=<汝要存放虚拟磁盘文件的位置> DISKPART> select vdisk file=c:\test.vhd DiskPart successfully selected the virtual disk file. # 挂载刚才选择的虚拟磁盘。 DISKPART> attach vdisk 100 percent completed DiskPart successfully attached the virtual disk file. # 初始化虚拟磁盘为 MBR 分区表。 # OpenWrt 官方编译的版本不支持 UEFI 启动,所以就用 MBR 了。 DISKPART> convert mbr DiskPart successfully converted the selected disk to MBR format. # 在下一步操作完成之后卸载虚拟磁盘 DISKPART> detach vdisk DiskPart successfully detached the virtual disk file.
接下来把这个映像写入虚拟磁盘就 OK 啦。(以及咱发现 Rufus 能把虚拟磁盘识别出来)

创建虚拟交换机和虚拟机
有点像其它 Hypervisor 里的虚拟网络啦,虚拟交换机类型里的外部网络就相当于桥接,内部就相当于仅主机网络。于是这里创建一个外部和一个内部交换机。

留意外部交换机这里的“允许管理操作系统共享此网络适配器”这个选项,把这个选项取消选择以后,这块网卡就只能由虚拟机访问了。等全部设置妥当以后,汝就可以把这个选项关掉让主机从虚拟机联网了。

创建虚拟机的时候,因为刚才提起过的 OpenWrt 官方编译的版本不支持 UEFI 启动的问题,所以就用第一代了。

以及新建虚拟机的时候只能添加一个网络适配器,那这里就先把上面新建的内部交换机加上好了。

创建完成以后可以在虚拟机设置里添加新的网络适配器,虚拟硬盘就是刚刚转换好的磁盘映像(所以汝刚才卸载了没有?)。
在连接和启动虚拟机之后,汝大概就可以看到这样的界面:

所以当然是先用 passwd 命令设置 root 用户的密码啦。
查看和调整网卡设定
如果汝像咱刚才一样先添加的内部交换机, ip link 命令应该可以看到虚拟机从上游获得了 IP 地址,也可以正常的联网。
(为了节省空间,这里省略了获得的和本地 IPv6 地址)
root@OpenWrt:~# ip a 1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN qlen 1000 link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00 inet 127.0.0.1/8 scope host lo valid_lft forever preferred_lft forever inet6 ::1/128 scope host valid_lft forever preferred_lft forever 2: eth0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc mq master br-lan state UP qlen 1000 link/ether 00:15:5d:0a:a9:01 brd ff:ff:ff:ff:ff:ff 3: eth1: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc mq state UP qlen 1000 link/ether 00:15:5d:0a:a9:02 brd ff:ff:ff:ff:ff:ff inet 192.168.10.147/24 brd 192.168.10.255 scope global eth1 valid_lft forever preferred_lft forever 4: br-lan: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc noqueue state UP qlen 1000 link/ether 00:15:5d:0a:a9:01 brd ff:ff:ff:ff:ff:ff inet 192.168.10.1/24 brd 192.168.10.255 scope global br-lan valid_lft forever preferred_lft forever
当然如果没有成功也别担心,记下界面名称(eth0 这样的)下面 link/ether 后面的文字,这就是汝这个虚拟网卡的 MAC 地址啦。
然后在虚拟机设置里找到对应的适配器,高级设置里可以看到这个适配器的 MAC 地址。

于是在咱这里,要连到上游的接口就是 eth1 了。接下来用 vim 打开 /etc/config/network 文件。
它默认的里面只有 vim 让咱也很难办啊,如果汝对 VIM 的操作不是很熟练的话,记得准备一个操作指南在手边。
config interface 'loopback' option ifname 'lo' option proto 'static' option ipaddr '127.0.0.1' option netmask '255.0.0.0' config globals 'globals' option ula_prefix 'fddb:38c5:4b0a::/48' config interface 'lan' option type 'bridge' # 把这里的 eth0 换成汝内部交换价连接的适配器上的接口 option ifname 'eth0' option proto 'static' # 默认是 192.168.1.1,如果担心和自己网络上已有的端冲突的话也可以修改一下。 option ipaddr '192.168.50.1' option netmask '255.255.255.0'option ip6assign '60' config interface 'wan' # 把这里的 eth1 换成汝外部交换价连接的适配器上的接口 option ifname 'eth1' option proto 'dhcp' # 如果汝的上游网络支持 IPv6,那可以添上这一段试试? config interface 'wan6' option ifname 'eth1' option proto 'dhcpv6' option reqaddress 'try' option reqprefix 'auto'
保存完成以后可以重启网络服务,或者直接重启系统也行。一切顺利的话,主机上的虚拟交换机应该能正确的获得 IP 地址:
Ethernet adapter vEthernet (Internal): Connection-specific DNS Suffix . : lan IPv6 Address. . . . . . . . . . . : fd51:c6aa:1df:0:99e6:8496:55c7:733e IPv6 Address. . . . . . . . . . . : fddb:38c5:4b0a::a32 IPv6 Address. . . . . . . . . . . : fddb:38c5:4b0a:0:99e6:8496:55c7:733e Temporary IPv6 Address. . . . . . : fd51:c6aa:1df:0:b04a:f9d5:61bd:63e4 Temporary IPv6 Address. . . . . . : fddb:38c5:4b0a:0:8d12:c734:e2f0:8ec8 Link-local IPv6 Address . . . . . : fe80::99e6:8496:55c7:733e%26 IPv4 Address. . . . . . . . . . . : 192.168.50.145 Subnet Mask . . . . . . . . . . . : 255.255.255.0 Default Gateway . . . . . . . . . : fe80::215:5dff:fe0a:a901%26 fe80::215:5dff:fe0a:a907%26 192.168.50.1
接下来就像使用一个普通的有 OpenWrt 的路由器一样设置它吧,像是装上 luci 和代理软件什么的。
在所有的设置都妥当以后,除了上面提到的允许管理操作系统共享此网络适配器那个选项以外,汝还可以考虑设置虚拟机开机启动。
(在“管理-自动启动操作”那里,可以设置成“总是”来让虚拟机在主机启动时自动启动。)
Like my work? Don't forget to support and clap, let me know that you are with me on the road of creation. Keep this enthusiasm together!