1.1 Network Filters介绍
Network filtering XML为虚拟化系统管理员提供了一种网络流量的过滤规则,系统管理员可以通过配置过滤参数实施和管理对虚拟机网络流量的接受和转发,由于过滤规则不能绕过直接进入虚拟机内,使得一个filter对虚拟用户的访问控制具有强制性。
Network filtering 子系统允许每一个虚拟机的网络过滤表可以被单独配置,我们可以在启动时配置虚拟机的访问控制过滤表,也可以在虚拟器运行时对虚拟机的规则进行修改,后者可以通过修改network filter XML的方式进行。
Libvirt 允许多台虚拟机共用一个,当filter被修改时所有运行的虚拟机都会自动更新filter的过滤规则。
Network filtering XML部署在KVM Server上可以实现:虚拟网络隔离、入侵防护、批量管理等功能,Openstack的网络控制就是基于Networkl filter。
1.2 实现原理
chain类型:所有过滤规则都被组织到一个过滤链中,数据包经过这些过滤链被选择进入虚拟机或是DROP掉,链都有不同的优先级,root链的优先级最高。所有的数据包必须先经过root链后才可能继续到其他过滤规则中匹配。
priority优先级的设定:所有链都被连接到root链中,优先级的值越小,优先级越高,用户可以定义自己的优先级数值,取值范围(100,1000)下边是官方提供的默认优先级:
1.3 过滤规则语法
1.3.1 示例规则
[root@KVM ~]# virsh nwfilter-dumpxml no-ip-spoofing
f1f35512-7ef2-46f9-8c29-2b59f2905d69
1.3.2 filte字段
name:唯一,指定filter的名称,后面引用时使用
chain:指定链类型,目前已经存在的链有:
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:指定优先级
uuid:唯一值
rule:指定规则具体内容
1.3.3 rule规则
action:必选项,指定动作:drop,reject,accept,return,continue
direction:必选项,传入:in,传出:out,传入和传出:inout
priority:可选项,优先级
statematch:可选的,默认是true,即开启匹配的底层连接状态,0或false关闭
内容:根据选择的链不同,使用不同的参数规则匹配,具体参见官方文档
1.4 相关命令
1.4.1 查看过滤规则
[root@KVM ~]# virsh nwfilter-list
UUID Name
------------------------------------------------------------------
efd8cd06-e22d-4916-92cb-2f40e4dcbe22 allow-arp
bc4e01e3-c972-4bf7-b380-c261138d142d allow-dhcp
25392b41-bda1-47c5-9473-8c0f6f2711c9 allow-dhcp-server
b7d7f239-ed03-4810-bb29-ad1877ef2487 allow-incoming-ipv4
fd4b35db-23ad-46c2-8fc4-0b883cdc3d7f allow-ipv4
eb60ceeb-ffbb-413d-ac35-291fab167484 clean-traffic
ba723fc5-970b-404e-997a-3fd186af4a1a clean-traffic-gateway
cdbcdf81-9e2b-4480-861b-6b1577e57546 no-arp-ip-spoofing
010f7cfd-c8e9-4ace-8841-436428b03ada no-arp-mac-spoofing
c9fb871f-23e2-4358-96ec-c287a4b5c50d no-arp-spoofing
97cf25e0-6d2a-498e-9c8a-dfffeec5b88e no-ip-multicast
f1f35512-7ef2-46f9-8c29-2b59f2905d69 no-ip-spoofing
67154bef-f80e-4889-9288-c2a68972d244 no-mac-broadcast
d4a91993-299b-460f-a094-5194d5ed4071 no-mac-spoofing
eacd541b-6e64-477f-bfe2-8e6ec815fea1 no-other-l2-traffic
1b2bf173-2d26-45eb-bf93-a2bd808c88ad no-other-rarp-traffic
26efad9c-d18b-490d-aeba-9b8df5e9aaa4 qemu-announce-self
f89283ba-4fc0-4682-a200-77ad87a0be8c qemu-announce-self-rarp
1.4.2 定义过滤规则
[root@KVM ~]# virsh nwfilter-define 规则名称
1.4.3 编辑过滤规则
[root@KVM ~]# virsh nwfilter-edit 规则名称
1.4.4 查看规则具体内容
[root@KVM ~]# virsh nwfilter-dumpxml 规则名称
1.4.5 删除过滤规则
[root@KVM ~]# virsh nwfilter-undefine 规则名称
1.4.6 查看系统有没有生效的规则
[root@KVM ~]# ebtables -t nat -L
1.4.7 使规则立即生效
[root@KVM ~]# virsh update-device 虚拟机名称 规则名称
1.5 编写自己的过滤规则(禁止tpot访问局域网其他服务器)
1.5.1 编写规则文件
[root@KVM ~]# vim /etc/libvirt/nwfilter/tpot.xml
a37a0fc1-2926-4f83-beb9-681d942f7027
【规则说明】:
name='tpot':规则名称为tpot
chain='ipv4':使用ipv4链进行过滤
action='drop' direction='out':出方向禁止规则
match='yes':匹配时执行action过滤规则;或者设置为no,不匹配时执行action
dstipaddr='$IP:目标IP地址,匹配地址为参数形式,后面在引用的时候定义
dstipmask='255.255.255.0':目标IP子网掩码
提示:KVM过滤规则默认保存位置:/etc/libvirt/nwfilter/
1.5.2 定义规则
[root@KVM ~]# virsh nwfilter-define /etc/libvirt/nwfilter/tpot.xml
1.5.3 引用规则
[root@KVM ~]# virsh edit Debian-Tpot
1.5.4 启动虚拟机
[root@KVM ~]# virsh start Debian-Tpot
1.5.5 *查看定义后的过滤规则
[root@KVM ~]# virsh nwfilter-dumpxml tpot
a37a0fc1-2926-4f83-beb9-681d942f7027
1.5.6 *查看生效规则
[root@KVM ~]# ebtables -t nat -L
Bridge table: nat
Bridge chain: PREROUTING, entries: 1, policy: ACCEPT
-i vnet35 -j libvirt-I-vnet35
Bridge chain: OUTPUT, entries: 0, policy: ACCEPT
Bridge chain: POSTROUTING, entries: 0, policy: ACCEPT
Bridge chain: libvirt-I-vnet35, entries: 1, policy: ACCEPT
-p IPv4 -j I-vnet35-ipv4
Bridge chain: I-vnet35-ipv4, entries: 3, policy: ACCEPT
-p IPv4 --ip-dst 192.168.1.0/24 -j DROP
1.6 参考资料