在使用 Proxmox VE (PVE) 的 LXC 容器时,您可能会发现某些应用无法正常工作,例如 OpenVPN、WireGuard、ZeroTier 或其他需要创建虚拟网络接口的程序。这通常是因为容器默认没有访问 tun
设备的权限。
tun
设备是内核中的一个虚拟网络设备,它允许用户空间的程序处理网络数据包,是实现各类 VPN 和虚拟网络技术的基础。
幸运的是,在 PVE 中为 LXC 容器开启 tun
支持非常简单。本文将为您介绍两种行之有效的方法。
方法一:通过 PVE 网页界面添加设备直通 (推荐)
对于 PVE 8.2 及更新的版本,最直接、最不容易出错的方法就是通过 Web UI 进行操作。这种方法直观且快捷。
- 定位容器: 在 PVE 管理界面的左侧边栏中,选中您需要配置的 LXC 容器。
- 进入“资源” : 在右侧的容器管理面板中,点击 资源 (Resources) 选项卡。
- 添加设备: 点击 添加 (Add) 按钮,在弹出的菜单中选择 设备直通 (Device Passthrough) 。
- 配置路径: 系统会弹出一个配置窗口。在 设备路径 (Device Path) 输入框中,填入以下路径: text
/dev/net/tun
确认添加: 点击 添加 (Add) 按钮保存配置。 重启容器: 为了让配置生效,您需要重启该 LXC 容器。

方法二:手动修改 LXC 配置文件 (已弃用)
如果您使用的 PVE 版本较旧,或者更喜欢通过命令行进行精确控制,那么手动修改配置文件是您的不二之选。此方法适用于所有 PVE 版本。
- 登录 PVE 主机 Shell: 通过 SSH 或 PVE Web UI 的 “Shell” 功能登录到您的 PVE 主节点。
- 编辑配置文件: 使用您喜欢的编辑器(如
nano
或vim
)打开容器的配置文件。文件路径通常为/etc/pve/lxc/[ID].conf
,其中[ID]
是您的容器 ID。 bash
# 请将 101 替换为您的容器 ID
nano /etc/pve/lxc/101.conf
添加配置: 在配置文件的末尾,添加以下两行代码:
lxc.cgroup2.devices.allow = c 10:200 rwm
lxc.mount.entry = /dev/net/tun dev/net/tun none bind,create=file 0 0
- 第一行 (
lxc.cgroup2.devices.allow
):此行授权容器的 cgroup 访问主/次设备号为10:200
的字符设备 (c
),并赋予其读 (r
)、写 (w
) 和创建节点 (m
) 的权限。 - 第二行 (
lxc.mount.entry
):此行将宿主机的/dev/net/tun
设备通过绑定挂载的方式映射到容器内部的相同路径,create=file
确保了即使目标路径不存在,系统也会自动创建它。
保存并重启: 保存文件后,通过命令行重启容器以应用更改。
# 请将 101 替换为您的容器 ID
pct stop 101
pct start 101
最终验证
无论您使用哪种方法,最后一步都是验证 tun
设备是否已在容器内成功启用。
- 进入容器 Shell: bash
# 请将 101 替换为您的容器 ID
pct enter 101
检查设备: 在容器内部执行以下命令,检查设备文件是否存在。
ls -l /dev/net/tun
如果您看到类似下面的输出,那么恭喜您,tun
设备已经成功启用!
crw-rw-rw- 1 root root 10, 200 Aug 31 23:36 /dev/net/tun
常见问题解答
问:/dev/net/tun
设备可以直通给多个容器使用吗?
答: 可以。
/dev/net/tun
并非独占设备,它是一个“克隆设备” (Cloner Device)。当容器内的程序请求访问它时,内核会为该请求动态创建一个独立的、隔离的虚拟 tun
接口(如 tun0
, tun1
)。因此,多个容器可以安全地共享同一个 /dev/net/tun
接口,而不会相互干扰。