KVM学习笔记(虚拟网络,网桥、虚拟机网卡、网卡绑定、VLAN、网络过滤)

1、qemu-kvm支持的网络

虚拟机的网络模式
  • 基于NAT的虚拟网络(默认的模式)
  • 基于网桥(bridge)的虚拟网络
  • 用户自定义的隔离的网络
  • 直接分配的网络设备(包括VT-d和SR-IOV)
KVM中virbr是虚拟网桥设备,默认会创建virbr0
在/etc/libvirt/qemu/networks/目录下有虚拟网络的配置文件
/etc/libvirt/qemu/networks/autostart目录下是软链接,软链接链接的网络会自动启动
virsh net-list可以列出所有虚拟网络,virsh net-info可以查看虚拟网络粗略信息

网桥控制命令brctl
brctl show 列出所有网桥的信息,virbr0-nic是网桥的虚拟网卡,vnet0是虚拟机的网卡,第一个启动的虚拟机时vnet0,第二个是vnet1以此类推。
网桥可以做DHCP Server给虚拟机分配IP地址,使用NAT功能时,NAT的功能在IPtables上实现。IPtables的NAT规则是在libvirt启动时自动添加的。

2、虚拟机网卡相关命令

通过xml文件来添加网卡
virsh attach-device <domain> <xml file>
直接通过命令行添加
virsh attach-interface <domain> <type> <source>
参数解释
domain 虚拟机名字
type 接口的类型,网卡是'network'
source 连接到哪个虚拟网络,'default'是NAT模式的网络
查看虚拟机网卡信息
virsh domiflist <domain>
查看虚拟机网卡IP地址
virsh domifaddr <domain>
查看虚拟机网卡状态
virsh domifstat <domain> <interface>

3、桥接连接模式

网桥是通过模块bridge来生成的
检查是否安装了bridge模块
modprobe --first-time bridge
编辑网桥配置文件ifcfg-br1,TYPE为Bridge
编辑网桥的上行接口配置文件ifcfg-ens33,KVM中网桥的成员接口类型为slave接口
brctl show
更改虚拟机网卡连接

4、配置网卡绑定

bonding的七种工作模式: 
bonding技术提供了七种工作模式,在使用的时候需要指定一种,每种有各自的优缺点.
  1. balance-rr (mode=0)       默认, 有高可用 (容错) 和负载均衡的功能,  需要交换机的配置,每块网卡轮询发包 (流量分发比较均衡).
  2. active-backup (mode=1)  只有高可用 (容错) 功能, 不需要交换机配置, 这种模式只有一块网卡工作, 对外只有一个mac地址。缺点是端口利用率比较低
  3. balance-xor (mode=2)     不常用
  4. broadcast (mode=3)        不常用
  5. 802.3ad (mode=4)          IEEE 802.3ad 动态链路聚合,需要交换机配置
  6. balance-tlb (mode=5)      不常用
  7. balance-alb (mode=6)     有高可用 ( 容错 )和负载均衡的功能,不需要交换机配置  (流量分发到每个接口不是特别均衡)。
配置部分
加载bonding模块
modprobe bonding
在/etc/sysconfig/network-scripts/文件夹下创建bond配置文件,下图是将bond0添加到网桥virbr1的场景。
bond中接口的配置文件
重启网络服务后,查看bond的状态
cat /proc/net/bonding/bond0 

5、VLAN配置

KVM下的VLAN配置。
基于物理机上行口创建VLAN子接口,本例中为VLAN11和VLAN12,在物理机中创建不同的Linux Bridge,不同的Bridge插入不同的VLAN接口作为上行接口。
创建VLAN子接口,开启接口收发VLAN功能。
配置文件的命名格式为物理接口.VLAN ID的格式(如:ifcfg-ens36.11),需要多少个VLAN就配置多少个VLAN子接口文件,详细配置文件如下:
将VLAN子接口插入到virbr1上,Bridge 上的其他网络设备自动加入到 VLAN中。
Linux Bridge无需特殊配置
将虚机连接到Linux Bridge上就能接入VLAN
虚机可以ping通VLAN接口地址。

6、网络过滤nwfilter配置

KVM可以使用network filter来设置虚拟机的网络过滤规则
使用virsh nwfilter命令类来进行配置,nwfilter底层是基于Linux的ebtables来进行实现的。
nwfilter-list 列出目前已有规则。
nwfilter语法示例:
参数解释:

chain

chain有几种值可以选择
  • root
  • mac
  • stp
  • vlan
  • arp、rarp
  • ipv4
  • ipv6
rule需要挂载到一个chain上,既可以是root,也可以是其他chain。其他chain是挂载到root上的。

priority

chain和rule都有priority属性,数字越小越优先。
  • rule靠优先级与同一chain上的其他rule做排序。
  • 非root的chain靠优先级与其他chain做排序。
  • root上的rule和chain是并列关系,靠优先级做混合排序。

uuid

唯一的,由libvirt自动生成,不需要关注。

rule

action
必选项。可以选择以下几种:
  • drop
    直接丢弃数据包。
  • reject
    丢弃数据包并生成一个ICMP消息。
  • accept
    接收该数据包并跳过其他所有chain和rule。
  • return
    跳过当前chain上的其他过滤器,并返回到root上继续检查后续chain或rule。如果当前位于root,则接收该数据包。
  • continue
    不产生影响,可以用于计数。
direction
必选项。可以选择以下几种:
  • in
    进入虚拟机的数据包。
  • out
    虚拟机发出的数据包。
  • inout
    双向数据包。
priority
rule的优先级。

filterref

该元素代表了对另一个nwfilter的引用。其中只有一个属性filter,值为引用的另一个nwfilter的name。被引用的nwfilter中rule所属的chain不做变动,与引用者的chain无关。
例子:
  • 防止虚拟机进行MAC、IP和ARP欺骗
  • 仅打开TCP 22、80端口
  • 仅允许虚拟机向外ping,但不允许其他机器ping虚拟机
  • 允许DNS解析
将自定义的nwfilter添加到KVM中
virsh nwfilter-define <file>
如果需要编辑已经导入的nwfilter,使用nwfilter-edit <nwfilter>来在线编辑。编辑后及时生效。

7、给虚拟机添加nwfilter

更新虚拟机配置文件XML文件中interface字段,可以自己写一个只包含interface字段的xml文件,如下图。
使用命令update-device来更新虚拟机配置
virsh update-device <domain> <file> [--persistent] [--config] [--live] [--current] [--force]
如果需要编辑虚拟机的配置,使用virsh edit <domain> 来在线编辑。编辑后及时生效。

评论

热门博文