LXC 容器配置 TUN 功能

一、前置知识

1.1 什么是 TUN 设备?

TUN(Network TUNnel)是 Linux 内核提供的虚拟网络设备,工作在第三层(网络层),用于用户空间程序与内核网络栈之间的数据交换。常见的使用场景包括:

  • VPN 软件:OpenVPN、WireGuard
  • 虚拟组网工具:ZeroTier、Tailscale 、EasyTier
  • 网络代理:gluetun、Clash TUN 模式
  • 软路由功能:OpenWRT 中的流量转发、去广告等

1.2 为什么 LXC 容器默认没有 TUN?

LXC 容器默认出于安全考虑,不会将宿主机的 /dev/net/tun 设备映射到容器内部。需要手动配置才能启用。

1.3 关于设备共享

/dev/net/tun 是一个克隆设备(Cloner Device),当容器内的程序请求访问时,内核会为该请求动态创建一个独立的虚拟接口。因此,一个 /dev/net/tun 可以被多个容器同时使用,不会相互冲突。


二、2026 年新版配置方法(推荐)

适用于 PVE 8.2+ 及 9.x 版本,以无特权容器为主。

方法一:通过 PVE 网页界面添加(强烈推荐)

这是最简单、最直观的方式,适合新手用户。

操作步骤:

  1. 登录 Proxmox Web UI
  2. 在左侧选中你的 LXC 容器(例如 ID 为 101)
  3. 切换到右侧的 资源(Resources) 标签页
  4. 点击 添加(Add) → 选择 设备直通(Device Passthrough)
  5. 设备路径(Device Path) 中输入:/dev/net/tun
  6. 点击 添加 保存
  7. 重启容器(Stop → Start)

验证:

# 进入容器执行
ls -l /dev/net/tun
# 应该能看到设备存在,权限通常为 crw-rw-rw-

方法二:手动编辑配置文件

适用于所有版本,或界面添加失败的情况。

操作步骤:

# 1. 在 PVE 主机 Shell 中停止容器
pct stop 101  # 把 101 换成你的容器 ID

# 2. 编辑配置文件
nano /etc/pve/lxc/101.conf

# 3. 在文件最底部添加以下两行

配置内容:

lxc.cgroup2.devices.allow: c 10:200 rwm
lxc.mount.entry: /dev/net/tun dev/net/tun none bind,create=file 0 0

说明:部分资料使用 /dev/net dev/net none bind,create=dir 绑定整个目录,两者均可,但推荐上面这种精确绑定 tun 文件的方式。

# 4. 保存后重启容器
pct start 101

# 5. 进入容器验证
pct enter 101
ls -l /dev/net/tun

三、归档旧方法(历史参考)

3.1 无特权容器(旧版配置)

在宿主机(PVE)中修改 /etc/pve/lxc/<容器id>.conf 文件:

nano /etc/pve/lxc/<容器id>.conf

在末尾添加:

lxc.hook.autodev = sh -c "modprobe tun"
lxc.mount.entry=/dev/net/tun /var/lib/lxc/<容器id>/rootfs/dev/net/tun none bind,create=file

3.2 特权容器(旧版配置)

根据 PVE 版本不同,配置有所差异:

PVE 7+ 版本:

lxc.cgroup2.devices.allow: c 10:200 rwm
lxc.hook.autodev = sh -c "modprobe tun; cd ${LXC_ROOTFS_MOUNT}/dev; mkdir net; mknod net/tun c 10 200; chmod 0666 net/tun"

PVE 6.x 版本:

lxc.cgroup.devices.allow: c 10:200 rwm
lxc.hook.autodev = sh -c "modprobe tun; cd ${LXC_ROOTFS_MOUNT}/dev; mkdir net; mknod net/tun c 10 200; chmod 0666 net/tun"

四、功能验证

4.1 检查设备是否存在

在容器内执行(citation:15):

ls -lh /dev/net

正常输出:

total 0
crw-rw-rw- 1 nobody nogroup 10, 200 Jan 17 20:32 tun

若无内容输出则表示 TUN 未成功启用。

4.2 验证软件可用性

配置成功后,以下软件即可正常使用 TUN 设备:

软件 用途
OpenVPN VPN 连接
WireGuard 现代 VPN
ZeroTier 虚拟组网
Tailscale 虚拟组网
EasyTier 虚拟组网
gluetun VPN 容器代理

五、特权容器与无特权容器的区分

5.1 通过 PVE 管理界面

在对应容器的 概要(Summary) 界面中,查看 无特权 后面的值:

  • = 无特权容器
  • = 特权容器

5.2 通过配置文件

查看 /etc/pve/lxc/<容器id>.conf 文件:

  • 存在 unprivileged: 1无特权容器
  • 不存在或值为 0特权容器

六、扩展场景:在 LXC 容器中部署 VPN/组网服务

6.1 部署 Tailscale(推荐)

Tailscale 基于 WireGuard 协议,支持 P2P 直连,适合异地组网。

LXC 容器配置要求:

配置项 设置
Features 勾选 Nesting、keyctl
内存 建议 256MB 以上
TUN 设备 按本文方法配置
# 容器内安装 Tailscale
curl -fsSL https://tailscale.com/install.sh | sh

# 启动并加入网络
tailscale up --advertise-routes=192.168.X.0/24 --accept-routes

踩坑提醒:如果 LXC 没勾选 keyctl,Tailscale 启动会卡住超时。

6.2 部署 ZeroTier

ZeroTier 需要通过绑定 /dev/net/tun 的 TUN 接口来进行组网。

# 容器内安装 ZeroTier
curl -s https://install.zerotier.com | bash

# 加入网络
zerotier-cli join <network-id>

6.3 部署 OpenWRT(软路由)

在 LXC 容器中运行 OpenWRT 需要特别注意 TUN 模式配置,否则 dnsmasq 无法正常解析 DNS。

推荐配置(追加到容器配置文件):

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

七、常见问题排查

Q1:添加 TUN 设备后容器无法启动

可能原因

  • 使用了错误的配置命令(如无特权容器使用了特权容器的指令)
  • 配置文件格式错误(注意空格和冒号)

解决方案

  • 检查容器类型,使用对应正确的配置
  • 撤销配置修改,逐步排查

Q2:设备存在但软件无法使用

检查清单

  1. ls -l /dev/net/tun 确认设备存在且权限正确
  2. 确认软件已正确安装
  3. 检查容器的网络配置是否正常
  4. 查看软件日志获取具体错误信息

Q3:Docker 容器中需要 TUN 怎么办?

在 LXC 容器中运行 Docker 并让 Docker 容器使用 TUN,需要:

  1. LXC 容器开启 nesting=1 功能
  2. 确保 TUN 设备已正确映射
  3. Docker 容器需要添加 --device /dev/net/tun 参数或使用 --cap-add=NET_ADMIN

八、配置速查表

场景 PVE 版本 推荐方法 配置内容
无特权容器 8.2+ / 9.x 网页界面添加 设备路径:/dev/net/tun
无特权容器 所有版本 手动编辑配置 lxc.cgroup2.devices.allow + lxc.mount.entry
特权容器 7+ 手动编辑配置 添加 cgroup2hook.autodev
特权容器 6.x 手动编辑配置 使用 cgroup(非 cgroup2)

九、注意事项汇总

  1. 修改配置后必须重启容器,热加载不生效
  2. /dev/net/tun 可被多个容器共享,是克隆设备
  3. 新版 PVE 无特权容器无需额外处理权限
  4. 宿主机需确保 tun 内核模块已加载
  5. 建议优先使用无特权容器,安全性更高
© 版权声明

相关文章

没有相关内容!

暂无评论

none
暂无评论...