如何将Proxmox中运行OpenVPN的LXC的tun0设备共享给其他LXC使用?
嘿,我来给你捋捋这个问题~你之前的思路其实没毛病,但忽略了一个关键点:tun0是OpenVPN在你的VPN-LXC内部创建的虚拟设备,每个LXC都有自己独立的网络命名空间,所以其他LXC默认根本看不到这个设备,直接传设备文件的方法只对宿主机上的物理/宿主机级虚拟设备管用,对LXC内部的虚拟设备无效。
我给你两种实用的解决方案,你可以根据自己的需求选:
方案1:共享网络命名空间(最直接,一步到位)
这个方法相当于让目标LXC(比如你的qbittorrent容器)直接“借用”VPN-LXC的整个网络栈,这样它就能直接看到tun0,连路由都不用配。
步骤如下:
- 先把目标LXC(比如qbittorrent)停掉,别在运行状态改配置
- 编辑目标LXC的配置文件,路径是
/etc/pve/lxc/[目标LXC的ID].conf(比如你的qbittorrent容器ID是102,就编辑102.conf) - 先把原来的网络配置(比如
lxc.net.0.*相关的行)改一改:- 如果原来有
lxc.net.0.ipv4.address,直接删掉或者改成0.0.0.0/0 - 添加一行
lxc.net.0.type: none,告诉Proxmox不要给这个容器单独分配网络接口 - 关键来了:添加一行
lxc.namespace.share: net:[VPN-LXC的ID],比如你的VPN-LXC ID是101,就写lxc.namespace.share: net:101
- 如果原来有
- 启动目标LXC,进去敲
ip a,你会发现tun0直接出现在列表里了!
⚠️ 注意:这个方案的缺点是两个容器共享同一个网络栈,比如端口占用会冲突,而且目标LXC的所有网络流量默认都会走VPN,适合你这种“所有流量都要走VPN”的场景(比如qbittorrent)。另外,如果VPN-LXC重启,目标LXC最好也跟着重启一下,避免网络命名空间失效。
方案2:用VETH+路由转发(更灵活,隔离性更好)
如果你不想让两个容器完全共享网络栈,或者需要更细粒度的控制(比如只有部分流量走VPN),可以用这个方法:给VPN-LXC加一个虚拟网卡,和目标LXC连通,然后在VPN-LXC里做路由和NAT,让目标LXC的流量通过tun0出去。
步骤如下:
- 先停掉VPN-LXC和目标LXC
- 编辑VPN-LXC的配置文件,添加一段VETH接口的配置:
lxc.net.1.type: veth lxc.net.1.name: veth-vpn-bridge lxc.net.1.ipv4.address: 192.168.200.1/24 lxc.net.1.flags: up - 再编辑目标LXC的配置文件,添加对应的VETH配置:
(这里的lxc.net.0.type: veth lxc.net.0.name: veth-client lxc.net.0.ipv4.address: 192.168.200.2/24 lxc.net.0.ipv4.gateway: 192.168.200.1 lxc.net.0.flags: up192.168.200.0/24是我随便选的私有网段,你可以换成自己喜欢的) - 启动两个容器,先进入VPN-LXC,开启IP转发:
echo 1 > /proc/sys/net/ipv4/ip_forward # 如果你想开机自动开启,就把这行写到/etc/sysctl.conf里,然后执行sysctl -p - 接着在VPN-LXC里配置NAT规则,让目标LXC的流量通过tun0出去:
iptables -t nat -A POSTROUTING -o tun0 -s 192.168.200.0/24 -j MASQUERADE # 同样,要开机自动生效的话,把这条命令加到VPN-LXC的开机启动脚本里,或者用iptables-persistent保存规则 - 现在进入目标LXC,测试一下:比如ping一个外网地址,然后在VPN-LXC里用
tcpdump -i tun0抓包,就能看到流量走tun0了。如果想让目标LXC的特定服务(比如qbittorrent)单独走tun0,还可以在目标LXC里加路由规则。
关于你后来试的OPNsense方案
其实你换成OPNsense LXC的思路是对的——相当于把VPN网关单独做成一个专门的路由容器,然后其他所有需要走VPN的容器都把网关设为OPNsense的IP,这样OPNsense可以统一管理VPN连接、防火墙规则,甚至可以同时跑多个VPN线路,灵活性更高。如果你已经在折腾OPNsense了,完全可以把这条路走通:
- 给OPNsense LXC配置两个接口:一个连宿主机的主网桥(用来连外网和OpenVPN),另一个连一个新的专用网桥(比如vmbr1)
- 把需要走VPN的LXC(比如qbittorrent)的网络接口设为vmbr1,网关设为OPNsense在vmbr1上的IP
- 在OPNsense里配置OpenVPN客户端,然后设置路由规则,让vmbr1过来的流量都走OpenVPN的tun接口就行
这种方案虽然步骤多一点,但扩展性极强,适合管理多个需要VPN的服务。
备注:内容来源于stack exchange,提问作者Daviid

