QEMU——网桥

Mat*_*ugg 5 networking kvm bridge qemu

我正在使用 QEMU(和 KVM)在 Debian 9 上设置虚拟机。我目前正在尝试使其通过桥接网络工作,我已经使用 等设置了该ip link网络ip tuntap;这是输出brctl show

bridge name     bridge id               STP enabled     interfaces
br0             8000.107b444f55d6       no              enp4s0
                                                        tap0
docker0         8000.0242d4c18983       no
Run Code Online (Sandbox Code Playgroud)

这是输出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 forever
Run Code Online (Sandbox Code Playgroud)

接口docker0无关。

据我所知,这应该有效。但是,我在 QEMU 中的 Windows 8.1 客户机无法访问互联网,并且无法通过 DHCP 获取 IP(我只是获取自动生成的 169.xx.xx.xx IP)。

我不确定这是为什么。我的 QEMU 参数是:

-net nic -net tap,ifname=tap0
Run Code Online (Sandbox Code Playgroud)

我也尝试过:

-device e1000,netdev=net0,mac=52:55:00:d1:55:01 -netdev tap,id=net0
Run Code Online (Sandbox Code Playgroud)

这两者都会产生相同的无网络访问结果。我无法弄清楚这一点。

我是不是在做蠢事?

小智 1

我刚刚在 QEMU Linux guest 上遇到了非常类似的问题,结果发现 iptables 阻止了流量。如果我为访客设置静态 IP 地址,则主机和访客可以互相 ping 通,但仅此而已。无法从访客计算机访问互联网和我的网络的其余部分。

我强烈建议您使用 Wireshark 或 tcpdump 等工具来调查问题。

我已经使用 Wireshark 从主机捕获了桥接口,看起来请求是从虚拟机发出的,但没有收到响应。

在此输入图像描述

TL;DR:这条线索让我在以下答案中找到了神奇的 iptable 命令(这对我来说很神奇,因为我对 iptables 的经验还不够:)):

https://serverfault.com/a/165786

它起作用了,即使我此刻还不完全理解它,我想我会把我的两分钱留在这里。

祝你好运!