虚拟化技术:网络管理(八)
八、网络管理
1. qemu-kvm支持的网络
1.1 基于NAT
1.2 基于桥接(网桥)
1.3 基于用户自定义的隔离网络
1.4 基于直通网卡的网络
本文不实验此类型!
1.5 支持的网卡类型
通常主流就是用RTL8139、e1000,还有用的较多的是virtio。因为virtio作为半虚拟化方式,能减少一定开销。
2. virsh管理网络的命令
virsh
net-autostart 自动开始网络
net-create 从一个 XML 文件创建一个网络
net-define define an inactive persistent virtual network or modify an existing persistent one from an XML file
net-destroy 销毁(停止)网络
net-dhcp-leases print lease info for a given network
net-dumpxml XML 中的网络信息
net-edit 为网络编辑 XML 配置
net-event Network Events
net-info 网络信息
net-list 列出网络
net-name 把一个网络UUID 转换为网络名
net-start 开始一个(以前定义的)不活跃的网络
net-undefine undefine a persistent network
net-update 更新现有网络配置的部分
net-uuid 把一个网络名转换为网络UUID
net-port-list list network ports
net-port-create create a network port from an XML file
net-port-dumpxml network port information in XML
net-port-delete delete the specified network port
3. 了解KVM的默认网络
下面通过网桥管理命令查看现有的网桥情况,KVM默认的网络模式是NAT,让虚拟机访问主机、互联网或本地网络上的资源的简单方法,但是不能从网络或其他的客户机访问客户机。
在libvirt目录中能看到网络配置的详细情况。
通过ifconfig -a看到这个网络内的详细信息,在1.1里面的图中,virbr0还充当着dhcp、dns、网关的角色,所以它是需要有IP的。
Tips:virbr0是由宿主机虚拟机支持模块安装时产生的虚拟网络接口,也是一个switch和bridge,负责把内容分发到各虚拟机。
如何理解呢?通过NAT方式与外面相通,在虚拟机层面会有一个虚拟网卡eth0,此时这个虚拟网卡eth0实则对应的就是宿主机的vnet0网卡。virbr0充当虚拟交换机,同时virbr0-nic是一个桥接器,相当于接收此NAT网络下的所有流量(从1.1的图可以看出)。从下图可以看出,虚拟接口和物理接口之间没有连接关系。
那数据是如何到达外网的呢?
1.首先需要开启ipv4转发功能
2.数据从虚拟机虚拟网卡vnet经过虚拟交换机virbr0与virbr0-nic的网桥通道
3.然后再经iptable进行处理从宿主机网卡转发出去
下面是iptables的策略
宿主机的路由表信息,宿主机的默认路由走的eth1(我的环境是eth1可以访问外网)
那么从虚拟机进行一个ping外网看看是如何,数据包的目的地址114.114.114.114得走默认路由,同时iptables有相关转发策略,那么宿主机会对数据包进行解封装,将源地址替换为eth1的ip地址,实现虚拟机与外网通信。那么外网回包到宿主机再经iptables进行处理后匹配路由规则就能转发到响应的网桥通道,到达相应的虚拟网卡(也就是虚拟机里面啦)
4. 创建基于NAT的网络
从libvirt中复制一份网络配置,进行修改。主要修改bridge name,ip、dhcp范围和删除uuid、mac。
将网络配置的xml文件通过virsh net-define进行加载到libvirt中,再启动网络池和设置自启动。
下面通过在线添加虚拟网卡看看
查看虚拟机的网卡信息
已经看到有两个网卡,同时禁用第一张网卡进行ping测试,确保是从新添加的网卡出去。
卸载网卡
5. 创建基于桥接(网桥)的网络
先看看桥接网络的基本原理,Bridge方式即虚拟网桥的网络连接方式,桥接网络(也叫物理设备共享)被用作把一个物理设备复制到一台虚拟机。
首先确定哪张网卡要用来做桥接,比如说用宿主机的eth0做桥接。那么下面需要先备份网卡配置文件,然后再进行修改。
[root@localhost ~]# cd /etc/sysconfig/network-scripts/
[root@localhost network-scripts]# cp ifcfg-eth0 ifcfg-eth0.bak
[root@localhost network-scripts]# vim ifcfg-eth0
[root@localhost network-scripts]# vim ifcfg-br0
#此配置就是将eth0桥接到br0
[root@localhost network-scripts]# cat ifcfg-eth0
DEVICE=eth0
ONBOOT=yes
BRIDGE=br0
#br0网卡的配置
[root@localhost network-scripts]# cat ifcfg-br0
DEVICE=br0
ONBOOT=yes
TYPE=Bridge
BOOTPROTO=static
IPADDR=192.168.15.15
NETMASK=255.255.255.0
GATEWAY=192.168.15.2
STP="on"
DELAY="0.0"
#检查好后进行重启网络
[root@localhost network-scripts]# systemctl restart network
查看网卡信息
下面通过virsh添加网络
查看window7虚拟机,是有新的网卡,由于我vmware没有开启该网络dhcp分配,所以虚拟机获取不了IP,手工改一下,然后从物理机ping到虚拟机里面,实现物理机与vmware的KVM虚拟机中的window7虚拟机互通。
成功互通,实则KVM主机中的window虚拟机网络桥接在KVM主机eth0上,但KVM主机的eth0是vmware中的虚拟网络,我物理机自然也有vmware的虚拟网络,这样实现的互通。
6. 创建基于用户自定义的隔离网络
这个网络就比较好理解,只有在同一个虚拟网络中才能进行互通。下面继续编辑网络xml文件,然后进行添加虚拟网络。
[root@localhost ~]# cd /etc/libvirt/qemu/networks/
[root@localhost networks]# cat isolation.xml
<network>
<name>isolation</name>
<bridge name='virbr2' stp='on' delay='0'/>
<domain name='isolation'/>
<ip address='172.16.1.1' netmask='255.255.255.0'>
<dhcp>
<range start='172.16.1.128' end='172.16.1.254'/>
</dhcp>
</ip>
</network>
#如果不需要dhcp,直接下面配置即可。
<network>
<name>isolation</name>
<bridge name='virbr2' stp='on' delay='0'/>
<domain name='isolation'/>
</network>
通过virsh进行添加虚拟网络并启动和设置自启动。
下面通过一台linux和window虚拟机连接在isolation这个虚拟网络上。