PVE 安装 OpenWrt 作为旁路由

双11入手了一台 J4125 的小主机作为软路由,在上面安装了虚拟化系统 Proxmox VE。这是安装 OpenWrt 的记录。

题外话

为什么选择 All-in-One 这样的方案?知乎上面有很多 AIO 的劝退贴1,主要的观点例如:部署稳定的AIO需要比较高的技术门槛,并且一旦出现故障会影响家庭网路,数据安全很难保证云云,这些对于小白来说确实是不小的问题。然而,作为一个相关领域的从业人员,并且有玩过 VPS 和虚拟机经验的我来说,装装系统,改改配置文件啥的已经是轻车熟路了(bushi

我的主要需求一个是软路由,一个是离线下载和在局域网共享电影,还有就是想试一试 Home Assistant 这个系统,据说可以统一所有的智能家居设备。这些都是需要长期运行的服务,如果用台式机做这些事情也是可以的,但是用电量就比较大了。工控小主机的低功耗就很适合这种场景,J4125 CPU 最大功率是 10W,整机待机的功率也很少超过 10 瓦,特别省电。至于安全问题,影音娱乐啥的算不上重要数据,路由的话使用旁路网关的方式就可以避免一出问题全屋上不了网的情况了。

组网

在设备 IP 地址的配置中通常有一项是“默认网关”,当计算机要发送数据到不在其直接连接的网络上的目标时,就会把数据包发送到默认网关,由默认网关负责将数据包转发到目标网络。我们的设备访问互联网的时候就是先把数据包发给默认网关(路由器),然后数据包会被发送给互联网上的目标。

“旁路由”的实现方式正是利用了这一点。通常情况下默认网关就是路由器的 IP 地址,如果把默认网关配置成其他的设备,让别的设备进行路由和转发,我们就能在不修改原有网络的情况下更好地控制网络流量了。

网络拓扑图

拓扑图如上面所示,路由器的 LAN 口和 PVE 主机的网口连接。在 PVE 里面把连路由器的接口、Openwrt 的接口分配到相同的虚拟网桥(Linux Bridge)上面。其他设备还是正常用 Wi-Fi 或者网线连接路由器。

准备

  1. 安装好的 PVE 系统
  2. OpenWrt 系统镜像。为了扩容方便,选择使用 Ext4 分区的 generic-ext4-combined-efi.img.gz 文件。下载页面,在 root 首页找最新版本
  3. GParted Live CD 镜像,用来修改系统分区大小。下载页面

创建虚拟机

Openwrt 需要的资源并不多,可以根据自己需要划分内存和 CPU。选择的镜像是 efi 的,所以 BIOS 要选择 UEFI 的,不需要勾选添加 EFI 磁盘。在磁盘页面也不需要添加磁盘,稍后会从镜像导入。

BIOS 选择支持 UEFI 的

由于是旁路由,网络设置使用默认的桥接就好了。

创建完成的虚拟机信息

登录 PVE,下载镜像文件,并解压:

1
2
3
4
5
cd /var/lib/vz/template/iso

wget https://downloads.openwrt.org/releases/23.05.2/targets/x86/64/openwrt-23.05.2-x86-64-generic-ext4-combined-efi.img.gz

gunzip openwrt-23.05.2-x86-64-generic-ext4-combined-efi.img.gz

将磁盘镜像文件导入到刚刚创建的虚拟机:

1
2
# qm disk import <vmid> <source> <storage> [OPTIONS]
qm disk import 103 openwrt-23.05.2-x86-64-generic-ext4-combined-efi.img local-lvm

然后回到 PVE 管理网页,选中新的磁盘编辑,添加。

编辑使用刚刚导入的磁盘

现在可以开机进入系统了。但是不急,默认磁盘的剩余空间很小,放不了很多东西。为了以后考虑,还要给磁盘扩容。

磁盘扩容

磁盘操作 > 调整磁盘大小,扩大虚拟磁盘的大小。

调整虚拟磁盘大小

接下来是调整分区大小。这一步是可以用命令做的,我偷了一点懒,懒得学分区操作的命令,用了图形化分区工具 GParted,操作起来比较简单。

先在 PVE 的 ISO 镜像储存界面上传 GParted 镜像,然后给 OpenWrt 的虚拟机的 CD/DVD 添加上。在 选项 > 引导顺序 中调整到光盘最高。

修改启动顺序

进入系统之后,操作很方便了。根据提示修复错误,然后右键 rootfs 分区调整大小,拖动箭头,把剩余空间拉满就可以了。最后点击打勾保存关机。

因为扩容,GParted 警告分区表和磁盘空间不符 GParted 调整分区大小界面

移除光盘,调整启动顺序,重新启动,就能够进入系统了。

df -h

可以看到根分区的大小已经是合适的了。

网络配置

ip addr 查看 IP 地址,发现不对,无法连接。去修改配置文件。

没有正确获取 IP 地址
1
vim /etc/config/network

lan 的配置改成自己网络的 IP 地址。我这里用 DHCP 自动获得 IP 地址,并且加上了 IPv6 的配置。

1
2
3
4
5
6
7
8
9
10
11
config interface 'lan'
option device 'br-lan'
option proto 'dhcp'
#option proto 'static'
#option ipaddr '192.168.1.1'
#option netmask '255.255.255.0'
#option ip6assign '60'

config interface 'lan6'
option device 'br-lan'
option proto 'dhcpv6'

修改完成后重启网络:

1
service network restart
重启网络之后

现在已经正确获取了 IP 地址,可以用 SSH 连接或者浏览器访问管理页面了。

一些基础配置:

1
2
3
4
5
6
7
8
9
# 软件源换成清华镜像源
sed -i 's_downloads.openwrt.org_mirrors.tuna.tsinghua.edu.cn/openwrt_' /etc/opkg/distfeeds.conf
# 更新软件包索引
opkg update
# 中文包
opkg install luci-i18n-base-zh-cn
opkg install luci-i18n-firewall-zh-cn
# mDNS 支持,安装后可以用 http://openwrt.local 打开管理页面
opkg install avahi-daemon-service-http

在 OpenWrt 网页管理页面,网络 > 接口 里面,把 DHCP 相关的设置关掉,因为旁路由不需要提供 DHCP 服务。

关闭 DHCP 相关服务

终端配置

有两种办法,一种是在设备上手动设置网关为软路由的IP地址,另一种是在主路由上面把 DHCP 默认网关设置为软路由的 IP。为了稳定,我用手动配置的办法。主路由有两个 WiFi 信号,一个 2.4G 的一个 5G 的,把 2.4G 的设置成手动 IP 和软路由的网关,5G 的那个保持默认,这样切换起来也还算方便。

在网络设置里面把网关和 DNS 设置为软路由的 IP 地址

配置完成之后进行简单的 traceroute 验证:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
C:\>tracert -4 blog.beanbang.cn

通过最多 30 个跃点跟踪
到 pybkxhsa.slt-dk.sched.tdnsv8.com [120.226.2.7] 的路由:

1 8 ms 3 ms 3 ms 192.168.31.246
2 19 ms 4 ms 4 ms 192.168.31.1
3 10 ms 6 ms 4 ms 192.168.1.1
4 6 ms 5 ms 5 ms 100.86.64.1
5 * * * 请求超时。
6 * * * 请求超时。
7 36 ms * * 221.183.44.38
8 33 ms 36 ms 33 ms 221.183.91.202
9 55 ms * * 183.214.150.214
10 * 33 ms * 36.158.200.206
11 * * * 请求超时。
12 * * * 请求超时。
13 42 ms 134 ms 35 ms 120.226.2.7

跟踪完成。

可以看到第一跳、第二跳、第三跳分别是软路由、我的硬路由和光猫,然后是联通的网络,最后到达目标地址。

参见:

作者

Lazyb0x

发布于

2023-11-26

更新于

2023-12-09

许可协议

评论