Netplan - 请求帮助以正确管理 macvlan 设置中的路由

Netplan - 请求帮助以正确管理 macvlan 设置中的路由

我使用带 macvlan 的 docker,其中每个容器都有自己的 L2 连接,包括 MAC 地址和 IP。我还需要保证容器可以到达主机,反之亦然。目前,我可以使用 netplan 和脚本删除一些路由来实现这一点,但希望您能帮助我了解是否可以使用 netplan 来实现。

我的配置是这样的:

创建 macvlan 接口的批处理脚本(netplan 尚不支持)

#! /bin/bash
#! ip link add macvlan link vlan10 type macvlan mode bridge

使用 netplan 配置创建 vlan10 接口

01-netcfg.yaml

network:
  version: 2
  renderer: networkd
  ethernets:
    eno1:
      dhcp4: yes
      dhcp6: yes
      addresses:
        - aaaa:bbbb:cccc:1::11/64

  vlans:
    vlan10:
      id: 10
      link: eno1
      dhcp4: no
      dhcp6: no
      addresses:
        - 192.168.10.11/24
        - aaaa:bbbb:cccc:10::11/64

这确保了为 docker 创建的 VLAN 接口已创建且可用。

20-docker.yaml

network:
    version: 2
    renderer: networkd
    ethernets:
        macvlan:
            dhcp4: no
            dhcp6: no
            addresses:
                - 192.168.10.5/24
                - aaaa:bbbb:cccc:10::5/64

我承认这也许不是设置我所需解决方案的最有效方法,但它有效,并且通过这种方式我避免使用 cron 创建在重启时运行的脚本。

路线部分

现在我已经创建了接口,当它们启动时,会自动创建一组路由,即使我没有定义网关4网关6指令并定义 netplat 以忽略 DHCP 默认路由。但尽管如此,这些针对 IPv4 和 IPv6 的路由仍会自动创建,从而避免由于 docker 网络驱动程序设计限制而到达 vlan10 网络中的容器。

新接口的 IPv4 路由

192.168.10.0/24 dev vlan10 proto kernel scope link src 192.168.10.11
192.168.10.0/24 dev macvlan proto kernel scope link src 192.168.10.5
192.168.10.0/24 via 192.168.10.5 dev macvlan proto static metric 100
192.168.10.0/24 via 192.168.10.11 dev vlan10 proto static metric 150

新接口的 IPv6 路由

aaaa:bbbb:cccc:10::/64 dev vlan10 proto kernel metric 256 pref medium
aaaa:bbbb:cccc:10::/64 dev macvlan proto kernel metric 256 pref medium

为了使我的解决方案有效,我需要手动删除(或使用启动 bash 脚本)以删除 IPv4 和 IPv6 中设备 vlan10 的上述内核路由。通过执行该任务,我可以恢复主机与容器之间的通信。

有没有办法改进这个解决方案并避免创建这些路由,或者有一个命令来忽略我在特定接口上不需要的特定路由,以保证在 netplan 中使用我的解决方案?

非常感谢您的专业知识和参与。谢谢

** 2021 年 10 月 20 日 - 评论和进一步测试后进行编辑**

经过更多的审查、测试和学习后,我进行了以下更改,这些更改解决了我的问题并允许我的主机接触macvlan界面内的容器。

01-netcfg.yaml

network:
  version: 2
  renderer: networkd
  ethernets:
    eno1:
      dhcp4: yes
      dhcp6: yes
      addresses:
        - aaaa:bbbb:cccc:dddd:192:168:1:11/64

  vlans:
    vlan10:
      id: 10
      link: eno1
      dhcp4: no
      dhcp6: no
      addresses:
        - 192.168.10.11/32
        - aaaa:bbbb:cccc:10::11/128
      link-local: []

将 IPv4 和 IPv8 子网掩码分别更改为 /32 和 /128。这已创建正确的规则并使我的主机恢复与我的 docker 容器网络的通信。还包括“link-local: []”以避免此接口创建可能干扰的链接本地 IP。

20-docker.yaml

network:
  version: 2
  renderer: networkd
  ethernets:
    macvlan:
      dhcp4: no
      dhcp6: no
      addresses:
        - 192.168.10.5/24
        - aaaa:bbbb:cccc:10::5/64

通过这种配置,我可以恢复主机和​​容器之间的通信,针对 IPv4 和 IPv6,并避免使用外部脚本删除路由或在 netplan 中声明特定的指令routes:routing-policies:

希望这能帮助遇到类似问题的人。谢谢

答案1

这些路由是自动创建的,因为您已在 netplan yaml 中声明了以下内容:

  addresses:
    - 192.168.10.11/24
    - aaaa:bbbb:cccc:10::11/64

如果您不希望接口上有到这些网络的路由vlan10,您可以简单地不声明它们。

相关内容