手摸手 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

相关推荐
是理不是里_4 小时前
常见的网络协议汇总(涵盖了不同的网络层次)
网络·网络协议
小柒xq7 小时前
使用docker compose安装部署gitlab
docker·容器·gitlab
史努比.7 小时前
k8s 对外服务之 Ingress
容器
长囧鹿7 小时前
k8s资源对象管理
云原生·容器·kubernetes
Peter_chq8 小时前
【计算机网络】HTTP协议
linux·c语言·开发语言·网络·c++·后端·网络协议
Zoran_卓9 小时前
在k8s上部署minio
云原生·容器·kubernetes
追梦不止~9 小时前
K8S基础概念和环境搭建
云原生·容器·kubernetes
琢瑜9 小时前
TCP 三次握手和四次挥手
网络·网络协议·tcp/ip·linux网络编程
吃苹果的牛顿顿10 小时前
Docker本地搭建WordPress
运维·docker·容器
可涵不会debug14 小时前
【Linux|计算机网络】HTTPS工作原理与安全机制详解
linux·网络协议·http·网络安全·https