基于network filter的 虚拟机访问控制

功能介绍
Network filtering XML为虚拟化系统管理员提供对了一种网络流量的过滤规则,系统管理员可以通过配置过滤参数,实施和管理对虚拟机网络流量的接受和转发。由于过滤规则不能绕过直接进入虚拟机内,它使得一个filter对虚拟用户的访问控制具有强制性。官方wiki链接 Network filter
Network filtering 子系统允许每一个虚拟机的网络过滤表可以被单独配置。我们可以在启动时配置虚拟机的访问控制过滤表,也可以在虚拟器运行时对虚拟机的规则进行修改。后者可以通过修改network filter XML的方式进行。
Libvirt 允许多台虚拟机共用一个。当filter被修改时,所有运行的虚拟机都会自动更新filter的过滤规则。
Network filtering XML部署在KVM Server上可以实现:虚拟网络隔离、入侵防护、批量管理等功能。Openstack的网络控制就是基于Networkl 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@admin ~]# virsh nwfilter-list
UUID                                  Name                 
----------------------------------------------------------------
f982fac6-52ea-6652-36cb-75a680cb0713  allow-arp           
fb376146-7a1c-80f7-2c28-24188ffe6bf1  allow-dhcp          
c4c39d04-5c85-e79f-dbb1-e233d849dae4  allow-dhcp-server   
d9946a8b-f6e4-a643-9be7-4d429963097f  allow-incoming-ipv4 
f46e4705-2eb3-fd53-cc1c-9863bc39a334  allow-ipv4          
93dce802-0ae4-2339-aa50-16a0bb134e17  clean-traffic       
1c3384c7-093a-5689-2cf3-320ef716ba2e   limit 
  ...
注:其中只有limit为自己定义的,其他为KVM Server自动定制生成的
查看具体的某一条Filters:

[root@admin ~]# virsh nwfilter-dumpxml limit

<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 进行edit、define、undefine。

对于Filtering 的配置,我们以之前提到的limit过滤表做例子,来分析Filter的书写和参数的简单实用。

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


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

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>1c3384c7-093a-5689-2cf3-320ef716ba2e</uuid>

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

<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,优先级最低,作为所有匹配不到的数据包的默认规则。

进阶配置

对于已经运行的虚拟机,我们可以通过在线修改filter的配置来调整虚拟机的访问控制。但前提是,虚拟机的xml配置文件已经指定网卡的匹配过滤表。

[root@admin ~]# virsh nwfilter-edit limit


进入到一个vi衍生的编辑器中,修改limit的xml文件,在保存时,系统会自动校验修改后的文件是否准确,如果出现错误将不会修改xml文件。
1        连接追踪(connection tracking)
网路过滤系统是使用iptables的连接追踪支持的。它可以强制的指定网络数据流的方向,也可以统计链接数并限制进入虚拟机的并发连接数。

编辑一个限制端口25号的filter:

cat > limit <<EOF
<filter name='limit' chain='root'>
  <rule action='drop' direction='out' priority='500'>
    <tcp dstportstart='25' dstportend='25'/>
  </rule>
</filter>
EOF
virsh nwfilter-define limit              #定义limit  过滤表
virsh nwfilter-list                         #查看所有的filter


2        连接数限制(Limiting Number of Connections)

假设一个虚拟机只允许一个IP在同一之间发起一个ping链接。防止某个IP对虚拟机恶意攻击。

<rule action='drop' direction='out' priority='400'>
    <icmp connlimit-above='1'/>
</rule>
<rule action='accept' direction='out' priority='500'>
    <icmp/>
</rule>
<rule action='drop' direction='inout' priority='1000'>
    <all/>
</rule>


注释:这个规则的“限制”在逻辑上必须出现在“允许”前,即相同的匹配类型,drop的优先级要高于accetp!
3        使用DHCP服务

在virsh nwfilter-list 的列表中,有一个filter:allow-dhcp-server

[root@admin ~]# virsh nwfilter-dumpxml allow-dhcp-server
<filter name='allow-dhcp-server' chain='ipv4' priority='-700'>
  <uuid>c4c39d04-5c85-e79f-dbb1-e233d849dae4</uuid>
  <rule action='accept' direction='out' priority='100'>
    <ip srcipaddr='0.0.0.0' dstipaddr='255.255.255.255' protocol='udp' srcportstart='68' dstportstart='67'/>
  </rule>
  <rule action='accept' direction='in' priority='100'>
    <ip srcipaddr='$DHCPSERVER' protocol='udp' srcportstart='67' dstportstart='68'/>
  </rule>
</filter>


我们可以在VMs的xml中直接使用这个filter,也可以定制VM自己的filter,然后调用allow-dhcp-server。
(1)        直接使用

与之前提到的一样,在VM的xml中加入filter就可以。

<interface type='bridge'>
    <mac address='52:54:00:24:4c:ee'/>
    <source bridge='br1'/>
    <model type='virtio'/>
    <filterref filter='allow-dhcp-server'>
        <parameter name="IP" value="192.168.0.100" />
        <parameter name="DHCPSERVER" value="192.168.0.1" />
    </filterref>
</interface>


在配置文件中指定DHCP-SERVER及请求分配的IP地址。
(2)        定义VM私有的filter

假设我们的虚拟机的name为vm000001,在vm00001的xml中网卡配置部分添加如下代码

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

创建vm000001的filter

cat > vm000001 <<EOF
<filter name='vm000001' chain='root'>
  <filterref filter='allow-dhcp-server'>
    <parameter name="IP" value="192.168.0.100" />
    <parameter name="DHCPSERVER" value="192.168.0.1" />
  </filterref>
</filter>
EOF
virsh nwfinter-define vm000001
virsh nwfinter-dumpxml vm000001

推荐后一种,因为更加灵活,可以在虚拟机启动时更改filter的各种参数与访问控制。

转载于:https://my.oschina.net/amoshuang/blog/89439

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值