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调用。之后会做具体介绍。[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类型:Filter的编号,系统自动添加,唯一。
<rule action='accept' direction='inout' priority='500'> <tcp/> </rule>
以上规则的意思是:所有tcp协议的数据包通过。
<filterref filter='clean-traffic'/>
引入clean-traffic的控制规则
<rule action='drop' direction='inout' priority='1000'> <all/> </rule>
对于已经运行的虚拟机,我们可以通过在线修改filter的配置来调整虚拟机的访问控制。但前提是,虚拟机的xml配置文件已经指定网卡的匹配过滤表。
[root@admin ~]# virsh nwfilter-edit limit
编辑一个限制端口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>
在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>
与之前提到的一样,在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>
假设我们的虚拟机的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的各种参数与访问控制。