PVE 7.1中使用LXC运行openwrt作为旁路网关【日志】
在PVE中的LXC容器而非虚拟机中运行openwrt可以有效降低系统占用。我的方法不一定正确,分享出来供大家参考。
我目前试了两种方案,一种是在直接在lxc中跑openwrt;另一种是先在lxc中跑一个linux,在linux中安装docker,docker中再跑openwrt作为旁路网关。该方法仅供参考,不一定具有实际意义。优点主要有两个,LXC的系统占用比较低;由于docker上的openwrt可以方便的更新docker镜像,从而减少了更新openwrt的繁琐步骤。
以下方案均基于**PVE虚拟机:7.1-10**
方案1:
- 固件选用,我推荐esir大佬的固件。自行选取其他固件也可以
01 - Lean Code x86_64 Firmware | 固件 - Google Drive
- 任选eSir高大全版或eSir精品小包的img.gz文件解压得到img文件,再次用windows的7zip软件打开这个img ,解压出里面最大的文件,得到里面是三个文件0.img、1.img、2.img,假设我是1.img最大,解压出来备用
- 把刚才的1.img上传到PVE宿主机的目录**/var/lib/vz/template/cache**
- 打开PVE的Shell
输入以下命令:
1 | apt install squashfs-tools |
- 清理临时文件:
1 | rm -R /var/lib/vz/template/cache/squashfs-root |
- 创建LXC容器
1 | pct create 100 local:vztmpl/openwrt-21.02.0-rc3-x86-64-rootfs.tar.gz --rootfs local-lvm:4 --ostype unmanaged --hostname OpenWrt --arch amd64 --cores 2 --memory 2048 --swap 0 -net0 bridge=vmbr0,name=eth0 |
各参数说明:
vmid:100
容器编号,可以根据需要自行设置,这里设为100,后面的相关设置会用到该编号。
local:vztmpl/openwrt-21.02.0-rc3-x86-64-rootfs.tar.gz
容器模板, local:vztmpl/ 指向 /var/lib/vz/template/cache/目录,是pve的默认模板存放目录,webUI上传的模板就存在该位置,可根据需要改为其他目录,openwrt-21.02.0-rc3-x86-64-rootfs.tar.gz为模板文件名。
–rootfs local-lvm:4
根磁盘位置,local-lvm可以根据实际情况修改为其他存储位置,4表示空间大小为4G。
–ostype unmanaged
系统类型,之后可在设置文件中修改。
–hostname OpenWrt
容器名称,之后可在设置文件中修改。
–arch amd64
系统架构,amd64 | arm64 | armhf | i386。
–cores 2
分配给容器的核心数。
–memory 2048
分配给容器的内存大小,这里是2G。
–swap 0
分配给容器的交换区大小,这里是0。
-net0 bridge=vmbr0,name=eth0
容器网络设置,这里设置网络0为容器中增加网卡eth0,桥接到主机的vmbr0接口。
在PVE的后台启动openwrt后,在LXC容器内输入:
1 | nano /etc/config/network |
修改Lan口部分,所有的 192.168.123.x
需要根据设备所处网段修改,option gateway
和option dns
填写主路由的 IP,option ipaddr
定义了 OpenWrt 的 IP 地址,在完成网段设置后,IP最后一段可根据自己的爱好修改(前提是符合规则且不和现有已分配 IP 冲突)
1 | config interface 'lan' |
修改完后,重启网络
1 | /etc/init.d/network restart |
方案2:
- 选择一个你熟悉的linux进行下载,我建议用ubuntu或debian
- 利用下载好的模板创建LXC容器,作为宿主机使用
- 在LXC容器中安装Docker
安装过程参考这两个网址
- 拉取Docker镜像,这里我推荐SuLinggg或小鸡过河的镜像,这是他们的Docker仓库地址
可以用以下命令拉取镜像
1 | docker pull registry.cn-shanghai.aliyuncs.com/suling/openwrt:x86_64 |
或
1 | docker pull kiddin9/openwrt-nginx:x86_64 |
- 创建并启动镜像
如果你使用SuLinggg的镜像:
1 | docker run --restart always --name openwrt -d --network macnet --privileged registry.cn-shanghai.aliyuncs.com/suling/openwrt:x86_64 /sbin/init |
使用小鸡过河的镜像
1 | docker run --restart always --name openwrt -d --network macnet --privileged kiddin9/openwrt-nginx:x86_64 /sbin/init |
启动容器后,我们可以使用 docker ps -a
命令查看当前运行的容器:
- 进入容器并修改相关参数
1 | docker exec -it openwrt bash |
执行此命令后我们便进入 OpenWrt 的命令行界面,首先,我们需要编辑 OpenWrt 的网络配置文件:
1 | vim /etc/config/network |
更改 Lan 口设置:
1 | config interface 'lan' |
- 重启网络
1 | /etc/init.d/network restart |
- 修复宿主机网络
由于 docker 网络采用 macvlan 的 bridge 模式,即使宿主机与容器在同一网段,相互之间也是无法通信的。 为了解决这个问题,需利用多个 macvlan 接口之间是互通的原理,在 LAN 口新建一个 macvlan 虚拟接口:
- 若宿主机 IP:192.168.1.21
- OPENWRT IP:192.168.1.20
把下面这行加到宿主机的/etc/rc.local里
1 |
|
注意加横线的这两个ip要根据你的实际情况进行更改
- 最后宿主机执行
1 | sudo systemctl enable rc-local |
以上内容仅供参考,具体以你的网络环境为准。如果有不对的地方也可以在评论区指出,供大家参考