KVM实战之(七)网络流量过滤Network filtering

网络过滤(Network filtering)
       官方链接是:http://libvirt.org/formatnwfilter.html
什么是网络过滤


#第一:通过ebtable引擎来实现	(解释:eb表示以太网网桥)
#第二:是一种网络流量的过滤规则,管理对虚拟机网络流量的接受和转发
#第三:由于虚拟机不能控制过滤规则,所以对虚拟机的访问控制具有强制性(因为其规则实在kvm物理机的内存里生效的)
#第四:通过xml文件存储配置,libvirt动态调整ebtable配置
#第五:可以针对特定虚拟机进行配置,也可以对多个虚拟机进行共享配置

       通俗的将就是:Network filtering 子系统允许每一个虚拟机的网络过滤表可以被单独配置。我们可以在启动时配置虚拟机的访问控制过滤表,也可以在虚拟器运行时对虚拟机的规则进行修改。后者可以通过修改network filter XML的方式进行。
       Libvirt 允许多台虚拟机共用一个。当filter被修改时,所有运行的虚拟机都会自动更新filter的过滤规则。
       Network filtering XML部署在KVM Server上可以实现:虚拟网络隔离、入侵防护、批量管理等功能。OpenStack的网络控制就是基于Networkl filter。
应用场景
比如,一台kvm物理机上面跑了很多虚拟机,有个一客户在虚拟机上做了一些操作,比如练习dhcp,或则做网络嗅探等,都是服务商不愿看到的,得制止

如何实现过滤

	#chain类型
		所有过滤规则都被组织到一个过滤链中
		数据包经过这些过滤链,被选择进入虚拟机或是DROP掉
		链都有不同的优先级,root链的优先级最高
		所有的数据包必须先经过root链后,才可能继续到其他过滤规则中匹配
		目前已经存在的链有:root,mac,stp,vlan,arp,rarp,ipv4,ipv6

	#priority优先级的设定:
		所有链都被连接到root链中
		优先级的值越小,优先级越高
		用户可以定义自己的优先级数值,取值范围(100,1000)

查看自带的过滤规则


	virsh nwfilter-list

 UUID                                  名称               
------------------------------------------------------------------
 c4ce79c6-6018-44ca-833c-16da8788dc57  allow-arp           
 de3b6b53-86d0-4586-9cae-8abcd1dcbf9c  allow-dhcp          
 b578e058-3feb-4c6b-a747-dcbc6f7df52f  allow-dhcp-server   
 ee283d0d-d7fb-4044-b706-45930c8f34f3  allow-incoming-ipv4 
 645ba047-37e8-4c52-8880-e66006525560  allow-ipv4          
 453bb2f3-a2b5-4e03-b0ef-7eb951e3f783  clean-traffic       
 912acef6-f5e5-47ef-8b74-2c26e1f8c81a  no-arp-ip-spoofing  
 fc485155-6326-412e-b398-7dd6980fcb9a  no-arp-mac-spoofing 
 3e1476e5-8891-4e5c-a3c0-5946ce3b6e89  no-arp-spoofing     
 d02b8fd5-cda4-4f1a-bc2d-d14d706ed192  no-ip-multicast     
 728482c6-94e8-4189-b042-32eb966f19af  no-ip-spoofing      
 ef10054f-90c9-406f-ab94-7da081dd6b9a  no-mac-broadcast    
 212916b8-90e2-4178-a263-14943816b4d7  no-mac-spoofing     
 eceffde5-81cb-4577-88a8-55f8c0838fb2  no-other-l2-traffic 
 639281e2-c9f1-4d12-8d8e-0cccd8ccafe9  no-other-rarp-traffic
 c9c0fd0d-0a97-4d66-872b-70291b9384a8  qemu-announce-self  
 6b4126f6-0c7f-4fea-bf15-4cb7ce88a45b  qemu-announce-self-rarp

查看具体规则下的内容
	virsh nwfilter-dumpxml allow-dhcp	#后面接的是规则名

查看系统有没有生效的规则
	ebtables -t nat -L
	#此时应是没有规则的

创建并编辑一个规则(实现二层拦截)

	mkdir /kvm-netrules
	vim /kvm-netrules/l2-traffic.xml

<interface type='network'>
      <mac address='52:54:00:18:f4:28'/>
      <source network='default'/>
      <model type='virtio'/>
      <address type='pci' domain='0x0000' bus='0x00' slot='0x03' function='0x0'/>
      <filterref filter='no-other-l2-traffic'/>
    </interface>
	#这段的内容取自要定义的虚拟机的xml文件的网络配置,指定加上了“filterref”这句网络过滤规则

在虚拟机kvm-web01上ping网关
	#是通的

在运行的kvm-web01上应用此规则(下面是在 内存中立即生效,关闭后再启动就会失效)

	virsh update-device kvm-web01 /kvm-netrules/l2-traffic.xml
	#可以查看virsh update-device --help的用法
	#virsh update-device kvm-web01 /kvm-netrules/l2-traffic.xml --persistent	这是永久生效

再次检查kvm-web01是否可以ping通网关
	#不通

再次查看系统有没有生效的规则
	ebtables -t nat -L
	#此时就有规则了

网络流量过滤Network filtering基本用法


#首先是libvirt定义网络过滤规则的相关命令:(从一个XML文件中定义或者更新一个网络过滤规则。)
	virsh nwfilter-define ***.xml

#查看一个网络规则的XML详细信息
	virsh nwfilter-dumpxml ***.xml

#编辑一个网络规则
	virsh nwfilter-edit ***.xml

#列出所有定义成功的网络过滤规则
	virsh nwfilter-list

#若是创建了一个规则/root/nftest.xml,立即为虚拟机kvm-web01应用此规则
	virsh update-device kvm-web01 /root/nftest.xml

#取消该网络过滤规则
	virsh nwfilter-undefine

网络流量过滤Network filtering高级用法
自己写一个xml过滤规则,然后定义然后调用


#第一:创建一个存放过滤规则的目录
	mkdir /kvm-net-rules
#第二:创建规则文件
	vim /kvm-net-rules/limit-internet.xml		#此规则用来做限制

    <filter name='limit-internet' chain='ipv4'>  
        <uuid>fce8ae34-e69e-83bf-262e-30786c1f8073</uuid>  
        <rule action='accept' direction='out' priority='100'>  
            <ip protocol='udp' srcportstart='67' srcportend='68' dstportstart='67' dstportend='68'/>  
        </rule>  
        <rule action='accept' direction='in' priority='100'>  
            <ip protocol='udp' srcportstart='67' srcportend='68' dstportstart='67' dstportend='68'/>  
        </rule>  
        <rule action='drop' direction='out' priority='200'>  
            <ip match='no' dstipaddr='$GATEWAYIP' dstipmask='255.255.255.0'/>  
        </rule>  
    </filter> 
-----------------------分割线------------------------------
	vim /kvm-net-rules/limit-internet-no.xml	#此规则用来解除限制

<filter name='limit-internet' chain='ipv4'>  
    <uuid>fce8ae34-e69e-83bf-262e-30786c1f8073</uuid>  
    <rule action='accept' direction='out' priority='100'>  
    </rule>  
</filter> 

#第三:在虚拟机kvm-web01的xml文件中加上过滤规则
	virsh edit kvm-web01

<interface type='network'>
      <mac address='52:54:00:18:f4:28'/>
      <source network='default'/>
      <model type='virtio'/>
      <alias name='net0'>
      <address type='pci' domain='0x0000' bus='0x00' slot='0x03' function='0x0'/>
      <filterref filter='limit-internet'/>	#加上的是这句话
</interface>

#第四:定义limit-internet规则
	virsh nwfilter-define limit-internet.xml 

#第五:启动kvm-web01虚拟机
	virsh start kvm-web01

#第六:通过vnc端口进入虚拟机查看网络联通情况
	发现网络不通

#第七:重新定义limit-internet规则(你会发现第四与第七都在定义同一规则,但是其文件名不一样,内容不一样,但是规则名却一样)
	virsh nwfilter-define limit-internet-no.xml

#第八:检查kvm-web01的网络联通情况
	发现网络正常

思考:如需多个主机都使用同一规则只需将其写入xml中,并进行定义,应用即可

声明:本文为原创,作者为 辣条①号,转载时请保留本声明及附带文章链接:https://boke.wsfnk.com/archives/201.html

最后编辑于:2017/11/14作者: 辣条①号

暂无评论

发表评论

电子邮件地址不会被公开。 必填项已用*标注