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:

  1. 固件选用,我推荐esir大佬的固件。自行选取其他固件也可以

01 - Lean Code x86_64 Firmware | 固件 - Google Drive

  1. 任选eSir高大全版eSir精品小包的img.gz文件解压得到img文件,再次用windows的7zip软件打开这个img ,解压出里面最大的文件,得到里面是三个文件0.img、1.img、2.img,假设我是1.img最大,解压出来备用
  2. 把刚才的1.img上传到PVE宿主机的目录**/var/lib/vz/template/cache**
  1. 打开PVE的Shell

输入以下命令:

1
2
3
4
5
apt install squashfs-tools
cd /var/lib/vz/template/cache
unsquashfs 1.img
cd squashfs-root
tar zcf ../openwrt.tar.gz ./*
  1. 清理临时文件:
1
2
rm -R /var/lib/vz/template/cache/squashfs-root
rm -f 1.img
  1. 创建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 gatewayoption dns填写主路由的 IP,option ipaddr 定义了 OpenWrt 的 IP 地址,在完成网段设置后,IP最后一段可根据自己的爱好修改(前提是符合规则且不和现有已分配 IP 冲突)

1
2
3
4
5
6
7
8
9
10
config interface 'lan'
option type 'bridge'
option ifname 'eth0'
option proto 'static'
option ipaddr '192.168.123.100'
option netmask '255.255.255.0'
option ip6assign '60'
option gateway '192.168.123.1'
option broadcast '192.168.123.255'
option dns '192.168.123.1'

修改完后,重启网络

1
/etc/init.d/network restart

方案2:

  1. 选择一个你熟悉的linux进行下载,我建议用ubuntu或debian
  1. 利用下载好的模板创建LXC容器,作为宿主机使用
  2. 在LXC容器中安装Docker

安装过程参考这两个网址

安装 Docker

Install Docker Engine

  1. 拉取Docker镜像,这里我推荐SuLinggg或小鸡过河的镜像,这是他们的Docker仓库地址

Docker Hub

Docker Hub

可以用以下命令拉取镜像

1
docker pull registry.cn-shanghai.aliyuncs.com/suling/openwrt:x86_64

1
docker pull kiddin9/openwrt-nginx:x86_64
  1. 创建并启动镜像

如果你使用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. 进入容器并修改相关参数
1
docker exec -it openwrt bash

执行此命令后我们便进入 OpenWrt 的命令行界面,首先,我们需要编辑 OpenWrt 的网络配置文件:

1
vim /etc/config/network

更改 Lan 口设置:

1
2
3
4
5
6
7
8
9
10
config interface 'lan'
option type 'bridge'
option ifname 'eth0'
option proto 'static'
option ipaddr '192.168.123.100'
option netmask '255.255.255.0'
option ip6assign '60'
option gateway '192.168.123.1'
option broadcast '192.168.123.255'
option dns '192.168.123.1'
  1. 重启网络
1
/etc/init.d/network restart
  1. 修复宿主机网络

由于 docker 网络采用 macvlan 的 bridge 模式,即使宿主机与容器在同一网段,相互之间也是无法通信的。 为了解决这个问题,需利用多个 macvlan 接口之间是互通的原理,在 LAN 口新建一个 macvlan 虚拟接口:

  • 若宿主机 IP:192.168.1.21
  • OPENWRT IP:192.168.1.20

把下面这行加到宿主机的/etc/rc.local里

1
2
3
4
5
6
#!/bin/bash
ip link set eth0 promisc on
ip link add mynet link eth0 type macvlan mode bridge
ip addr add **192.168.1.21** dev mynet
ip link set mynet up
ip route add **192.168.1.20** dev mynet

注意加横线的这两个ip要根据你的实际情况进行更改

  1. 最后宿主机执行
1
sudo systemctl enable rc-local

以上内容仅供参考,具体以你的网络环境为准。如果有不对的地方也可以在评论区指出,供大家参考