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 示例规则
[[email protected] ~]# virsh nwfilter-dumpxml no-ip-spoofing <filter name='no-ip-spoofing' chain='ipv4-ip' priority='-710'> <uuid>f1f35512-7ef2-46f9-8c29-2b59f2905d69</uuid> <rule action='return' direction='out' priority='100'> <ip srcipaddr='0.0.0.0' protocol='udp'/> </rule> <rule action='return' direction='out' priority='500'> <ip srcipaddr='$IP'/> </rule> <rule action='drop' direction='out' priority='1000'/> </filter>
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 查看过滤规则
[[email protected] ~]# 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 定义过滤规则
[[email protected] ~]# virsh nwfilter-define 规则名称
1.4.3 编辑过滤规则
[[email protected] ~]# virsh nwfilter-edit 规则名称
1.4.4 查看规则具体内容
[[email protected] ~]# virsh nwfilter-dumpxml 规则名称
1.4.5 删除过滤规则
[[email protected] ~]# virsh nwfilter-undefine 规则名称
1.4.6 查看系统有没有生效的规则
[[email protected] ~]# ebtables -t nat -L
1.4.7 使规则立即生效
[[email protected] ~]# virsh update-device 虚拟机名称 规则名称
1.5 编写自己的过滤规则(禁止tpot访问局域网其他服务器)
1.5.1 编写规则文件
[[email protected] ~]# vim /etc/libvirt/nwfilter/tpot.xml <filter name='tpot' chain='ipv4' priority='-700'> <uuid>a37a0fc1-2926-4f83-beb9-681d942f7027</uuid> <rule action='drop' direction='out' priority='500'> <ip match='yes' dstipaddr='$IP' dstipmask='255.255.255.0'/> </rule> </filter>
【规则说明】:
- 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 定义规则
[[email protected] ~]# virsh nwfilter-define /etc/libvirt/nwfilter/tpot.xml
1.5.3 引用规则
[[email protected] ~]# virsh edit Debian-Tpot <interface type='bridge'> <mac address='52:54:00:06:c2:ba'/> <source bridge='br0'/> <model type='virtio'/> <filterref filter='tpot'> <parameter name='IP' value='192.168.1.1'/> </filterref> <address type='pci' domain='0x0000' bus='0x00' slot='0x03' function='0x0'/> </interface>
1.5.4 启动虚拟机
[[email protected] ~]# virsh start Debian-Tpot
1.5.5 *查看定义后的过滤规则
[[email protected] ~]# virsh nwfilter-dumpxml tpot <filter name='tpot' chain='ipv4' priority='-700'> <uuid>a37a0fc1-2926-4f83-beb9-681d942f7027</uuid> <rule action='drop' direction='out' priority='500'> <ip dstipaddr='$IP' dstipmask='24'/> </rule> </filter>
1.5.6 *查看生效规则
[[email protected] ~]# 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 参考资料
https://libvirt.org/formatnwfilter.html
https://boke.wsfnk.com/archives/201.html
https://blog.csdn.net/songfeihu0810232/article/details/73187909
