如何通过 KVM 在虚拟机之间设置端口转发?

问题浏览数Icon
44
问题创建时间Icon
2025-03-18 01:07:00
作者头像
qingfeng88
  1. 确认虚拟网络模式:确保虚拟机使用NAT网络(默认使用virbr0虚拟网桥)。
  2. 编辑虚拟网络配置
    sudo virsh net-edit default
  3. 添加端口转发规则:在<forward>标签内插入:
    <port start='宿主端口' end='宿主端口' protocol='tcp'/>
    <domain name='虚拟机名称'/>
    <ip address='虚拟机IP'/>
  4. 重启虚拟网络
    sudo virsh net-destroy default
    sudo virsh net-start default
  5. 配置防火墙(如需要)
    sudo firewall-cmd --add-forward-port=port=宿主端口:proto=tcp:toaddr=虚拟机IP:toport=虚拟机端口 --permanent
    sudo firewall-cmd --reload

    验证:通过virsh net-dumpxml default检查规则,使用nc -zv 宿主机IP 宿主端口测试连通性。

更多回答

作者头像
donghai66

在KVM中设置端口转发,可通过宿主机的iptables规则实现。例如:sudo iptables -t nat -A PREROUTING -p tcp --dport 宿主机端口 -j DNAT --to-destination 虚拟机IP:虚拟机端口,并确保启用IP转发(net.ipv4.ip_forward=1)。

延伸知识点:KVM虚拟网络模式。默认使用NAT模式,虚拟机通过虚拟网桥(virbr0)共享宿主机IP。桥接模式(如br0)则直接暴露虚拟机到物理网络,需手动配置网桥接口。通过virsh net-edit可修改虚拟网络配置,例如设置不同网段或启用DHCP。

作者头像
softwave66

通过KVM在虚拟机之间设置端口转发需结合宿主机网络配置及防火墙规则。以下是核心步骤:

  1. 确认虚拟机网络模式

    • 若使用NAT模式(默认),需通过宿主机iptables或firewalld配置转发。
    • 若使用桥接模式,虚拟机拥有独立IP,可直接通过物理网络访问。
  2. 使用iptables配置(NAT模式推荐)

    # 启用IP转发
    sysctl -w net.ipv4.ip_forward=1
    # 添加端口转发规则(例:宿主机8080→虚拟机192.168.122.10:80)
    iptables -t nat -A PREROUTING -p tcp --dport 8080 -j DNAT --to-destination 192.168.122.10:80
    iptables -I FORWARD -d 192.168.122.10/24 -p tcp --dport 80 -j ACCEPT
    # 保存规则(Ubuntu: iptables-persistent; CentOS: iptables-save > /etc/sysconfig/iptables)
  3. 使用virsh网络配置(XML编辑)

    virsh net-edit default
    # 在<network>段内添加:
    <forward mode='nat'>
     <port start='8080' end='8080' to_port='80' to_addr='192.168.122.10'/>
    </forward>
    virsh net-destroy default && virsh net-start default
  4. 防火墙放行

    firewall-cmd --add-port=8080/tcp --permanent  # firewalld
    ufw allow 8080/tcp                           # ufw

注意事项

  • 确认虚拟机防火墙放行目标端口
  • 若虚拟机IP动态分配,建议绑定MAC地址固定IP
  • 使用ss -tulnp | grep 端口telnet 宿主机IP 端口验证转发
作者头像
silent66

为什么不考虑使用基于容器的虚拟化技术,如LXC/LXD,通过其内置的网络桥接功能简化端口管理?