![如何在 qemu(kvm)中将端口从客户机转发到主机](https://linux22.com/image/680667/%E5%A6%82%E4%BD%95%E5%9C%A8%20qemu%EF%BC%88kvm%EF%BC%89%E4%B8%AD%E5%B0%86%E7%AB%AF%E5%8F%A3%E4%BB%8E%E5%AE%A2%E6%88%B7%E6%9C%BA%E8%BD%AC%E5%8F%91%E5%88%B0%E4%B8%BB%E6%9C%BA.png)
在 qemu/kvm 中,是否可能以及如何将端口从客户机转发到主机?
请注意,我的意思是从客户到主机,而不是从主机到客户(这是广泛记录的)。
我想我正在寻找 hostfwd/redir 的“对立面”。就像我使用并理解-net user,hostfwd=tcp::8022-:22
哪个将 HOST 上的端口 8022 连接到 GUEST - 很棒。现在我也想要“对立面”,并且需要将与 GUEST 中的端口 6633 建立的连接发送到 HOST,其中正在运行某个进程以等待该连接。
我找不到某些 --option 能轻易实现这一点吗,或者这是一个愚蠢的请求,暴露了我缺乏网络理解 - 就像那样是不可能的?
答案1
最低限度的工作设置
我可以使用此 QEMU 命令访问主机和外部网络:
qemu-system-x86_64 \
-append 'root=/dev/vda console=ttyS0' \
-device rtl8139,netdev=net0 \
-drive file=./out/buildroot/build/default/x86_64/images/rootfs.ext2.qcow2,format=qcow2,if=virtio,snapshot \
-enable-kvm \
-kernel ./out/linux/default/x86_64/arch/x86/boot/bzImage \
-machine pc \
-netdev user,id=net0 \
-nographic \
-serial mon:stdio \
;
然后在主机上,在端口 8000 上设置文件服务器:
python -m SimpleHTTPServer 8000
nc -kl 0.0.0.0 8000
也可以工作,但在我的一个主机系统上,它只能与 一起工作0.0.0.0
,而不能localhost
。
现在在客:
# Done by init in most non-minimal systems.
ifup -a
ip route
得出:
default via 10.0.2.2 dev eth0
10.0.2.0/24 dev eth0 scope link src 10.0.2.15
它告诉我们我们需要的端口是10.0.2.2
:
cd /tmp
wget 10.0.2.2:8000
cat index.html
使用以下图像进行测试:
- 最小 QEMU + Buildroot 设置
- Ubuntu amd64 云镜像:https://askubuntu.com/questions/281763/is-there-any-prebuilt-qemu-ubuntu-image32bit-online/1081171#1081171
在 Ubuntu 18.10 主机、QEMU 2.12 上测试。
答案2
这应该非常简单。如果您使用的是 NAT,那么您只需要一条转发规则,将数据包发送到 192.168.122.1,这是 libvirt 默认网络上的主机 IP。如果您使用的是桥接设置,请确保主机桥有一个 IP,并将数据包重定向到那里。所有配置都需要在客户机上完成。
答案3
**Try the below command for forwarding port from guest to host or vice-versa**
# forwarding guest 8055 port to host 8055 port
user@host_machine:~$ ssh -L 8055:localhost:8055 guest@IP_ADDRESS
user@host_machine:~$ telnet localhost 8055 # verify by telnet command
# forwarding host 8055 port to guest 8055 port
user@host_Machine:~$ ssh -R 8055:localhost:8055 guest@IP_ADDRESS
user@Guest_Machine:~$ telnet localhost 8055