一、前置知识
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 网页界面添加(强烈推荐)
这是最简单、最直观的方式,适合新手用户。
操作步骤:
- 登录 Proxmox Web UI
- 在左侧选中你的 LXC 容器(例如 ID 为 101)
- 切换到右侧的 资源(Resources) 标签页
- 点击 添加(Add) → 选择 设备直通(Device Passthrough)
- 在 设备路径(Device Path) 中输入:
/dev/net/tun - 点击 添加 保存
- 重启容器(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:设备存在但软件无法使用
检查清单:
ls -l /dev/net/tun确认设备存在且权限正确- 确认软件已正确安装
- 检查容器的网络配置是否正常
- 查看软件日志获取具体错误信息
Q3:Docker 容器中需要 TUN 怎么办?
在 LXC 容器中运行 Docker 并让 Docker 容器使用 TUN,需要:
- LXC 容器开启
nesting=1功能 - 确保 TUN 设备已正确映射
- 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+ | 手动编辑配置 | 添加 cgroup2 和 hook.autodev |
| 特权容器 | 6.x | 手动编辑配置 | 使用 cgroup(非 cgroup2) |
九、注意事项汇总
- 修改配置后必须重启容器,热加载不生效
/dev/net/tun可被多个容器共享,是克隆设备- 新版 PVE 无特权容器无需额外处理权限
- 宿主机需确保 tun 内核模块已加载
- 建议优先使用无特权容器,安全性更高