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
。几秒钟后,nc
因 Connection 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
要转发成功,我还需要
- 配置
sshd
只监听第一个网卡的端口22。
- 配置我的服务监听第二个网卡的22端口
- 配置第二个网卡使用不同的网络。否则,两个网卡都分配了相同的 IP(10.0.2.15。我可能会更好地为两个网卡硬编码 IP。)
问题实际上是关于防火墙的。我的虚拟机(基于 Oracle Linux VM Templates 上的 Oracle Linux 8.5)实际上在 iptables
和 nft
中都有防火墙规则。禁用 iptables
和 nft
后,端口转发正常。
我在 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
。几秒钟后,nc
因 Connection 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
要转发成功,我还需要
- 配置
sshd
只监听第一个网卡的端口22。 - 配置我的服务监听第二个网卡的22端口
- 配置第二个网卡使用不同的网络。否则,两个网卡都分配了相同的 IP(10.0.2.15。我可能会更好地为两个网卡硬编码 IP。)
问题实际上是关于防火墙的。我的虚拟机(基于 Oracle Linux VM Templates 上的 Oracle Linux 8.5)实际上在 iptables
和 nft
中都有防火墙规则。禁用 iptables
和 nft
后,端口转发正常。