使用libvirt的networkfilter对网络进行过滤

功能简介

Network filtering XML为虚拟化系统管理员提供对了一种网络流量的过滤规则,系统管理员可以通过配置过滤参数,实施和管理对虚拟机网络流量的接受和转发。由于过滤规则不能绕过直接进入虚拟机内,它使得一个filter对虚拟用户的访问控制具有强制性。 Network filtering子系统允许每一个虚拟机的网络过滤表可以被单独配置。我们可以在启动时配置虚拟机的访问控制过滤表,也可以在虚拟器运行时对虚拟机的规则进行修改。后者可以通过修改network filter XML的方式进行。 Libvirt允许多台虚拟机共用一个。当filter被修改时,所有运行的虚拟机都会自动更新filter的过滤规则。Network filtering XML部署在KVM Server上可以实现:虚拟网络隔离、入侵防护、批量管理等功能。Openstack的网络控制就是基于Network filter。

配置解析

Network filter作用于个别网卡之中,它内定义在虚拟机的XML中,需要做哪些过滤就将过滤表的名字加到相应网卡的配置文件中。例如,我门对桥接到“br1”上的网卡做过滤,过滤表为“limit”,配置如下:

<interface type='bridge'>
    <mac address='52:54:00:24:4c:ee'/>
    <source bridge='br1'/>
    <model type='virtio'/>
    <filterref filter='limit'/>
</interface>

官方提供的资料指出,filter 支持的网络类型:network(NAT),bridge。
Network filters是通过XML完成参数的配置的,而且还可以和其他的filter搭配组合使用;当做模块调用被其他filter调用。之后会做具体介绍。
KVM Server本身自带了许多filter,我们可以像操作虚拟机一样,对filter进行使用。
查看当前系统中的Filters:

[root@localhost nwfilter]# virsh nwfilter-list 
 UUID                                  Name                 
------------------------------------------------------------------
 3f3e2f00-ccb8-44a7-a1ba-8ce5aad28d63  allow-arp           
 456177a2-55f8-4d8d-8739-db6ccf27082e  allow-dhcp          
 deef433c-e9e8-42fc-9aed-bffeb16938a3  allow-dhcp-server   
 2b62107a-ad6b-4151-995d-cc0392ecb48b  allow-incoming-ipv4 
 e33feac5-1a5e-4862-8bc2-52cdfcc863e5  allow-ipv4          
 4ef7bae1-bc5a-4162-a248-ff262239c7ef  clean-traffic       
 fce8ae34-e69e-83bf-262e-30786c1f8073  limit-internet      
 2e633b9d-fd7f-4161-954c-2f99a7055480  no-arp-ip-spoofing  
 bd85f81d-493c-4a0f-9874-f65a4bcbc268  no-arp-mac-spoofing 
 851f0aca-8f30-4e28-83c5-9ed2e1856e32  no-arp-spoofing     
 b8e573ac-1310-4b63-b54d-f992c6dd4c05  no-ip-multicast     
 17c5d152-db6d-446f-9c9f-dae1cac1e38d  no-ip-spoofing      
 bc5893bb-45ea-4e11-9d01-9668bf987e5d  no-mac-broadcast    
 e1f413a3-0e15-43b8-a4d9-41768b8ab3ea  no-mac-spoofing     
 a3b73d23-6a10-45cb-a911-5244182d2e82  no-other-l2-traffic 
 eed2e6bd-aa38-4cca-b808-68190712ca1c  no-other-rarp-traffic
 c9da951e-323d-4623-ac71-9a6d40108b67  qemu-announce-self  
 b48fe827-6453-4916-a8da-bcf2f044b6e1  qemu-announce-self-rarp

注:其中只有limit-internet为自己定义的,其他为KVM Server自动定制生成的。

FILTER字段分析

查看具体的某一条Filters:

<filter name='limit' chain='root'>
    <uuid>1c3384c7-093a-5689-2cf3-320ef716ba2e</uuid>
    <rule action='accept' direction='inout' priority='400'>
        <icmp connlimit-above='2'/>
    </rule>
    <rule action='accept' direction='inout' priority='500'>
        <tcp/>
    </rule>
    <filterref filter='clean-traffic'/>
    <rule action='drop' direction='inout' priority='1000'>
        <all/>
    </rule>
</filter>

第一个字段定义filter的name,唯一。(官方建议:许多filter的名字是以chains的名字做前缀的。)

<filter name='limit' chain='root'>

Chain类型:

所有过滤规则都被组织到一个过滤链中,这些过滤链是具有树结构和包过滤规则的记录的合集。一个数据包经过这些过滤链,被选择进入虚拟机或是被DROP。每条链都有不同的优先级,不过root链的优先级最高,所有的数据包必须先要经过root链后,才可能继续到其他过滤过则中匹配。
目前已经存在的链:
• root
• mac (since 0.9.8)
• stp (spanning tree protocol) (since 0.9.8)
• vlan (802.1Q) (since 0.9.8)
• arp, rarp
• ipv4
• ipv6
priority优先级的设定:所有的链都被连接到root链中。目的为了让链的访问顺序可以被优先级影响。下边是官方提供的默认优先级:
Chain (prefix) Default priority
stp -810
mac -800
vlan -750
ipv4 -700
ipv6 -600
arp -500
rarp -400
优先级的值越小,优先级别越高。用户可以定义自己的优先级数值,取值范围在[-1000,1000]。

UUID:

<uuid>1c3384c7-093a-5689-2cf3-320ef716ba2e</uuid>

Filter的编号,系统自动添加,唯一。

Rule实例:

<rule action='accept' direction='inout' priority='500'>
    <tcp/>
</rule>

规则实例分析:
与iptables相同,在rule中也指定了匹配动作、数据包方向、优先级以及匹配过则。以上面rule为例
- action:匹配后的动作,可选动作:accept、drop、reject
- Direction:数据包走向,可选方向:in、out、inout
- Priority:优先级,指定了在一条链中的不规则的匹配顺序。数值越小,优先级越高。
第二行为匹配的规则,可以指定协议类型,IP地址,或其他。
以上规则的意思是:所有tcp协议的数据包通过。

<filterref filter='clean-traffic'/>

以上表示引入clean-traffic的控制规则。

<rule action='drop' direction='inout' priority='1000'>
    <all/>
</rule>

最后一条的优先级为1000,优先级最低,作为所有匹配不到的数据包的默认规则。

常用配置命令

  • virsh nwfilter-define
    后面加上一个xml文件,从一个XML文件中定义或者更新一个网络过滤规则。
  • virsh nwfilter-dumpxml
    后面加上某个网络过滤规则的名称,查看一个网络规则的XML详细信息。
  • virsh nwfilter-edit
    后面加上某个网络过滤规则的名称,编辑一个网络规则。
  • virsh nwfilter-list
    列出所有定义成功的网络过滤规则。
  • virsh nwfilter-undefine
    后面加上一个网络过滤规则的名称,须消该网络过滤规则。
    注意:定义网络过滤规则可以无视客户机的状态,并且可以及时生效,即使在客户机活跃的情况下。

遇到的问题

[root@localhost python]# virsh nwfilter-list 
error: failed to connect to the hypervisor
error: no valid connection
error: Failed to connect socket to '/usr/local/var/run/libvirt/libvirt-sock': No such file or directory

解决方法:
增加软链接

[root@localhost python]# find / -name libvirt-sock
/run/libvirt/libvirt-sock
[root@localhost python]# ln -s /run/libvirt/libvirt-sock /usr/local/var/run/libvirt/libvirt-sock
[root@localhost python]# virsh nwfilter-list 
 UUID                                  Name                 
------------------------------------------------------------------
 3f3e2f00-ccb8-44a7-a1ba-8ce5aad28d63  allow-arp           
 456177a2-55f8-4d8d-8739-db6ccf27082e  allow-dhcp          
 deef433c-e9e8-42fc-9aed-bffeb16938a3  allow-dhcp-server   
 2b62107a-ad6b-4151-995d-cc0392ecb48b  allow-incoming-ipv4 
 e33feac5-1a5e-4862-8bc2-52cdfcc863e5  allow-ipv4          
 4ef7bae1-bc5a-4162-a248-ff262239c7ef  clean-traffic       
 2e633b9d-fd7f-4161-954c-2f99a7055480  no-arp-ip-spoofing  
 bd85f81d-493c-4a0f-9874-f65a4bcbc268  no-arp-mac-spoofing 
 851f0aca-8f30-4e28-83c5-9ed2e1856e32  no-arp-spoofing     
 b8e573ac-1310-4b63-b54d-f992c6dd4c05  no-ip-multicast     
 17c5d152-db6d-446f-9c9f-dae1cac1e38d  no-ip-spoofing      
 bc5893bb-45ea-4e11-9d01-9668bf987e5d  no-mac-broadcast    
 e1f413a3-0e15-43b8-a4d9-41768b8ab3ea  no-mac-spoofing     
 a3b73d23-6a10-45cb-a911-5244182d2e82  no-other-l2-traffic 
 eed2e6bd-aa38-4cca-b808-68190712ca1c  no-other-rarp-traffic
 c9da951e-323d-4623-ac71-9a6d40108b67  qemu-announce-self  
 b48fe827-6453-4916-a8da-bcf2f044b6e1  qemu-announce-self-rarp

Network filters是通过XML完成参数的配置的,而且还可以和其他的filter搭配组合使用;当做模块调用被其他filter调用。KVM Server本身自带了许多filter,我们可以像操作虚拟机一样,对filter进行使用。系统自带的filters的目录是:

/etc/libvirt/nwfilter

配置实例

虚拟机初始状态可以正常访问外网。

[root@localhost ~]# ping baidu.com
PING baidu.com (123.125.114.144) 56(84) bytes of data.
64 bytes from 123.125.114.144 (123.125.114.144): icmp_seq=1 ttl=51 time=7.23 ms
64 bytes from 123.125.114.144 (123.125.114.144): icmp_seq=2 ttl=51 time=7.30 ms
64 bytes from 123.125.114.144 (123.125.114.144): icmp_seq=3 ttl=51 time=7.57 ms
^C
--- baidu.com ping statistics ---
3 packets transmitted, 3 received, 0% packet loss, time 2001ms
rtt min/avg/max/mdev = 7.238/7.372/7.576/0.146 ms

在虚拟机上面配置一个限制上外网的实例:

1、 定义netfilter

 virsh nwfilter-define limit-internet.xml 

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> 

2、 virsh nwfilter-list查看启动的filters

[root@localhost nwfilter]# virsh nwfilter-list 
 UUID Name ----------------------------------------------------------
 3f3e2f00-ccb8-44a7-a1ba-8ce5aad28d63 allow-arp 
 456177a2-55f8-4d8d-8739-db6ccf27082e allow-dhcp 
 deef433c-e9e8-42fc-9aed-bffeb16938a3 allow-dhcp-server 
 2b62107a-ad6b-4151-995d-cc0392ecb48b allow-incoming-ipv4 
 e33feac5-1a5e-4862-8bc2-52cdfcc863e5 allow-ipv4 
 4ef7bae1-bc5a-4162-a248-ff262239c7ef clean-traffic 
 fce8ae34-e69e-83bf-262e-30786c1f8073 limit-internet 
………  

3、 在虚拟机xml文件中添加 netfilter 名字 limit-internet ,启动虚拟机,此时虚拟机无法访问外网,只能通过vnc连接

<interface type='bridge'>
      <mac address='52:54:00:31:f5:96'/>
      <source bridge='br0'/>
      <model type='rtl8139'/>
      <filterref filter='limit-internet'/>
      <address type='pci' domain='0x0000' bus='0x00' slot='0x03' function='0x0'/>
</interface>

4、 创建另外一个xml文件,重新定义netfilter ,虚拟机外网访问立即恢复正常

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

参考

http://libvirt.org/firewall.html
http://libvirt.org/formatnwfilter.html#nwfwrite
https://my.oschina.net/amoshuang/blog/89439?p=1
http://blog.csdn.net/lipei1220/article/details/50673018

你可能感兴趣的:(虚拟机,filter,kvm)