KVM 虚拟网络

type
status
date
slug
summary
tags
category
icon
password

概览

KVM 的虚拟网络相当于物理世界里的交换机/路由器,常见模式有:
  • NAT 模式(默认 libvirt 网络) — 虚拟机位于私网,通过宿主机做 NAT 与外网通信。
  • 桥接(bridge)模式 — 虚拟机直接接入物理网络,像物理主机一样获得同网段地址。
  • 隔离模式(isolated) — 虚拟机互通但无法访问外网/宿主机(用于测试或安全隔离)。

一、虚拟网卡(guest interface)

关键概念

  • 虚拟网卡模型(model):常用 virtio(高性能 paravirtualized 驱动)。
  • libvirt 提供对 VM 网络接口的动态添加/删除能力(virsh 命令)。
虚拟网卡驱动
notion image

常用操作(步骤与示例)

  • 添加网卡(临时或持久)
    • 成功提示:Interface attached successfully
  • 查看虚拟机接口
    • 输出列出 Interface, Type, Source, Model, MAC。
  • 删除网卡
    • 成功提示:Interface detached successfully
注意:--persistent 表示重启后仍保留配置;不加则为临时(重启 VM 会丢失)。

二、NAT 模式(libvirt 默认网络)

概念要点

  • 虚拟网络视作私网(例如 192.168.122.0/24),宿主机充当网关并对外做 NAT。
  • 需要关注:网关地址、路由、SNAT/MASQUERADE、DNAT(端口映射)
  • 若要让外部能访问虚拟机(端口映射),需在宿主机上配置 DNAT/转发规则并开启 IP 转发。

常见配置与命令示例

  1. 开启 IP 转发(宿主机)
    1. SNAT / MASQUERADE(通常用于源地址转换,让虚拟机访问外网)
      1. DNAT(端口映射,外部端口 → 虚拟机:端口)
        1. 对应的 FORWARD 规则(放行转发)
          建议:在现代 RHEL/CentOS/Fedora 上优先使用 firewalld(firewall-cmd --add-forward-port=...)或 nftables,避免直接修改 iptables(除非你熟悉 iptables)。确保 /proc/sys/net/ipv4/ip_forward 为 1。

          三、桥接(bridge)模式

          概念要点

          • 桥接模式使虚拟机像物理主机一样出现在物理网络上,虚拟机可以获得物理网络的 DHCP 或静态地址。
          • 宿主机网络配置要点:通常把物理网卡(例如 ens33)“绑定”到 bridge(例如 br1),br1 承载 IP 配置,而物理接口不再直接有 IP(它作为 bridge 的从接口)。

          操作流程与示例(步骤)

          1. 创建 bridge 并绑定物理接口(libvirt 提供快捷)
            1. 输出示例:Created bridge br1 with attached device ens33,并可用 ip addr show br1 查看 br1 的 IP。
          1. 查看接口状态
            1. br1 会有 IP(例如 192.168.140.200/24),而 ens33 会显示 master br1
          1. 示例 network-scripts 配置(旧式 ifcfg 文件)
              • /etc/sysconfig/network-scripts/ifcfg-br1
                • /etc/sysconfig/network-scripts/ifcfg-ens33
              桥接场景下宿主机通常应使用稳定的(静态或受控的 DHCP)地址,但关键是在配置桥接时应把 IP 配置放在 bridge 接口(br1)上,而不是物理接口上。另外,并非必须关闭 NetworkManager;若使用 NetworkManager,需用 nmcli 或 NetworkManager 的配置方式创建桥接;若使用 network-scripts,则可能需要禁用 NetworkManager 或调整其配置,避免冲突。

              四、隔离模式(简述)

              • 阻止虚拟机访问宿主机或外网,仅在虚拟机内部网络中通信。用于安全/测试场景。
              • 实现方式:不配置 NAT/路由,或用自定义 libvirt network 并禁用 forward。

              五、常见错误与注意事项

              • 忘记开启 IP 转发:做 NAT/DNAT 前必须开启 net.ipv4.ip_forward=1,否则流量不会通过宿主机转发。
              • iptables 规则被 firewalld 覆盖:在启用 firewalld 的系统上直接用 iptables 命令写规则,可能在重启或 firewalld reload 后丢失。优先使用 firewall-cmd 或把规则持久化。
              • bridge IP 放在物理接口上:错误示范 — 不要给物理接口(ens33)同时配置 IP 再去创建 bridge;正确做法是把 IP 配在 brX 上,ens33 作为 bridge 的从接口。
              • DNAT 的目标地址需可路由:DNAT 转发到虚拟机前,宿主机的 FORWARD 和虚拟机防火墙必须允许对应端口/地址。
              • 使用 virsh iface-bridge 的局限:某些发行版/版本中该命令可能不可用或行为不同,建议了解 distro 的网络管理工具(NetworkManager/nmcli、netplan、network-scripts)并按其方式创建 bridge。
              • 虚拟化性能优化:使用 virtio 驱动可以显著降低网络延迟并提高吞吐。

              六、常用命令速查(便于复习)

              • 添加接口(持久):
                • virsh attach-interface <VM> --type network --model virtio --source <network> --persistent
              • 列出 VM 接口:
                • virsh domiflist <VM>
              • 删除接口(持久):
                • virsh detach-interface <VM> --type network --mac <MAC> --persistent
              • 创建 bridge(libvirt 快捷):
                • virsh iface-bridge <physical-dev> <bridge-name>
              • 查看接口 IP:
                • ip addr show br1 / ip addr show ens33
              • 开启内核转发:
                • sysctl -w net.ipv4.ip_forward=1
              • DNAT 示例:
                • iptables -t nat -I PREROUTING -d <host-ip> -p tcp --dport <外部端口> -j DNAT --to-destination <vm-ip>:<vm-port>
              • SNAT/MASQUERADE 示例:
                • iptables -t nat -A POSTROUTING -s <vm-subnet> -o <外网接口> -j MASQUERADE

              七、推荐进阶学习点

              • 了解 libvirt network XMLvirsh net-dumpxml default / virsh net-edit)以掌握默认网络配置。
              • 学习 firewalldnftables 的端口转发与持久化方式。
              • 熟悉 NetworkManager/nmclisystemd-networkdnetplan 在桥接配置上的差异与实践。
              • 研究 SR-IOV、macvtap、ovs(Open vSwitch) 等更高级的虚拟网络选项(用于高性能或复杂网络拓扑)。

              Loading...