QNAP LXD容器使用VLAN

最近入手了QNAP的NAS,主要是想体验下这种商业公司开发的NAS,好为后续DIY自己的超强NAS铺路。本以为这种专业公司,人多力量大,考虑的东西肯定比我一个人多,但现在看起来,在某些方面,并不是如此。这不就遇到了一个容器使用VLAN的问题,作为一种另辟蹊径的解决方法,记录下。

环境配置及问题复现

组网环境

网络拓扑图

如图,NAS上还运行了一个OpenWRT虚拟机,与其他地域的服务器组网(仅用来安全快捷地传输文件,服务器存储价格太高了);同时我希望将这张网络共享出去,供LAN侧的设备使用;但NAS下游也接了普通设备,我不希望普通设备接入服务器网络,因此划分了VLAN,专门承载服务器通信数据。

方案看起来很完美,但实践有问题!

问题描述

我把网络架设好,最后一步就是把容器挂在网桥下了。但是,Adapter 2显示为灰色!

看下方说明:

赫然写着“不支持启用了VLAN的适配器”

我顿时满头问号❓❓❓,怎么可能不支持启用了VLAN呢?因为:

  • 早在几年前,内核自带的ipoute2就支持VLAN aware bridge了,通过bridge vlan命令就可以像配置VLAN交换机一样配置桥接网卡的VLAN配置,我也在Archlinux上用这个功能部署过好几次容器了
  • 就算用的老版本的iproute2,只要有macvlan,也可直接alias网卡,配合brctl来完成桥接
  • 最关键问题是,为什么虚拟机可以用VLAN,容器不能用VLAN?

求真

进入NAS后台,查询iproute2版本,发现:

$ ip -V
ip utility, iproute2-ss150831

而对比我的笔记本,Archlinux的是:

$ ip -V
ip utility, iproute2-6.4.0, libbpf 1.2.0

好好好,也许是QNAP自己编译的内核,连版本都查不到

试一下敲bridge命令,直接提示找不到命令,看来是不支持VLAN aware bridge了

只好看看brctl状态:

$ brctl show
bridge name     bridge id               STP enabled     interfaces
docker0         8000.000000000000       no
lxcbr0          8000.000000000000       no
lxdbr0          8000.000000000000       no
qvs0            8000.xxxxxxxxxxxx      yes             eth1
                                                        vnet0(OpenWRT的网卡1)
qvs1            8000.xxxxxxxxxxxx       yes             eth1.17
                                                        vnet1(OpenWRT的网卡2)

可以看到qvs就是个普通网桥。所以如果直接将容器的接口添加到网桥,是完全不同的,因为旧版brctl就是不支持与vlan接口共同桥接。

接下来我到各个论坛翻帖子,找相似的现象,发现这个问题老早就有人提出了,给出的解决方案也不同,有的声称可以解决,有的却又不可以。我也试了下macvlan的方案,发现也不行,推测是因为QNAP创建的接口都不处于混杂模式(PROMISC)。

甚至有人贴出了这样的过程,向客服反馈后,客服说容器不支持VLAN,然后这句话就出现在了那个配置界面。总之这个问题几年前就出现了,我浏览的帖子中,最早有2018年的。

既然论坛无果,macvlan方案不行,官方不支持,只好另辟蹊径:如果我掏出个OpenWRT来,不知阁下又会如何应对?

另辟蹊径的解决方法

虽然QNAP限制了我们,但是我们有虚拟机呀,再建一个网桥,作为OpenWRT与服务容器专属的通信管道,问题就解决了。

具体方法

首先打开“网络与虚拟交换机”应用,创建一个新的虚拟交换机,可以先不勾选任何接口,然后在设置中选择“不分配IP地址”

一路确认,建好网桥

然后给虚拟机添加个网卡,然后在OpenWRT也新建个网桥设备,将两个端口添加进去

然后要设置容器的profile,使之使用我们新建的网桥:

先确认一下nas内,新建的网桥名称是否为qvs2

$ lxc profile list
+----------+---------------------+---------+
|   NAME   |     DESCRIPTION     | USED BY |
+----------+---------------------+---------+
| default  | Default LXD profile | 2       |
+----------+---------------------+---------+

新建个配置(或者你想直接修改当前配置也可,自由发挥)

$ lxc profile device add vlan17

编辑这个profile:

$ lxc profile edit vlan17

内容如下:

config: {}
description: ""
devices:
  eth1:
    nictype: bridged
    parent: qvs2
    type: nic
name: vlan17

退出编辑器。如果提示有奇怪的错误(如ETag不匹配等),需要先停止container-station服务:

$ /etc/init.d/container-station.sh stop

修改完成后再启动

$ /etc/init.d/container-station.sh start

最后,可以使用这两个profile新建个容器:

$ lxc launch ubuntu:jammy testservice --profile default --profile vlan17

然后容器的eth1就和OpenWRT的网桥连接到一起了。如果想覆盖默认eth0的配置,上面编辑时,devices内填eth0即可。

亲测后续在Container Station内修改配置时,也不会影响这个新profile。

最后别忘了在容器内配置这个网卡的DHCP客户端/静态地址等。

成果展示:

后续

后续还需要测试一下,在重启系统更新后,这个profile会不会丢。如果不会丢那就是完美的解决方案。

最后还是希望QNAP的工程师们响应一下诉求吧,VLAN aware bridge都出来几年了,为啥还不跟进呢?

难道或许是因为这只是家用的产品?或者定位就只是拿来存文件的?这就不清楚了

更新2023/07/26

1、经过测试,发现,profile并不会随着系统重启、系统更新丢弃,原先配好的容器配置可以一直保留。

2、近期QNAP发布了更新,Container Station终于支持直接配置VLAN了,UI也有很大改进(虽然终端会出现格式错误)

发表评论