Horo

「咱可是贤狼啊。起码还是知道这世界上有很多东西是咱所不了解的。」 咱以“知识共享 署名-相同方式共享 4.0 协议”授权这里的文字内容。

Hyper-V 和 OpenWrt 搭建 Windows 用软路由

發布於
通过 Hyper-V 和 OpenWrt 为电脑搭建一个小型子网。

笔记本上虚拟机越开越多,于是怎么给它们划分网络就是一个问题,例如代理软件什么的。

因为咱不想每一个虚拟机上就单独设置一遍,就想起来了咱给咱手上不支持代理设置的设备(例如游戏主机什么的)连的那个运行有代理软件的路由器了。然后发现已经有人尝试过了,那就开工咯。

介于随便汝等说咱是更想授之以渔还是就是在偷懒都好的想法,咱不会给出事无巨细的操作方法。当然如果汝也想跟着做的话,遇到问题时也可以来问咱(或者上网搜索一番)。 以及基于 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 和代理软件什么的。

在所有的设置都妥当以后,除了上面提到的允许管理操作系统共享此网络适配器那个选项以外,汝还可以考虑设置虚拟机开机启动。

(在“管理-自动启动操作”那里,可以设置成“总是”来让虚拟机在主机启动时自动启动。)

喜歡我的文章嗎?
別忘了給點支持與讚賞,讓我知道創作的路上有你陪伴。

2

看不過癮?

一鍵登入,即可加入全球最優質中文創作社區