双 NIC 客户端和 netplan 交换以太网接口的问题

双 NIC 客户端和 netplan 交换以太网接口的问题

背景:1500 多个站点运行 Ubuntu Server + ubuntu-desktop-minimal,大多数仍在使用 20.04,新站点均部署了 22.04(带有ubuntu-desktop-minimal --no-install-recommends22.04 标志)。用户需要能够与网络设置 GUI 交互,因此我们使用NetworkManager(通过 进行设置netplan)来管理网络设置。

我们在使用 Ubuntu Server 22.04 时遇到了一个有趣的问题,在运行netplan以在客户端的 2 个 NIC 端口上设置静态 IP/DHCP 设置后,它们会在多次重启后“翻转”,其中开启的 MACeth0将显示为 的 MAC 地址eth1。物理交换电缆eth1将恢复与最初分配给 的静态 IP 的连接eth0。再次重启后,端口将翻转回来(如果在此过程中也交换了电缆,则需要再次更换电缆)。根据我们的经验,这种交换没有再次发生。

netplan在准备这些系统的过程中,我们使用了两个剧本:

  1. 00-installer-config.yaml- 这是在 PXE 安装过程中安装和应用的,将两个接口都设置为启用 DHCP
cat /etc/netplan/00-installer-config.yaml
# This is the network config written by 'subiquity'
network:
  ethernets:
    eth0:
      dhcp-identifier: mac
      dhcp4: true
    eth1:
      dhcp-identifier: mac
      dhcp4: true
  version: 2
  1. 01-network-manager-all.yaml- Playbook 在站点配置过程中运行,在映像生成后不久。我们最初认为问题“翻转”是在运行此 Playbook 后开始的;进一步的测试证明事实并非如此。
cat /etc/netplan/01-network-manager-all.yaml
#BEGIN ANSIBLE MANAGED BLOCK
network:
  version: 2
  renderer: NetworkManager
  ethernets:
    eth0:
      dhcp4: no
      addresses:
        - 172.31.252.51/24
      routes:
        - to: default
          via: 172.31.252.254
      nameservers:
        addresses: [172.16.103.251,172.16.103.252]
    eth1:
      dhcp4: no
#END ANSIBLE MANAGED BLOCK

这对我们来说是一个重大问题,因为每当添加/替换其中一个系统时,它基本上就像一个滴答作响的时钟,等待它从无响应的网络重启中恢复。

有谁见过或听说过这样的错误吗?我还有很多信息,想让置顶帖子保持合理,很乐意提供更多详细信息。

尝试的补救措施:

  • 在 PXE 安装过程中将内核版本更新至 6.0、6.1 和 6.4
  • 删除了所有 After Imaging 服务systemd-networkd以强制一切NetworkManager
  • 添加了match变量,namedriver匹配。netplan 成功应用,重启 5 次没有问题,端口在第 6 次重启时翻转。
  • macaddress越来越近了。在 Ansible 中匹配netplan,在成像后创建了 01。4 次重启后端口翻转,但奇怪的是,尽管ip addr显示翻转的 IP,但连接仍然保留。
- name: Copy network configuration in 01-network-manager-all.yaml   blockinfile:
    path: /etc/netplan/01-network-manager-all.yaml
    block: |
      network:
        version: 2
        renderer: NetworkManager
        ethernets:
          eth0:
            match:
              macaddress: {{ansible_eth0.macaddress}}
            dhcp4: no
            addresses:
              - {{ ansible_host }}/24
            routes:
              - to: default
                via: {{ ansible_host.split('.')[0:3] | join('.') }}.254
            nameservers:
              addresses: {{ default_dns }}
          eth1:
            match:
              macaddress: {{ansible_eth1.macaddress}}
            dhcp4: no

结果netplan

cat /etc/netplan/01-network-manager-all.yaml
#BEGIN ANSIBLE MANAGED BLOCK
network:
  version: 2
  renderer: NetworkManager
  ethernets:
    eth0:
      match:
        macaddress: c4:00:ad:87:be:20
      dhcp4: no
      addresses:
        - 172.31.252.51/24
      routes:
        - to: default
          via: 172.31.252.254
      nameservers:
        addresses: [172.16.103.251,172.16.103.252]
    eth1:
      match:
        macaddress: c4:00:ad:87:be:1f
      dhcp4: no
#END ANSIBLE MANAGED BLOCK

翻转端口(仍然允许 ssh 到 172.31.252.51,无需电缆移动):

2: eth0: <NO-CARRIER,BROADCAST,MULTICAST,UP> mtu 1500 qdisc fq_codel state DOWN group default qlen 1000
    link/ether c4:00:ad:87:be:1f brd ff:ff:ff:ff:ff:ff
    altname enp0s31f6
3: eth1: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc mq state UP group default qlen 1000
    link/ether c4:00:ad:87:be:20 brd ff:ff:ff:ff:ff:ff
    altname enp1s0
    inet 172.31.252.51/24 brd 172.31.252.255 scope global noprefixroute eth1
       valid_lft forever preferred_lft forever

相关内容