从外网访问KVM虚拟机

环境:
物理机: CentOS 7.4
虚拟机: CentOS 7.4web

  1. 在 物理机的/etc/sysconfig/network-scripts 目录下,创建 ifcfg-br0 文件,并修改 ifcfg-eno1 文件。
    注意,原理是:这个bridge是要将物理机的网口eno1和未来虚拟机的网口ens11链接起来。物理机的网口eno1就是“外网”地址了;由于Linux的bridge是二层的,因此这个网口eno1收到的包,也会被虚拟机的连在该bridge上的网口ens11看到。网络

    1.1 创建 ifcfg-br0 文件的目的在于创建一个 bridge,一个示例以下:svg

    DEVICE=br0
    TYPE=Bridge
    NM_CONTROLLED=no
    BOOTPROTO=static
    IPADDR=10.240.218.88  # 这是原先eno1的IP地址
    NETMASK=255.255.254.0
    GATEWAY=10.240.218.1
    ONBOOT="yes"
    DNS1="8.8.8.8"

    1.2 修改 ifcfg-eno1 文件的目的在于将其和 br0 关联起来。注意,这里的修改包括:rest

    • 增长了一行
      BRIDGE=”br0”code

    • 注释掉原有的多行,如GATEWAY, IPADDR, DNS1, PREFIX, IPV6等。 xml

    缘由是:让br0真正地成为真正与外界交换机打交道的。换句话说,把原来的eno1变成了一个集线器(Hub),也就是bridge. blog

  2. 运行 virt-manager ,双击所须要放到外网的虚拟机,点击菜单栏的灯泡进入配置页面:
    新增一块网卡(NIC),注意,Network source选择“Bridge br0: Host device eno1”, Device model选择virtio.
    这里写图片描述图片

    由于新增网卡,因此重启虚拟机ip

  3. 在虚拟机内肯定新增网卡的设备名:
    运行 虚拟机

    ip addr | grep <mac of new nic>

    能够看到新增网卡的名字是 ens11,状态是 down

  4. 配置虚拟机内新增网卡的对应网络配置文件,好比: /etc/sysconfig/network-scripts/ifcfg-ens11
    一个示例以下:

    DEVICE=ens11
    BOOTPROTO=none
    ONBOOT=yes
    USERCTL=no
    TYPE="Ethernet"
    IPADDR="10.240.218.93"    # a new IP
    PREFIX="24"
    GATEWAY="10.240.218.1"
    DNS1="8.8.8.8"
  5. 虚拟机上重启网络服务: systemctl restart network

大功告成。能够从外网(其实也是局域网)访问该虚拟机啦。

理解的要点:
外界的物理交换机链接到了一台Hub(即bridge)上,而物理机的eno1和虚拟机的ens11也都是接到了这个Hub上。 因而,交换机转发出来的报文,eno1和ens11都能看获得,并各自处理属于各自的报文。