QEMU Deb9 来宾图形安装在安装过程中无法获得 DHCP 回复

QEMU Deb9 来宾图形安装在安装过程中无法获得 DHCP 回复

我的目标是使用主机上的桥接接口设置一些基于 QEMU/libvirt 的来宾,以便每个来宾虚拟机在我的 LAN 网络上都有一个 DHCP 分配的 IP 地址。我已经成功设置并使用了不太复杂的虚拟机配置,并且知道我的硬件支持虚拟化,所以可以这么说,我将尝试切入正题。

拓扑结构

每个节点都通过 1Gbps 以太网连接(因此没有无线接口)

[路由器]---[交换机1]---[交换机2]---[主机]

主持人

  • 运行 Ubuntu 16.04.5
  • 1x 1Gbps NIC 配置 dhcp 用于管理活动 (em1)
  • 1x 1Gbps NIC 配置为具有静态 IP 地址的网桥(br0 / eth1 从属)
  • 使用来自同一 LAN 网络中不同主机的 SSH 和 ping 成功测试网桥连接。我在接口文件中明确禁用生成树协议,并且 brctl show 命令正确显示我的网桥,其中 eth1 作为唯一接口。

尝试使用 virt-install 进行来宾安装

安装命令

virt-install --name={guest-name} --vcpus=2 --memory=4096 --network bridge=br0
--cdrom={.iso-img-path} --disk size=20,path={diskimg-path} --os-variant=debian8
--graphics vnc,password={pass},listen=0.0.0.0 --noautoconsole

到目前为止观察到的行为和故障排除

  • 连接到Guest VM VNC以成功安装

  • Debian 9 图形安装程序报告无法通过主机桥接口自动配置 DHCP 的来宾网络接口

  • 命令 'sudo tcpdump -i br0 | sudo tcpdump -i br0 | sudo tcpdump -i br0 | grep -i dhcp'(下面的输出)仅显示正在广播的请求,没有回复。

10:08:57.833669 IP 0.0.0.0.bootpc > 255.255.255.255.bootps:BOOTP/DHCP,请求来自 52:54:00:8a:9e:69(oui 未知),长度 300

我有技术背景,但不熟悉底层细节以及如何正确排除 DHCP 故障。

更新1

我在 Ubuntu 主机上配置了 tshark,并通过以太网将运行 Wireshark 的笔记本电脑连接到路由器上的一个交换机端口。

注意:据我所知,我的路由器不支持任何端口镜像或端口监控。

新拓扑

[路由器]---[交换机1]---[交换机2]---[主机-Tshark]

|

[Deb9.5-Wireshark]

Tshark 命令和结果

[]$ tshark -w out.pcap -f "udp port 68 or port 67" -i any

[]$ tshark -r out.pcap -V | grep -e Frame -e Bootstrap -e User\ Datagram\ Protocol -e Bootp\ flags -e "Internet Protocol Version 4"
Frame 295: 344 bytes on wire (2752 bits), 344 bytes captured (2752 bits) on interface 0
    Frame Number: 295
    Frame Length: 344 bytes (2752 bits)
    [Frame is marked: False]
    [Frame is ignored: False]
Internet Protocol Version 4, Src: 0.0.0.0, Dst: 255.255.255.255
User Datagram Protocol, Src Port: 68, Dst Port: 67
Bootstrap Protocol (Discover)
    Bootp flags: 0x0000 (Unicast)
  • 我启动了上面的捕获命令,然后快速转移到我的 debian 9 安装 VNC 并重试 DHCP 自动配置,然后快速停止捕获
  • 我注意到捕获计数在捕获开始后开始增加,但在我告诉图形安装重新尝试 DHCP 配置之前,所有数据包看起来与上面的输出相同。 (有些数据包可能陷入转发循环?)
  • 在主机上使用 Tshark 之前,我尝试在笔记本电脑上使用 Wireshark,因此我回家后将尝试一些过滤器,但在使用 Wireshark 进行测试期间,我没有看到任何 DHCP/BOOTP(发现)数据包通过。
  • Bootp 标志被标记为单播,但 IP src/dst 使它看起来像是在尝试广播 Discover 数据包并等待响应?任何更熟悉 DHCP 的人都可以帮助阐明这一点

更新 2——增加分辨率

因此,我接下来尝试的是使用 DHCP 发现数据包中的 MAC 地址,并在路由器 GUI 上配置静态 IP。这成功了,因为它允许我通过安装程序的网络配置部分,但当我到达需要通过连接到镜像服务器来配置包管理器的点时,它失败了。

现在 ARP 解析是我熟悉的东西,我发现从网桥发出的 ARP 数据包没有得到回复,类似于 DHCP 发现数据包。当我检查从 LAN 上的另一台主机 ping 网桥接口的数据包时,我发现回复的源字段中的 MAC 地址错误。事实证明,Linux 内核将 IP 地址视为松散耦合系统中的“系统对象”,因此将多个接口连接到同一网络 (192.168.1.0/24) 并不能保证使用哪个物理接口来处理数据包与特定 IP 相关。

为了解决这个问题,我只是将系统中的每个物理接口添加到桥接接口定义中,并且重新启动后一切正常。这不是我理想的设置,但它可以工作,并且 DHCP 按预期工作。

更多信息: https://lwn.net/Articles/45373/

相关内容