如何在 netplan 中配置 vlan-linked 桥来为 VM 提供服务?

如何在 netplan 中配置 vlan-linked 桥来为 VM 提供服务?

我的问题基本上是,当尝试在 vlan 接口上使用网桥时,我的 VM 没有网络,而且我不确定我遗漏了什么。

我已经尝试了例子。以及许多其他指南。这是我当前的网络计划.yaml(尽管我尝试过为 vlan 或网桥定义 、 和 的各种组合,但没有成功addressesgateway4nameservers

network:
  version: 2
  renderer: networkd
  ethernets:
    eno1:
      dhcp4: true
    eno2:
      dhcp4: true
  bridges:
    br0:
      dhcp4: true
      interfaces: [ vlan15 ]
      parameters:
        forward-delay: 0
        stp: true
  vlans:
    vlan15:
      id: 15
      link: eno1

我希望保持eno2不变,这样我总有一个后备方案(不连接监视器)。在我的 DHCP 服务器中,我设置了 eno1 = 192.168.0.100,eno2 = 192.168.0.101。

我的路由器中的 LAN 设置为 192.180.0.0/22(我试图通过 192.168.1.x 范围内的虚拟机,但不是必需的)。

我已经建立桥梁并激活了它:

~$ brctl show
bridge name bridge id           STP enabled interfaces
br0         8000.00215ec64304   yes         vlan15
                                            vnet0

(我几乎可以肯定,vnet0在我启动虚拟机之前,它没有关联)

~$ virsh net-list --all
 Name      State    Autostart   Persistent
--------------------------------------------
 br0       active   yes         yes
 default   active   yes         yes

ip a显示两者br0vlan15链接到的 MAC eno1。在虚拟机 () 的 .xml 文件中/etc/libvirt/qemu/hassos.xml,它显示在“接口”下:

    <interface type='bridge'>
      <mac address='52:54:00:26:69:40'/>
      <source bridge='br0'/>
      <model type='virtio'/>
      <address type='pci' domain='0x0000' bus='0x01' slot='0x00' function='0x0'/>
    </interface>

我最初将其设置为br0直接链接到eno1,因此在virt-install开始创建 vlan 之前我执行了,以防万一。但每次我执行时我都会重新启动 VM sudo netplan apply

我能得到的最接近的结果(其实不是很接近,只是发生了一些事情)是,当我addresses: 192.168.1.115在 上定义br0时,我可以使用此地址和相应的端口访问服务器上的某些内容。只是不是虚拟机(而是在服务器上直接在 docker 中运行的“克隆”)。在这种情况下,它似乎br0被用于服务器上的任何东西?

我正在使用 Ubuntu Server LTS 20.04。

如果这很重要,我已经(根据其他建议)禁用了网桥的 netfilter,如下所述这里

编辑:我通过创建 br0.xml 文件为 libvirt 设置了桥接器:

<network>
  <name>br0</name>
  <forward mode="bridge"/>
  <bridge name="br0"/>
</network>

并添加:

virsh net-define br0.xml
virsh net-start br0
virst net-autostart br0

我也尝试过更复杂的 .xml 文件,例如

<network>
  <name>br1</name>
  <forward mode='nat'>
    <nat>
      <port start='1024' end='65535'/>
    </nat>
  </forward>
  <bridge name='br1' stp='on' delay='0'/>
  <ip address='192.168.1.1' netmask='255.255.255.0'>
    <dhcp>
      <range start='192.168.1.101' end='192.168.1.150'/>
    </dhcp>
  </ip>
</network>

并且使用 192.168。1.X 地址,我可以从 libvirt 内部获取它分配的 IP,但我无法从外部访问。如果我改用 192.168.0.X 地址,尝试启动它时出现错误:

error: Failed to start network br1
error: internal error: Network is already in use by interface eno2

无论是否设置 192.168 都是如此。0.X IP 在 DHCP 池内或外,无论设置 192.168.1.X IP 是否为 DHCP 分配。

答案1

我想我(几乎)重复了你的情况。

我的服务器的两个网络接口都连接到路由器。我的工作站也连接到同一个路由器。

配置:

服务器(Ubuntu Server 20.04 LTS):

  1. 接口:192.168.0.240
  2. 接口:192.168.0.241

VLAN 1 上的桥 (br0)。接口:192.168.100.1

服务器上的 Netplan 文件:

network:
  version: 2
  renderer: networkd
  ethernets:
    enp3s0f0:
      addresses: [ 192.168.0.240/24 ]
      gateway4: 192.168.0.1
      nameservers:
        addresses: [ 8.8.8.8,8.8.4.4 ]
    enx00e04c534458:
      addresses: [192.168.0.241/24]
      gateway4: 192.168.0.1
      nameservers:
        addresses: [8.8.8.8,4.4.4.4]
  bridges:
    br0:
      addresses: [ 192.168.100.1/24 ]
      interfaces: [ vlan100 ]
  vlans:
    vlan100:
      accept-ra: no
      id: 100
      link: enp3s0f0

我不确定这是否真的有必要,但为了让服务器在其接口之间进行路由(记住我之前连接到两个不同的网络),我进行了以下配置。

在 /etc/sysctl.conf 中添加以下行

net.ipv4.ip_forward = 1

跑步:

sudo sysctl -p

虚拟机(Ubuntu Server 20.04 LTS):

使用 virt-install 安装虚拟机时,无法自动获取 IP 地址,因此我手动输入:

子网:192.168.100.0/24 IP:192.168.100.101 网关:192.168.100.1

VM 无法连接到互联网,但安装成功。

生成的虚拟机的netplan文件:

network:
  ethernets:
    enp1s0:
      addresses:
      - 192.168.100.101/24
      gateway4: 192.168.100.1
      nameservers:
        addresses:
        - 8.8.8.8
  version: 2

安装后,我能够访问服务器上的虚拟机,但无法从工作站访问它。这看起来像是路由问题。所以我添加了一条路由。

工作站(Ubuntu 20.04 LTS):

具有 2 个 IP 的单一接口。192.168.0.242 和 192.168.0.243

工作站上的 Netplan 文件:

network:
  version: 2
  renderer: networkd
  ethernets:
    enp3s0:
      dhcp4: no
      addresses: [192.168.0.242/24,192.168.0.243/24]
      gateway4: 192.168.0.1
      nameservers:
        addresses: [46.197.15.60,178.233.140.110,176.240.150.250]
      routes:
      - to: 192.168.100.0/24
        via: 192.168.0.240

最后三行通过服务器的接口添加了到 192.168.100.0 网络的路由。

完成所有这些配置后,我就可以从我的工作站连接到虚拟机了。如果我需要从网络中的任何其他计算机连接到虚拟机,我也需要向它们添加该路由信息。


旧答案,稍后删除

我没有 2 张以太网卡,因此无法测试,但我相信这种方法可能会成功。我相信您可以在不使用 VLAN 的情况下做到这一点。至少这是值得尝试的。

将您的 netplan 文件设置为将一个 nic 配置为标准,将另一个 nic 配置为网桥(为确保万无一失,不使用 DHCP),您可以随意更改 IP 和名称服务器:

network:
  version: 2
  ethernets:
    eno1:
      dhcp4: no
    eno2:
      dhcp4: no
      addresses: [ 192.168.0.100/24 ]
      gateway4: 192.168.0.1
      nameservers:
        addresses: [ 8.8.8.8,8.8.4.4 ]
  bridges:
    br0:
      dhcp4: no
      interfaces: [ en01 ]
      addresses: [ 192.168.0.101/24 ]
      gateway4: 192.168.0.1
      mtu: 1500
      nameservers:
        addresses: [ 8.8.8.8,8.8.4.4 ]
      parameters:
        forward-delay: 4
        stp: true

禁用 netfilter,将桥接器添加到 KVM(我相信你已经这样做了)


正如评论中所说,具有 vlan 的工作 netplan 配置:

network:
  ethernets:
    enp3s0f0:
      addresses: [192.168.0.240/24]
      gateway4: 192.168.0.1
      nameservers:
        addresses: [8.8.8.8,8.8.4.4]
      dhcp4: false
      dhcp6: false
    enx00e04c534458:
      addresses: [10.1.1.1/24]
      gateway4: 10.1.1.1
      nameservers:
        addresses: [8.8.8.8,4.4.4.4]
  vlans:
    vlan10:
      id: 10
      link: enp3s0f0
  bridges:
    br0:
      interfaces: [ vlan10 ]
      addresses: [192.168.1.240/24]
  version: 2
  renderer: networkd

相关内容