首页 > 解决方案 > 虚拟机和主机无法通过网桥互相 ping

问题描述

我有一台装有 Debian 10 和 QEMU-KVM 的主机。我安装了软件包并重新启动:

sudo apt install qemu-kvm virt-manager
sudo reboot

所以现在我想创建一个桥接器,使我的虚拟服务器能够(a)连接到网络和(b)被主机和网络上的其他计算机看到。

我阅读了很多关于如何做到这一点的教程,但每次都失败了。iproute2我用 (a) 包和 (b) 包virt-manager (以超级用户身份运行)建立了一些成功的桥。


以root身份尝试:

通过遵循 archwiki,我使用以下命令设置了我的网桥:

sudo ip link add virtual_bridge type bridge
sudo ip link set dev virtual_bridge up

然后我重置以太网卡并将其作为从属设备连接到网桥:

sudo ip link set dev enx24f5a2f17b27 down
sudo ip addr flush dev enx24f5a2f17b27
sudo ip link set dev enx24f5a2f17b27 up
sudo ip link set dev enx24f5a2f17b27 master virtual_bridge

然后我打开 GUI 应用程序:

sudo virt-manager

我右键单击 QEMU/KVM 会话 ( qemu:///system) 并选择连接:

在此处输入图像描述

当会话连接时,我开始创建一个新的虚拟机。在它的创建过程中,我来到一个要求选择虚拟网络类型的窗口。有两种选择。第一个具有子选项,而第二个启用设备的手动输入:

I tried choosing suboptions offered by the first option, but when selected they, issue a warning:

在大多数配置中,macvtap 不适用于主机到来宾网络通信

这对我来说不是一个选项,因为我的虚拟服务器需要双向通信。这就是为什么我选择第二个选项并手动指定我的网桥virtual_bridge

在此处输入图像描述

然后我启动可以浏览互联网的虚拟机,也可以在主机上运行。两者都分配了同一网络中的 IP 。但是当我尝试对他们进行 ping 操作时,ping 对任何方向都不起作用。主机,无法 ping 虚拟机,反之亦然。

在此处输入图像描述

我无法解释这一点,因为archwiki声明网桥应该像交换机一样透明,因此设备应该能够互相 ping:

网桥是用于连接两个或多个网段的软件。网桥的行为就像一个虚拟网络交换机,透明地工作(其他机器不需要知道或关心它的存在)。

如果我检查主机上的互联网设置:

ziga@ziga-laptop:~$ ip addr 
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN group default qlen 1000
    link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
    inet 127.0.0.1/8 scope host lo
       valid_lft forever preferred_lft forever
    inet6 ::1/128 scope host 
       valid_lft forever preferred_lft forever
2: wlp3s0: <BROADCAST,MULTICAST> mtu 1500 qdisc noop state DOWN group default qlen 1000
    link/ether c4:85:08:3c:1a:59 brd ff:ff:ff:ff:ff:ff
3: enx24f5a2f17b27: <BROADCAST,MULTICAST,DYNAMIC,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast master virtual_bridge state UP group default qlen 1000
    link/ether 24:f5:a2:f1:7b:27 brd ff:ff:ff:ff:ff:ff
    inet 192.168.64.100/24 brd 192.168.64.255 scope global enx24f5a2f17b27
       valid_lft forever preferred_lft forever
    inet6 fe80::26f5:a2ff:fef1:7b27/64 scope link 
       valid_lft forever preferred_lft forever
32: virtual_bridge: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc noqueue state UP group default qlen 1000
    link/ether 24:f5:a2:f1:7b:27 brd ff:ff:ff:ff:ff:ff
    inet6 fe80::26f5:a2ff:fef1:7b27/64 scope link 
       valid_lft forever preferred_lft forever
34: vnet0: <BROADCAST,MULTICAST,DYNAMIC,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast master virtual_bridge state UNKNOWN group default qlen 1000
    link/ether fe:54:00:c4:3e:62 brd ff:ff:ff:ff:ff:ff
    inet 169.254.82.75/16 brd 169.254.255.255 scope global vnet0
       valid_lft forever preferred_lft forever
    inet6 fe80::2c93:eff:fea5:c52b/64 scope link 
       valid_lft forever preferred_lft forever

从上面,我可以确认我的以太网接口enx24f5a2f17b27vnet0 (由虚拟机自动创建)都是virtual_bridge*(注意关键字master virtual_bridge)*的奴隶。

老实说,我希望 GUI 应用程序也能创建 TAP 设备,但它只是创建了vnet0……这实际上是一个 TAP 设备吗?

如何进行双向连接?


以普通用户身份尝试(无网桥):

我删除了virtual_bridgevirtual_tap所以一切都恢复了正常。

ziga@ziga-laptop:~$ ip addr
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN group default qlen 1000
    link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
    inet 127.0.0.1/8 scope host lo
       valid_lft forever preferred_lft forever
    inet6 ::1/128 scope host 
       valid_lft forever preferred_lft forever
2: wlp3s0: <BROADCAST,MULTICAST> mtu 1500 qdisc noop state DOWN group default qlen 1000
    link/ether c4:85:08:3c:1a:59 brd ff:ff:ff:ff:ff:ff
3: enx24f5a2f17b27: <BROADCAST,MULTICAST,DYNAMIC,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP group default qlen 1000
    link/ether 24:f5:a2:f1:7b:27 brd ff:ff:ff:ff:ff:ff
    inet 192.168.64.100/24 brd 192.168.64.255 scope global enx24f5a2f17b27
       valid_lft forever preferred_lft forever
    inet6 fe80::26f5:a2ff:fef1:7b27/64 scope link 
       valid_lft forever preferred_lft forever

我注意到,如果我从图像开始virt-managersudo使用qcow2该图像,则该图像将归其所有,root并且将成为 group 的一部分root。这是我避免virt-manager作为普通用户使用的问题的一部分。所以我解决了这个问题并virt-manager以普通用户身份开始。

我创建了相同的虚拟机,但是当弹出一个网络窗口时,它有不同的(!)选项:

我无法enx24f5a2f17b27使用第二个选项手动指定我的界面,所以我选择了用户空间网络。

在此处输入图像描述

然后我启动了可以浏览互联网的虚拟机,也可以在主机上运行。两者都分配了完全不同的IP 。当我尝试 ping 他们时,ping 对任何方向都不起作用。主机,无法 ping 虚拟机,反之亦然。

在此处输入图像描述

以普通用户身份尝试(使用网桥)

所以现在我首先像我第一次尝试一样设置我的桥sudo user

sudo ip link add virtual_bridge type bridge sudo ip link set dev virtual_bridge up sudo ip link set dev enx24f5a2f17b27 down sudo ip addr flush dev enx24f5a2f17b27 sudo ip link set dev enx24f5a2f17b27 up sudo ip link set dev enx24f5a2f17b27 master virtual_bridge

所以我有:

ziga@ziga-laptop:~$ ip addr 
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN group default qlen 1000
    link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
    inet 127.0.0.1/8 scope host lo
       valid_lft forever preferred_lft forever
    inet6 ::1/128 scope host 
       valid_lft forever preferred_lft forever
2: wlp3s0: <BROADCAST,MULTICAST> mtu 1500 qdisc noop state DOWN group default qlen 1000
    link/ether c4:85:08:3c:1a:59 brd ff:ff:ff:ff:ff:ff
3: enx24f5a2f17b27: <BROADCAST,MULTICAST,DYNAMIC,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast master virtual_bridge state UP group default qlen 1000
    link/ether 24:f5:a2:f1:7b:27 brd ff:ff:ff:ff:ff:ff
    inet 192.168.64.100/24 brd 192.168.64.255 scope global enx24f5a2f17b27
       valid_lft forever preferred_lft forever
    inet6 fe80::26f5:a2ff:fef1:7b27/64 scope link 
       valid_lft forever preferred_lft forever
11: virtual_bridge: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc noqueue state UP group default qlen 1000
    link/ether 24:f5:a2:f1:7b:27 brd ff:ff:ff:ff:ff:ff
    inet6 fe80::805f:cfff:feb6:ec91/64 scope link 
       valid_lft forever preferred_lft forever

virt-manager以普通用户身份启动并创建了相同的虚拟机。当网络窗口弹出时,它具有与以前相同的选项:

我无法virtual_bridge使用第二个选项手动指定我的网桥,因为 Qemu 报告了一个内部错误:

在此处输入图像描述

标签: networkingvirtualizationqemukvm

解决方案


推荐阅读