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>
进阶配置
对于已经运行的虚拟机,我们可以通过在线修改filter的配置来调整虚拟机的访问控制。但前提是,虚拟机的xml配置文件已经指定网卡的匹配过滤表。
[root@admin ~]# virsh nwfilter-edit limit
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
假设一个虚拟机只允许一个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>
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>
(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>
(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的各种参数与访问控制。
来源:oschina
链接:https://my.oschina.net/u/158822/blog/89439