KVM使用Network Filters进行虚拟机网络管理

2019年4月23日16:51:41KVM使用Network Filters进行虚拟机网络管理已关闭评论 408 views

1.1 Network Filters介绍

Network filtering XML为虚拟化系统管理员提供了一种网络流量的过滤规则,系统管理员可以通过配置过滤参数实施和管理对虚拟机网络流量的接受和转发,由于过滤规则不能绕过直接进入虚拟机内,使得一个filter对虚拟用户的访问控制具有强制性。

Network filtering 子系统允许每一个虚拟机的网络过滤表可以被单独配置,我们可以在启动时配置虚拟机的访问控制过滤表,也可以在虚拟器运行时对虚拟机的规则进行修改,后者可以通过修改network filter XML的方式进行。

Libvirt 允许多台虚拟机共用一个,当filter被修改时所有运行的虚拟机都会自动更新filter的过滤规则。

Network filtering XML部署在KVM Server上可以实现:虚拟网络隔离、入侵防护、批量管理等功能,Openstack的网络控制就是基于Networkl filter。

官方文档:https://libvirt.org/formatnwfilter.html

1.2 实现原理

chain类型:所有过滤规则都被组织到一个过滤链中,数据包经过这些过滤链被选择进入虚拟机或是DROP掉,链都有不同的优先级,root链的优先级最高。所有的数据包必须先经过root链后才可能继续到其他过滤规则中匹配。

priority优先级的设定:所有链都被连接到root链中,优先级的值越小,优先级越高,用户可以定义自己的优先级数值,取值范围(100,1000)下边是官方提供的默认优先级:

1.3 过滤规则语法

1.3.1 示例规则

1
2
3
4
5
6
7
8
9
10
11
[root@KVM ~]# 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 查看过滤规则

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
[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 定义过滤规则

1
[root@KVM ~]# virsh nwfilter-define 规则名称

1.4.3 编辑过滤规则

1
[root@KVM ~]# virsh nwfilter-edit 规则名称

1.4.4 查看规则具体内容

1
[root@KVM ~]# virsh nwfilter-dumpxml 规则名称

1.4.5 删除过滤规则

1
[root@KVM ~]# virsh nwfilter-undefine 规则名称

1.4.6 查看系统有没有生效的规则

1
[root@KVM ~]# ebtables -t nat -L

1.4.7 使规则立即生效

1
[root@KVM ~]# virsh update-device 虚拟机名称 规则名称

1.5 编写自己的过滤规则(禁止tpot访问局域网其他服务器)

1.5.1 编写规则文件

1
2
3
4
5
6
7
[root@KVM ~]# 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 定义规则

1
[root@KVM ~]# virsh nwfilter-define /etc/libvirt/nwfilter/tpot.xml

1.5.3 引用规则

1
2
3
4
5
6
7
8
9
10
[root@KVM ~]# 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 启动虚拟机

1
[root@KVM ~]# virsh start Debian-Tpot

1.5.5 *查看定义后的过滤规则

1
2
3
4
5
6
7
[root@KVM ~]# 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 *查看生效规则

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
[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 参考资料

https://libvirt.org/formatnwfilter.html

https://boke.wsfnk.com/archives/201.html

https://blog.csdn.net/songfeihu0810232/article/details/73187909

https://my.oschina.net/amoshuang/blog/89439

weinxin
我的微信
如果有技术上的问题可以扫一扫我的微信