我正在使用QEMU (和KVM)在Debian 9上设置一个VM。我目前正在尝试通过一个桥接网络来工作,我使用ip link、ip tuntap等设置了桥接网络;下面是brctl show的输出:
bridge name bridge id STP enabled interfaces
br0 8000.107b444f55d6 no enp4s0
tap0
docker0 8000.0242d4c18983 no下面是ip a的输出:
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: enp4s0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast master br0 state UP group default qlen 1000
link/ether 10:7b:44:4f:55:d6 brd ff:ff:ff:ff:ff:ff
3: docker0: <NO-CARRIER,BROADCAST,MULTICAST,UP> mtu 1500 qdisc noqueue state DOWN group default
link/ether 02:42:d4:c1:89:83 brd ff:ff:ff:ff:ff:ff
inet 172.17.0.1/16 brd 172.17.255.255 scope global docker0
valid_lft forever preferred_lft forever
4: tap0: <NO-CARRIER,BROADCAST,MULTICAST,UP> mtu 1500 qdisc pfifo_fast master br0 state DOWN group default qlen 1000
link/ether f6:54:bb:db:d7:c6 brd ff:ff:ff:ff:ff:ff
inet6 fe80::f454:bbff:fedb:d7c6/64 scope link
valid_lft forever preferred_lft forever
5: br0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc noqueue state UP group default qlen 1000
link/ether 10:7b:44:4f:55:d6 brd ff:ff:ff:ff:ff:ff
inet 192.168.0.26/24 brd 192.168.0.255 scope global br0
valid_lft forever preferred_lft forever
inet6 fe80::127b:44ff:fe4f:55d6/64 scope link
valid_lft forever preferred_lft foreverdocker0接口是不相关的。
据我所知,这应该行得通。然而,我的Windows8.1客户在QEMU内没有互联网接入,并且无法通过DHCP获得一个IP (我只是获得自动生成的169.xx.xx.xx IP)。
我不知道这是为什么。我的QEMU论点是:
-net nic -net tap,ifname=tap0我也试过:
-device e1000,netdev=net0,mac=52:55:00:d1:55:01 -netdev tap,id=net0这两者产生相同的结果,没有网络访问。我搞不懂这个。
我在做什么蠢事吗?
发布于 2018-07-26 09:05:11
我刚刚在QEMU来宾上遇到了一个非常类似的问题,结果发现iptables阻塞了流量。如果我为客人设置了一个静态IP地址,那么主机和客人可以互相切换,但仅此而已。从客服机上无法联系到互联网和我的其他网络。
我强烈建议您使用像Wireshark或tcpdump这样的工具来调查这个问题。
我已经使用Wireshark从主机上捕获了桥接器接口,似乎是来自虚拟机的请求,但没有收到响应。

TL;DR:这条线索引导我找到了神奇的iptable命令(对我来说,这很神奇,因为我对iptables:)的经验还不够),在下面的答案中:
https://serverfault.com/a/165786
它起了作用,即使我在这一刻不完全理解它,我也认为我会把我的两分钱留在这里。
祝好运!
发布于 2020-01-22 23:18:13
我目前也在努力解决这个问题。我比你更接近解决方案。
我在Debian 10上,我决定只使用a包iproute2 (ip link,ip addr,bridge link.)它是内核的一部分,可以在任何Linux上使用。并打包qemu-kvm。这是你需要的一切。
打开第一终端,把它写下来,这样你就能看到你的进度:
while true; do ip addr; sleep 1; clear; done打开第二个终端,在查看第一个终端的进度时执行这些逗号:
sudo ip link add virtual_bridge type bridge
sudo ip link set virtual_bridge up你有一座桥,就是up。
之前的一个实验
您的virtual_bridge现在是up,但是您的以太网卡可能是up或down。现在,阅读这两种场景,我通过尝试和错误找出。这很重要(!)这样你就能了解你的以太网卡是如何反应的。您可以尝试或不尝试,但我建议您在观看第一个终端进行更改时,完全按照下面所述的方式进行。
如果您的以太网卡是down,请使用下面的命令为它分配一个主卡。它将发挥作用:
sudo ip link set enx24f5a2f17b27 master virtual_bridge现在打开它:
sudo ip link set enx24f5a2f17b27 up你会惊讶于卡不会连接到你的互联网。即使您重新启动它,它也不会成功:
sudo ip link set enx24f5a2f17b27 down
sudo ip link set enx24f5a2f17b27 up即使你重新启动桥,这是卡的主人,谁应该控制它:
sudo ip link set virtual_bridge down
sudo ip link set virtual_bridge up我设法让它连接到互联网的唯一方法是重新启动卡,移除主卡,刷新它以删除所有IP (也许这不是必需的),手动分配一个已知的和工作的IP,然后分配主:
sudo ip link set enx24f5a2f17b27 down
sudo ip link set enx24f5a2f17b27 up
sudo ip addr flush enx24f5a2f17b27
sudo ip addr add 192.168.64.100/24 dev enx24f5a2f17b27
sudo ip link set enx24f5a2f17b27 master virtual_bridge在这一点上,互联网应该开始工作了。
如果您的以太网卡是up,它可能有一个IP和您的互联网必须工作。所以现在尝试给它分配一个母版,下面有一个命令。看起来不错!
sudo ip link set enx24f5a2f17b27 master virtual_bridge现在,重新设置桥接多次,并注意卡上发生了什么:
sudo ip link set virtual_bridge down
sudo ip link set virtual_bridge up
sudo ip link set virtual_bridge down
sudo ip link set virtual_bridge up您将看到,每当您启用网桥以太网卡也将启用,它将获得IP和连接到互联网。但一旦你关掉卡片
sudo ip link set enx24f5a2f17b27 down它将无法恢复到互联网,无论你复位多少次桥。
这就是为什么最重要的是你首先打开以太网卡,然后给它一个主人,而不是相反的方式!换句话说,当您指定主程序时,应该启用卡片。
正如我们从上面的例子中学到的,我们首先(!)打开将获得IP的以太网卡:
sudo ip link set enx24f5a2f17b27 up然后我们给它分配一个主人:
sudo ip link set enx24f5a2f17b27 master virtual_bridge我们创建了一个抽头设备,它就像虚拟机的虚拟以太网卡。这很重要(!)将user和group分配给它,因为它可能没有适当的特权,否则:
sudo ip tuntap add virtual_tap mode tap user ziga group ziga现在您已经创建了它,您可以尝试启用它,但是您不会成功,因为只有虚拟机可以这样做:
sudo ip link set virtual_tap up因此,它将保持在down状态。只需将主从也应用于此:
sudo ip link set virtual_tap master virtual_bridge你已经完成了网络的建立。请注意,此时您的抽头设备不会有IP。当您启动虚拟机并等待虚拟机自行设置时,它将被分配给它。
现在是正确启动虚拟机的时候了。我使用的是最新的-nic命令,它更短,更有能力(!)而不是旧命令(朗读)。不管怎样..。我使用以下命令:
qemu-system-x86_64 -enable-kvm -cpu host -smp cores=3,threads=1 -m 4096 -nic tap,ifname=virtual_tap,script=no,downscript=no -boot order=c -cdrom ~/Dropbox/workspace/racunalnistvo/programi/kvm/iso/centos-8.1.1911-x86_64-dvd1.iso -drive file=~/Dropbox/workspace/racunalnistvo/programi/kvm/vm/windows.qcow2,format=qcow2如果您省略了选项
script=no和downscript=no,上面的comand将返回一个无害的警告: RTNETLINK :操作不允许使用W: /etc/ Qemu :没有为来宾接口找到的桥,这是因为在模拟Qemu尝试自动设置它自己的桥之前&使用脚本/etc/qemu-ifup点击。它还将尝试删除桥&在脚本/etc/qemu-ifdown完成后点击。如果您查看这些脚本,您会发现它们使用的是命令brctl,这是我没有安装的包bridge-utils的一部分,而且脚本会失败!无论如何,我们手动创建了桥和抽头设备,因此我们不需要这些脚本,并且阻止Qemu用script=no和downscript=no调用它们。重写这些脚本以使用iproute2而不是bridge-utils会很有趣,但是您需要root特权来运行它们,专家建议我们不要使用root来运行虚拟机。
虚拟机将启动,连接到互联网,但它将无法平主机!此外,主机将能够连接到互联网,并将能够平平同一网关。但是它将不能平一个虚拟机!
另外,请注意第一个终端,在那里您将看到TAP设备现在已启用,并且它有一个IP,但是这个IP在这里不同于您在虚拟机中看到的那个!有人能解释一下吗?
这就是我所能理解的,我希望它能帮助到别人。我仍然不知道为什么主机和虚拟机不能同时使用,因为TAP设备应该启用TCP、UDP和ICMP.我怀疑这是因为我必须以某种方式将IP分配给桥(朗读,朗读),但我不知道如何选择正确的IP。有人能帮上忙吗?
https://unix.stackexchange.com/questions/456449
复制相似问题