群晖 DSM 7.3 Container Manager 多网卡与 Macvlan 配置

整理群晖 DSM 7.3 和 7.2 中 Container Manager 使用 Macvlan 绑定多网卡的方法,包括独立物理网段 IP、多网络绑定、Compose 配置、Open vSwitch 开启方式和常见避坑点。

群晖 DSM 7.3 和 DSM 7.2 自带的 Container Manager,图形界面默认主要支持基础的 bridgehost 网络。如果 NAS 有多块网卡,例如 LAN1 接内网、LAN2 接独立软路由或另一个网段,而你希望某些容器固定走 LAN2,或者直接在 LAN2 网段拿到一个独立 IP,就需要借助 Docker 的 macvlan 网络。

常见需求可以分成两类:

  • 让容器绑定某块物理网卡,并获得该网段的独立 IP;
  • 让容器同时接入默认 bridge 网络和指定网卡的 macvlan 网络。

下面以第二块网卡 ovs_eth1、LAN2 网段 192.168.2.0/24 为例说明。实际使用时,请按自己的网段、网关和网卡名称修改命令。

先确认物理网卡名称

先在 DSM 中开启 SSH,然后登录群晖执行:

1
ifconfig

如果群晖已经开启 Open vSwitch,网卡名称通常会变成 ovs_eth0ovs_eth1 这类形式。安装过 Virtual Machine Manager 的机器,多数会自动启用 Open vSwitch。

如果没有开启 Open vSwitch,网卡名称通常是 eth0eth1

假设要让容器走第二块网卡,后面示例统一使用 ovs_eth1。如果你的机器没有启用 Open vSwitch,就把命令里的 ovs_eth1 改成实际看到的 eth1 或其他名称。

场景一:容器使用指定网卡的独立 IP

这是最常见的用法,适合 Pi-hole、AdGuard Home、下载器、网关类服务等场景。目标是让容器直接出现在 LAN2 网段里,拥有一个类似物理设备的 IP,而不是只藏在群晖默认 Docker 网段后面。

Container Manager 图形界面不能直接创建 macvlan 网络,需要先通过 SSH 创建一次:

1
2
3
4
5
6
sudo docker network create -d macvlan \
  --subnet=192.168.2.0/24 \
  --gateway=192.168.2.1 \
  --ip-range=192.168.2.200/29 \
  -o parent=ovs_eth1 \
  custom_lan2_net

参数含义如下:

  • -d macvlan:使用 macvlan 驱动;
  • --subnet=192.168.2.0/24:LAN2 所在的完整网段;
  • --gateway=192.168.2.1:LAN2 网段的网关,一般是路由器 IP;
  • --ip-range=192.168.2.200/29:限制 Docker 可分配的 IP 范围,避免和手机、电脑、电视等设备冲突;
  • -o parent=ovs_eth1:指定绑定哪块物理网卡;
  • custom_lan2_net:给这个 Docker 网络起的名字。

创建完成后,打开 DSM 的 Container Manager,进入左侧“网络”页面,就能看到 custom_lan2_net。后续可以在图形界面里把已有容器加入这个网络,也可以在新建容器时选择它,并给容器指定该网段内的固定 IP。

场景二:容器同时连接多个网络

有些容器需要同时出现在多个网络里。例如它既要能被群晖宿主机通过默认 bridge 网段访问,又要在 LAN2 中拥有独立物理网段 IP。此时可以让容器同时拥有两块虚拟网卡。

方法 A:在图形界面追加网络

先按普通方式创建容器,并选择一个主网络,例如默认的 bridge。容器创建完成后先不要启动;如果已经启动,先停止容器。

然后进入 Container Manager 的“网络”页面,选中刚创建的 custom_lan2_net,点击“管理”,在列表中勾选目标容器并保存。这样容器启动后,内部通常会同时出现 eth0eth1 两块虚拟网卡。

这个方法最适合偶尔配置一两个容器,操作简单,也不需要改 Compose 文件。

方法 B:用项目功能编写 Docker Compose

如果你习惯使用 Container Manager 的“项目”功能,也可以直接在 docker-compose.yml 中声明多个网络:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
version: '3.8'

services:
  my_node:
    image: nginx:latest
    container_name: multi_nic_container
    networks:
      default_bridge:
        ipv4_address: 172.20.0.10
      lan2_macvlan:
        ipv4_address: 192.168.2.205

networks:
  default_bridge:
    external: true
    name: bridge
  lan2_macvlan:
    external: true
    name: custom_lan2_net

这里的 custom_lan2_net 是前面通过 SSH 创建好的 macvlan 网络。bridge 则引用群晖自带的 Docker 默认网络。

需要注意的是,示例中的 172.20.0.10 只有在你的默认桥接网络确实使用这个网段时才适用。普通群晖 Docker 默认 bridge 更常见的是 172.17.0.0/16,实际地址应以 docker network inspect bridge 的结果为准。

Macvlan 的宿主机互通问题

macvlan 有一个很容易踩坑的限制:Linux 内核默认不允许宿主机通过同一个 macvlan 接口直接访问容器。

也就是说,如果容器只加入 custom_lan2_net,群晖 DSM 本身可能无法通过 LAN2 的物理网段 IP 访问这个容器,容器也无法通过这个接口直接访问宿主机。

常见解决方式有两种:

  • 让容器同时加入默认 bridge 网络,群晖通过 bridge 分配的 Docker 内网地址访问它;
  • 在群晖上额外创建一个宿主机侧的 macvlan 子接口,让宿主机也进入同一个 macvlan 通信域。

第二种方式更接近网络工程配置,维护成本也更高。大多数家庭或小型办公场景,用“bridge + macvlan 双网络”会更省心。

IP 冲突要提前规避

使用 macvlan 时,容器 IP 会直接出现在物理局域网里,所以一定要避免和 DHCP 自动分配的地址池冲突。

建议在主路由里把 Docker 专用地址段排除出去。例如你计划把 192.168.2.200/29 分给 Docker,就不要让路由器再把 192.168.2.200192.168.2.207 分配给手机、电脑或其他设备。

如果路由器不方便设置 DHCP 排除范围,至少也要给容器使用一段不太可能被自动分配的高位地址,并做好记录。

如何开启 Open vSwitch

在 DSM 7.x 中,Open vSwitch 可以通过图形界面开启,不需要手动改底层配置。最省心的方法是安装群晖官方的 Virtual Machine Manager,因为虚拟机网络桥接依赖 Open vSwitch,安装向导会自动提示启用。

操作步骤:

  1. 打开 DSM 的“套件中心”;
  2. 搜索并安装 Virtual Machine Manager
  3. 打开套件,按向导提示启用 Open vSwitch;
  4. 等待网络服务重启。

如果不想安装 VMM,也可以在控制面板里手动开启:

  1. 打开“控制面板”;
  2. 进入“网络”;
  3. 切到“网络界面”标签页;
  4. 点击“管理”,选择“Open vSwitch 设置”;
  5. 勾选“启用 Open vSwitch”,然后应用。

应用后,群晖网卡会重新初始化,浏览器连接通常会短暂断开几秒。不要在 NAS 正在传输大文件或执行重要写入任务时操作。

验证 Open vSwitch 是否生效

图形界面里,可以回到“控制面板 -> 网络 -> 网络界面”查看网卡状态,管理菜单里也会显示 Open vSwitch 相关设置。

命令行里,可以再次执行:

1
ifconfig

或者:

1
ip addr

如果看到 ovs_eth0ovs_eth1 这类接口,说明 Open vSwitch 已经生效。之后创建 macvlan 网络时,-o parent= 后面就要填写带 ovs_ 前缀的接口名,例如:

1
-o parent=ovs_eth1

如果仍然写成 eth1,Docker 容器可能无法通过预期的网卡联网。

配置前的检查清单

实际动手前,建议先确认这几件事:

  • 群晖一共有几块物理网卡,哪些网口已经插线;
  • 每个网口分别接入哪个交换机、路由器或 VLAN;
  • 目标网卡在 DSM 中显示为 ethX 还是 ovs_ethX
  • --subnet--gateway 是否属于目标网卡所在网段;
  • --ip-range 是否已经从 DHCP 地址池中排除;
  • 容器是否需要被群晖宿主机访问,如果需要,最好同时加入 bridge 网络。

只要网卡名称、网段和 IP 池没有写错,DSM 7.3 的 Container Manager 完全可以配合 macvlan 实现多网卡容器部署。图形界面负责日常管理,SSH 只需要用来创建底层网络,后续维护成本并不高。

记录并分享
使用 Hugo 构建
主题 StackJimmy 设计