新版本PVE为LXC容器开启TUN支持的方法

在使用 Proxmox VE (PVE) 的 LXC 容器时,您可能会发现某些应用无法正常工作,例如 OpenVPN、WireGuard、ZeroTier 或其他需要创建虚拟网络接口的程序。这通常是因为容器默认没有访问 tun 设备的权限。

tun 设备是内核中的一个虚拟网络设备,它允许用户空间的程序处理网络数据包,是实现各类 VPN 和虚拟网络技术的基础。

幸运的是,在 PVE 中为 LXC 容器开启 tun 支持非常简单。本文将为您介绍两种行之有效的方法。

方法一:通过 PVE 网页界面添加设备直通 (推荐)

对于 PVE 8.2 及更新的版本,最直接、最不容易出错的方法就是通过 Web UI 进行操作。这种方法直观且快捷。

  1. 定位容器: 在 PVE 管理界面的左侧边栏中,选中您需要配置的 LXC 容器。
  2. 进入“资源” : 在右侧的容器管理面板中,点击 资源 (Resources) 选项卡。
  3. 添加设备: 点击 添加 (Add) 按钮,在弹出的菜单中选择 设备直通 (Device Passthrough)
  4. 配置路径: 系统会弹出一个配置窗口。在 设备路径 (Device Path) 输入框中,填入以下路径: text
/dev/net/tun

确认添加: 点击 添加 (Add) 按钮保存配置。 重启容器: 为了让配置生效,您需要重启该 LXC 容器。

方法二:手动修改 LXC 配置文件 (已弃用)

如果您使用的 PVE 版本较旧,或者更喜欢通过命令行进行精确控制,那么手动修改配置文件是您的不二之选。此方法适用于所有 PVE 版本。

  1. 登录 PVE 主机 Shell: 通过 SSH 或 PVE Web UI 的 “Shell” 功能登录到您的 PVE 主节点。
  2. 编辑配置文件: 使用您喜欢的编辑器(如 nanovim)打开容器的配置文件。文件路径通常为 /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 设备是否已在容器内成功启用。

  1. 进入容器 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 接口,而不会相互干扰。