18.04 NetworkManager 主机和 KVM netplan 客户机的桥接网络

18.04 NetworkManager 主机和 KVM netplan 客户机的桥接网络

目标是让客户机与主机位于同一网络上(使用与主机相同的 DHCP 服务器)。

我已经达到了这样的程度:主机通过外部 DHCP 配置,客户机配置了静态 IP,它们可以通信,主机可以与网络的其余部分通信,但客户机不能。

我正在遵循有关使用 NetworkManager 创建桥接并在 KVM 中使用它的指南(我还从主机中删除了所有 Wi-Fi 连接并从 KVM 中删除了默认桥接):

$ nmcli con add ifname br0 type bridge con-name br0
$ nmcli con add type bridge-slave ifname enp59s0 master br0
$ nmcli con modify br0 bridge.stp no
$ nmcli con up br0
$ nmcli c
NAME                  UUID                                  TYPE      DEVICE  
br0                   39f90a3b-6090-4b4f-a9c4-76d6b980c8c4  bridge    br0     
bridge-slave-enp59s0  dd58e274-8cfa-4102-b524-fd16d96516b8  ethernet  enp59s0 
docker0               901ac863-2d2b-4351-9b81-fbc2096e398b  bridge    docker0
$ brctl show br0
bridge name  bridge id          STP enabled interfaces
br0          8000.54bf6428c24c  no          enp59s0

ip a br0获取 IP,enp59s0是一个从属接口,因此它不显示IP。

/tmp/br0.xml:

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

设置 KVM:

$ virsh net-define /tmp/br0.xml
$ virsh net-start br0
$ virsh net-autostart br0
$ virsh net-list --all
 Name                 State      Autostart     Persistent
----------------------------------------------------------
 br0                  active     yes           yes

访客 /etc/netplan/01-netcfg.yaml:

network:
  version: 2
  renderer: networkd
  ethernets:
    ens3:
      addresses: [192.168.5.100/24]
      gateway4: 192.168.5.254
      dhcp4: no
      dhcp6: no

当虚拟机运行时vnet0

$ nmcli c
NAME                  UUID                                  TYPE      DEVICE  
br0                   39f90a3b-6090-4b4f-a9c4-76d6b980c8c4  bridge    br0     
bridge-slave-enp59s0  dd58e274-8cfa-4102-b524-fd16d96516b8  ethernet  enp59s0 
docker0               901ac863-2d2b-4351-9b81-fbc2096e398b  bridge    docker0 
vnet0                 1e6cdf02-8f57-4670-b6a7-b72e15151137  tun       vnet0  
$ brctl show br0
bridge name  bridge id          STP enabled interfaces
br0          8000.54bf6428c24c  no          enp59s0
                                            vnet0

在主机上的 Wireshark 中br0我看到了所有试图从客户机到网络和从网络到客户的数据包(我尝试从客户机 ping/连接到外部服务器,并从该外部服务器 ping/连接到客户机)。但连接没有接通,客户机无法与网络的其余部分通信。

这看起来像是主机桥的问题。桥出了什么问题?

答案1

好的,需要在 iptables 中允许转发。脚本 /etc/NetworkManager/dispatcher.d/br0.sh:

#!/bin/bash

if [ "$1" == br0 ]; then
    case "$2" in
        up)
            /sbin/iptables -A FORWARD -i br0 -j ACCEPT
            ;;
        down)
            /sbin/iptables -D FORWARD -i br0 -j ACCEPT
            ;;
    esac
fi

还可以添加virsh net-destroy br0virsh net-start br0重新启动 KVM 部分。

相关内容