Linux宿主机访问QEMU虚拟机的流程及永久配置端口转发远程访问的最佳方案
Linux宿主机访问QEMU虚拟机的流程及永久配置端口转发远程访问的最佳方案
嘿,我完全懂你找稳定永久端口转发方案的痛苦——之前我也踩过不少坑,尤其是想要跨所有KVM变体通用的配置方式。别担心,直接通过修改虚拟机的XML配置文件添加QEMU原生参数,就能搞定永久生效的端口转发,下面一步步给你讲清楚:
首先,先把虚拟机停掉,因为修改XML需要虚拟机处于关机状态:
virsh shutdown <你的虚拟机名称>
接下来编辑虚拟机的XML配置:
virsh edit <你的虚拟机名称>
第一步要先给XML添加QEMU命名空间,不然libvirt会不识别qemu相关的标签。找到根标签<domain>,把它改成这样(原来的type属性保留,比如type='kvm'):
<domain type='kvm' xmlns:qemu="http://libvirt.org/schemas/domain/qemu/1.0">
然后,在XML文件的末尾,</devices>标签之后、</domain>标签之前,添加QEMU命令行参数区块,用来配置端口转发。举个实际例子:如果你想把宿主机的8080端口(TCP协议)转发到虚拟机的80端口,让远程能访问,就加这段:
<qemu:commandline> <qemu:arg value='-redir'/> <qemu:arg value='tcp:0.0.0.0:8080::80'/> </qemu:commandline>
这里解释下参数的意思:
tcp:指定转发的协议,UDP的话改成udp就行0.0.0.0:表示允许所有远程IP访问这个端口,如果只想让本地访问,换成127.0.0.18080:宿主机上对外暴露的端口80:虚拟机内部对应的服务端口
要是你需要转发多个端口,直接在同一个<qemu:commandline>里加多组参数就行,比如同时转发SSH(22)和HTTP(80):
<qemu:commandline> <qemu:arg value='-redir'/> <qemu:arg value='tcp:0.0.0.0:2222::22'/> <qemu:arg value='-redir'/> <qemu:arg value='tcp:0.0.0.0:8080::80'/> </qemu:commandline>
保存退出编辑器后,启动虚拟机:
virsh start <你的虚拟机名称>
最后验证一下配置是否生效:在宿主机上用这条命令查看端口监听状态,能看到qemu进程在监听你设置的端口就说明成了:
ss -tulnp | grep <宿主机端口号>
还有几个要注意的点:
- 宿主机的防火墙(比如ufw、firewalld)要开放你设置的宿主机端口,比如用
ufw allow 8080/tcp - 虚拟机内部的防火墙也要开放对应的服务端口(比如上面例子里的80)
- 这种方式之所以能适配所有KVM变体,是因为直接用了QEMU原生的端口转发参数,绕过了libvirt不同网络模式下的配置差异,不管你用的是user网络、NAT还是桥接,只要虚拟机启动就会加载这些参数
备注:内容来源于stack exchange,提问作者nicholascox2
相关产品推荐
相关产品推荐

