networking - 虚拟机和主机无法通过网桥互相 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
) 并选择连接:
当会话连接时,我开始创建一个新的虚拟机。在它的创建过程中,我来到一个要求选择虚拟网络类型的窗口。有两种选择。第一个具有子选项,而第二个启用设备的手动输入:
主机设备 enx24f5a2f17b27: macvtap
- 桥
- VEPA
- 私人的
- 直通
指定共享设备名称
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
从上面,我可以确认我的以太网接口enx24f5a2f17b27
和vnet0
(由虚拟机自动创建)都是virtual_bridge
*(注意关键字master virtual_bridge
)*的奴隶。
老实说,我希望 GUI 应用程序也能创建 TAP 设备,但它只是创建了vnet0
……这实际上是一个 TAP 设备吗?
如何进行双向连接?
以普通用户身份尝试(无网桥):
我删除了virtual_bridge
,virtual_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-manager
并sudo
使用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 报告了一个内部错误:
解决方案
推荐阅读
- java - 在通过 Fcm 的 Firebase 动态链接中,它只是打开应用程序而不是进入活动
- python - 现有演示文稿中每张 pptx 幻灯片的形状编号/索引
- python - 如何将此代码从 Keras 转换为 Tensorflow?
- android - 无法构建用于测试的 apk
- excel - 如何在特定单元格中显示数据?
- git - git pull 在同一个本地存储库中的一个分支
- c++ - 读取 ppm 文件并转换为灰度或反转
- node.js - 出现错误:chromedriver 安装失败错误 eacces 权限被拒绝 mkdir
- bash - 将参数传递给像树命令这样的打印目录
- python - 在 Google Colab 上优化张量流模型的推理速度