手摸手 HomeLab 在 PVE 虚拟机系统安装 OpenWrt + Tun 模式

前言

OpenWrt 有许多魔改发行版本,既然选择 PVE 来构建 HomeLab 系统,我相信你有较强的折腾能力,建议所有镜像或包选择官方版本,因为:

  1. 魔改发行版其兼容性较差,很多版本安装后出现各种各样的问题,你不了解每个插件的机制而无法解决。
  2. 官方版本或许也有问题,但是在解决的时候你更容易从 Issue 或 Google 找到答案,理清故障原因,你才能获得更高的稳定性。

本文中除了手摸手安装,同时解决一下两个要点:

  1. 解决 LXC 容器中 OpenWrt 无法联网
  2. 解决 Tun 模式开启

或许你根据我的方法也会遇到一些问题,我建议你用英文在 Google 来获取答案,因为 PVE 的 LXC 在中文社区的资料偏少或过时。

版本信息

  • CPU: i7 9700k (x86_64)
  • PVE: 8.2.2
  • OpenWrt: 23.05.4 X86_64

网络架构图

1. 安装 OpenWrt

这里我选择使用 LXC 容器 (即: CT 模板)的方式来安装,因为他有更好的性能,不像虚拟机一样强制扣取的宿主的硬件性能

1.1. 获取 OpenWrt 官方镜像

请自行选择处理器平台架构(我是 x86/64 )找到 rootfs.tar.gz 镜像压缩包

官方发布路径:archive.openwrt.org/releases/23...

  1. 复制你的包链接
  1. 进入 PVE 宿主节点 ![[Snipaste_2024-11-20_01-13-13.png]]

  2. 下载镜像压缩包到临时存放目录

sh 复制代码
# 切换到 local CT模板 目录
cd /var/lib/vz/template/cache
# 下载镜像包,注意:https://xxx/xxx.gz 需要换成你的镜像包地址
wget https://archive.openwrt.org/releases/23.05.4/targets/x86/64/openwrt-23.05.4-x86-64-rootfs.tar.gz

1.2. 创建 OpenWrt LXC 容器

在 PVE 节点上创建 LXC 容器

Tips:这里只是方便看注释,要执行用下一段代码!!!

sh 复制代码
# (按需修改)102是你创建的容器编号
pct create 102 \
		# (按需修改)/openwrt-xx.xx.x-xxx-rootfs.tar.gz 你刚才下的包名
        local:vztmpl/openwrt-23.05.4-x86-64-rootfs.tar.gz \
        # :1 是虚拟磁盘大小,这里是1G
        --rootfs local-lvm:1 \
        # 表明容器没有特定的操作系统模板管理,可能是手动配置的操作系统。
        --ostype unmanaged \
        # 容器名称
        --hostname OpenWrt \
        # (按需修改)系统架构,amd64 | arm64 | armhf | i386 | riscv32 | riscv64
        --arch amd64 \
        # (按需修改)分配给容器的核心数量。默认情况下,容器可以使用所有可用的核心。
        --cores 8 \  
        # (按需修改)容器内RAM的量(MB)。
        --memory 1024 \ 
        # 容器SWAP大小,单位为MB。除非你内存特别特别小不容没必要
        --swap 0 \
        # vmbr0 是你的虚拟网桥,eth0 是你的物理网口
        -net0 bridge=vmbr0,name=eth0

这里是给你删除好注释可自行的~

sh 复制代码
pct create 102 local:vztmpl/openwrt-23.05.4-x86-64-rootfs.tar.gz --rootfs local-lvm:1 --ostype unmanaged --hostname OpenWrt --arch amd64 --cores 8 --memory 1024 --swap 0 --net0 bridge=vmbr0,name=eth0

1.3. 配置容器 Tun 模式 (重要)

一定要配置 Tun 模式所需的容器权限,开启权限后才能联网和开启 Tun模式,因为 LXC 容器 OpenWrt 内置的 dnsmasq 插件的一些权限原因,导致你无法解析 DNS,OpenWrt 容器将无法联网

OpenWrt 容器控台中输入 vim /etc/pve/lxc/102.conf102 为容器编号(按需修改),追加下面的配置,并保存

conf 复制代码
lxc.apparmor.profile: unconfined
lxc.cgroup.devices.allow: a
lxc.cap.drop:
lxc.cgroup2.devices.allow: c 10:200 rwm
lxc.mount.entry: /dev/net/tun dev/net/tun none bind,create=file

配置释义:

  • 关闭 AppArmor 配置文件,允许容器无限制访问系统资源
    lxc.apparmor.profile: unconfined
  • 容器允许访问所有设备
    lxc.cgroup.devices.allow: a
  • 空值,表示没有从容器中移除任何特权能力
    lxc.cap.drop:
  • 容器允许访问字符设备 10:200(通常与 /dev/net/tun 相关),权限为读(r)、写(w)、创建(m)
    lxc.cgroup2.devices.allow: c 10:200 rwm
  • 将宿主机的 /dev/net/tun 映射到容器内的相同路径,允许使用 TUN 接口(通常用于 VPN)
    lxc.mount.entry: /dev/net/tun dev/net/tun none bind,create=file

1.3. 启动 OpenWrt 容器

  1. 左侧数据中心 -> pve -> 选择刚创建的容器 ID
  2. 点击控制台
  3. 点击启动
  4. 回车即可进入容器终端

1.4. 配置 IP 和 DNS

容器控制台中输入 vim /etc/config/network 修改:

  1. 设置静态 IP 地址,注意你的主路由网段同网段,我这里网段是 192.168.50.x
  2. 设置网关,网关地址为你主路由的 IP 地址
  3. 设置 DNS,DNS也是你主路由的IP地址
vbnet 复制代码
config interface 'lan'
        option device 'br-lan'
        option proto 'static'
        
        # 1. 设置静态 IP 地址
        option ipaddr '192.168.50.102'
         
        option netmask '255.255.255.0'
        option ip6assign '60'

		# 2. 设置网关
        option gateway '192.168.50.1' 
        # 3. 设置 DNS
        list dns '192.168.50.1'

1.5 设置访问密码

容器控制台输入执行 passwd,然后输入两次密码即可

1.5. 重启生效

容器控制台输入执行 reboot

1.6. 进入 OpenWrt 检查网络连通性

  • 访问 http://192.168.50.102 即可进入 OpenWrt Web 界面, 注意根据你设置的 IP 地址来访问
  • 进入 Network -> Diagnostics点击 IPv4 Ping,测试网络连通性。如果网络不通,请回到 1.2 和 1.3 步骤中检查的参数。若仍然无法连通,请在 OpenWrt UI界面中查看日志来排查问题,欢迎评论区交流 ~

参考资料

OpenWrt 官方文档

Proxmox VE 8.1.3 Unable to use TUN (/dev/net/tun) in Debian 12.2-1 container

相关推荐
IpdataCloud8 小时前
IPv6商用数据的IP离线库能解决哪些业务问题?适用场景与接入指南
网络·网络协议·tcp/ip
小义_9 小时前
【Kubernetes】(九)Service 2
云原生·容器·kubernetes
Cyber4K11 小时前
【Kubernetes专项】温故而知新,重温技术原理(2)
云原生·容器·kubernetes
思麟呀14 小时前
Select多路转接
linux·网络·c++·网络协议·http
雨奔14 小时前
Kubernetes 网络策略(NetworkPolicy)完全指南:声明式 Pod 通信管控
网络·容器·kubernetes
身如柳絮随风扬14 小时前
Kubernetes v1.20.9 集群搭建
云原生·容器·kubernetes
wl851115 小时前
SAP CPI 教程003 如何抓取Http适配器异常信息
网络·网络协议·http
蛐蛐蛐15 小时前
在Windows 11上安装Docker的踩坑记录
运维·docker·容器
古典和浪漫16 小时前
docker file 中设置软链接和在k8s 中配置同步时区 有什么区别,各自优缺点
docker·容器·kubernetes
lularible16 小时前
PTP协议精讲(3.7):传输层实现——PTP报文的“高速公路“
网络·网络协议·开源·嵌入式·ptp