在用户模式网络中通过 libvirt 使用 qemu 进行主机端口转发

在用户模式网络中通过 libvirt 使用 qemu 进行主机端口转发

我在编辑 libvirt 的 host-xml 以使 qemu 将 TCP 连接转发到客户机时遇到了麻烦。 这个问题链接到一篇博客文章建议添加-redir到 Qemu 命令行。但最近它停止工作了。

错误:内部错误:qemu 意外关闭了监视器:qemu-system-x86_64:-redir tcp:5564::3389:-redir 选项已弃用。请改用“-netdev user,hostfwd=...”。

然而,这并不是开箱即用的,也就是说,我获得了主机上的开放端口,但它并没有到达客户端。

我像这样编辑了我的 XML:

<domain type='kvm' xmlns:qemu='http://libvirt.org/schemas/domain/qemu/1.0'>
  .
  .
  .
  </devices>
  <qemu:commandline>
    <qemu:arg value='-net'/>
    <qemu:arg value='user,hostfwd=tcp::22222-:22,hostfwd=tcp::8000-:8000'/>
  </qemu:commandline>
</domain>

我的测试是nc -l -p 8000在客户端和telnet localhost 8000主机上运行的。Telnet 指示已打开 TCP 连接,但客户端没有收到任何内容。

我猜是因为 libvirt 已经包含了一个-net user,...选项,而我新定义的选项不知何故没有得到正确处理。 ps aux | grep qemu显示了这一点:

qemu-system-x86_64 -enable-kvm -name guest=myguestsname,debug-threads=on -S -object secret,id=masterKey0,format=raw,file=~/.config/libvirt/qemu/lib/domain-28-myguestsname/master-key.aes -machine pc-i440fx-artful,accel=kvm,usb=off,vmport=off,dump-guest-core=off -cpu Skylake-Client -m 1024 -realtime mlock=off -smp 1,sockets=1,cores=1,threads=1 -uuid 713287321 -no-user-config -nodefaults -chardev socket,id=charmonitor,path=~/.config/libvirt/qemu/lib/domain-28-myguestsname/monitor.sock,server,nowait -mon chardev=charmonitor,id=monitor,mode=control -rtc base=utc,driftfix=slew -global kvm-pit.lost_tick_policy=delay -no-hpet -no-shutdown -global PIIX4_PM.disable_s3=1 -global PIIX4_PM.disable_s4=1 -boot strict=on -device ich9-usb-ehci1,id=usb,bus=pci.0,addr=0x5.0x7 -device ich9-usb-uhci1,masterbus=usb.0,firstport=0,bus=pci.0,multifunction=on,addr=0x5 -device ich9-usb-uhci2,masterbus=usb.0,firstport=2,bus=pci.0,addr=0x5.0x1 -device ich9-usb-uhci3,masterbus=usb.0,firstport=4,bus=pci.0,addr=0x5.0x2 -device virtio-serial-pci,id=virtio-serial0,bus=pci.0,addr=0x6 -drive file=~/.local/share/libvirt/images/myguestsname.img,format=qcow2,如果=none,id=drive-virtio-disk0 -device virtio-blk-pci,scsi=off,bus=pci.0,addr=0x7,drive=drive-virtio-disk0,id=virtio-disk0,bootindex=1 -drive file=Cloud-Init-ISO/master-init.iso,format=raw,如果=none,id=drive-ide0-0-0,readonly=on -device ide-cd,总线=ide.0,单元=0,驱动器=drive-ide0-0-0,id=ide0-0-0 -fsdev local,security_model=mapped,id=fsdev-fs0,路径=~/guestfs -device virtio-9p-pci,id=fs0,fsdev=fsdev-fs0,mount_tag=guestsfs,总线=pci.0,地址=0x9 -netdev user,id=hostnet0 -device virtio-net-pci,netdev=hostnet0,id=net0,mac=52:54:00:aa:aa:0a,总线=pci.0,地址=0x3 -chardev pty,id=charserial0 -device isa-serial,chardev=charserial0,id=serial0 -chardev spicevmc,id=charchannel0,名称=vdagent -device virtserialport,总线=virtio-serial0.0,nr=1,chardev=charchannel0,id=channel0,name=com.redhat.spice.0 -device usb-tablet,id=input0,总线=usb.0,端口=1 -spice 端口=5900,地址=127.0.0.1,禁用票务,图像压缩=关闭,无缝迁移=打开 -device qxl-vga,id=video0,ram_size=67108864,vram_size=67108864,vram64_size_mb=0,vgamem_mb=16,max_outputs=1,总线=pci.0,地址=0x2 -device intel-hda,id=sound0,总线=pci.0,地址=0x4 -device hda-duplex,id=sound0-codec0,总线=sound0.0,cad=0 -chardev spicevmc,id=charredir0,名称=usbredir -device usb-redir,chardev=charredir0,id=redir0,总线=usb.0,端口=2 -chardev spicevmc,id=charredir1,名称=usbredir -device usb-redir,chardev=charredir1,id=redir1,总线=usb.0,端口=3 -device virtio-balloon-pci,id=balloon0,总线=pci.0,地址=0x8 -net user,hostfwd=tcp::22222-:22,hostfwd=tcp::8000-:8000 -msg timestamp=on

我们可以看到-netdev user,id=hostnet0。我尝试在自定义命令行中使用相同的名称,但失败了:

错误:内部错误:连接到监视器时进程退出:qemu-system-x86_64:-chardev pty,id = charserial0:字符设备重定向到/dev/pts/23(标签 charserial0)

qemu-system-x86_64:-device virtio-net-pci,netdev=hostnet0,id=net0,mac=52:54:00:aa:aa:0a,bus=pci.0,addr=0x3:属性“virtio-net-device.netdev”不能取值“hostnet0”,它正在使用中

对于非用户模式网络设置,一些 问题已经存在。但我需要使用用户模式网络。

如何使用 libvirt 与 qemu 和用户模式网络正确转发端口?

文档在这里并不是很有用,因为它没有说明如何覆盖已经存在的设备定义。

答案1

您的配置中缺少的部分描述如下:https://www.linux-kvm.org/page/Networking。您必须添加另一个具有新地址的 netdev,如下所示:

<domain type='kvm' xmlns:qemu='http://libvirt.org/schemas/domain/qemu/1.0'>
.
.
.
 </devices>
 <qemu:commandline>
   <qemu:arg value='-netdev'/>
   <qemu:arg value='user,id=mynet.0,net=10.0.10.0/24,hostfwd=tcp::22222-:22,hostfwd=tcp::8000-:8000'/>
   <qemu:arg value='-device'/>
   <qemu:arg value='e1000,netdev=mynet.0'/>
 </qemu:commandline>
</domain>

相关内容