QEMU hostfwd 仅适用于某些端口

QEMU hostfwd works only for some ports

我在 aarch64 主机上编译了 qemu-system-x86_64,并且能够 运行 一个 x86_64 guest 使用像

这样的命令
qemu-system-x86_64 -m 4096 -drive file=vmimage.qcow2,if=virtio \
           -boot once=c,menu=on -net nic,model=virtio-net-pci \
           -net user,hostfwd=tcp::8080-:80,hostfwd=tcp::22222-:22

我可以 ssh 使用

进入来宾
ssh -p22222 user@localhost

同时80端口没有转发成功

为了调试,我用nc在guest里面监听80端口

nc -l 80

然后在主机中,我连接到转发端口

nc localhost 8080

但是,它无法连接到访客 nc

我试过监控界面。当主机nc命令执行时,info usernet显示如下:

(qemu) info usernet
Hub 0 (#net162):
  Protocol[State]    FD  Source Address  Port   Dest. Address  Port RecvQ SendQ
  TCP[SYN_SENT]      33       127.0.0.1  8080       10.0.2.15    80     0     0
  TCP[ESTABLISHED]   21       127.0.0.1 22222       10.0.2.15    22     0     0
  TCP[HOST_FORWARD]  12               *  8080       10.0.2.15    80     0     0
  TCP[HOST_FORWARD]  11               * 22222       10.0.2.15    22     0     0
...

我相信 SYN_SENT (FD 33) 对应于主机 nc 命令,这与 HOST_FORWARD 行 (FD 12) 相匹配。然而,它从来没有变成 ESTABLISHED。几秒钟后,ncConnection reset by peer. 而死,FD 33 行消失了。

如果我 nc localhost 22222,我可以看到 OpenSSH 横幅。

看来只有22端口被转发了。关于原因或如何调试的任何想法?

主机和来宾都没有防火墙iptables配置,SELinux是允许的。

谢谢

编辑:

作为临时解决方法,我配置了第二个网卡,并使用新接口的端口 22 转发我的服务。我也切换到较新的 -nic 选项,但 hostfwd 仍然仅适用于端口 22。

qemu-system-x86_64 -m 4096 -drive file=vmimage.qcow2,if=virtio \
                   -boot once=c,menu=on \
                   -nic user,model=virtio-net-pci,hostfwd=tcp::60022-:22 \
                   -nic user,model=virtio-net-pci,net=10.0.3.0/24,hostfwd=tcp::8080-10.0.3.15:22

要转发成功,我还需要

问题实际上是关于防火墙的。我的虚拟机(基于 Oracle Linux VM Templates 上的 Oracle Linux 8.5)实际上在 iptablesnft 中都有防火墙规则。禁用 iptablesnft 后,端口转发正常。