本文主要是介绍使用libvirt的networkfilter对网络进行过滤,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!
功能简介
Network filtering XML为虚拟化系统管理员提供对了一种网络流量的过滤规则,系统管理员可以通过配置过滤参数,实施和管理对虚拟机网络流量的接受和转发。由于过滤规则不能绕过直接进入虚拟机内,它使得一个filter对虚拟用户的访问控制具有强制性。 Network filtering子系统允许每一个虚拟机的网络过滤表可以被单独配置。我们可以在启动时配置虚拟机的访问控制过滤表,也可以在虚拟器运行时对虚拟机的规则进行修改。后者可以通过修改network filter XML的方式进行。 Libvirt允许多台虚拟机共用一个。当filter被修改时,所有运行的虚拟机都会自动更新filter的过滤规则。Network filtering XML部署在KVM Server上可以实现:虚拟网络隔离、入侵防护、批量管理等功能。Openstack的网络控制就是基于Network 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@localhost nwfilter]# virsh nwfilter-list UUID Name
------------------------------------------------------------------3f3e2f00-ccb8-44a7-a1ba-8ce5aad28d63 allow-arp 456177a2-55f8-4d8d-8739-db6ccf27082e allow-dhcp deef433c-e9e8-42fc-9aed-bffeb16938a3 allow-dhcp-server 2b62107a-ad6b-4151-995d-cc0392ecb48b allow-incoming-ipv4 e33feac5-1a5e-4862-8bc2-52cdfcc863e5 allow-ipv4 4ef7bae1-bc5a-4162-a248-ff262239c7ef clean-traffic fce8ae34-e69e-83bf-262e-30786c1f8073 limit-internet 2e633b9d-fd7f-4161-954c-2f99a7055480 no-arp-ip-spoofing bd85f81d-493c-4a0f-9874-f65a4bcbc268 no-arp-mac-spoofing 851f0aca-8f30-4e28-83c5-9ed2e1856e32 no-arp-spoofing b8e573ac-1310-4b63-b54d-f992c6dd4c05 no-ip-multicast 17c5d152-db6d-446f-9c9f-dae1cac1e38d no-ip-spoofing bc5893bb-45ea-4e11-9d01-9668bf987e5d no-mac-broadcast e1f413a3-0e15-43b8-a4d9-41768b8ab3ea no-mac-spoofing a3b73d23-6a10-45cb-a911-5244182d2e82 no-other-l2-traffic eed2e6bd-aa38-4cca-b808-68190712ca1c no-other-rarp-trafficc9da951e-323d-4623-ac71-9a6d40108b67 qemu-announce-self b48fe827-6453-4916-a8da-bcf2f044b6e1 qemu-announce-self-rarp
注:其中只有limit-internet为自己定义的,其他为KVM Server自动定制生成的。
FILTER字段分析
查看具体的某一条Filters:
<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的name,唯一。(官方建议:许多filter的名字是以chains的名字做前缀的。)
<filter name='limit' chain='root'>
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:
<uuid>1c3384c7-093a-5689-2cf3-320ef716ba2e</uuid>
Filter的编号,系统自动添加,唯一。
Rule实例:
<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>
最后一条的优先级为1000,优先级最低,作为所有匹配不到的数据包的默认规则。
常用配置命令
- virsh nwfilter-define
后面加上一个xml文件,从一个XML文件中定义或者更新一个网络过滤规则。- virsh nwfilter-dumpxml
后面加上某个网络过滤规则的名称,查看一个网络规则的XML详细信息。- virsh nwfilter-edit
后面加上某个网络过滤规则的名称,编辑一个网络规则。- virsh nwfilter-list
列出所有定义成功的网络过滤规则。- virsh nwfilter-undefine
后面加上一个网络过滤规则的名称,须消该网络过滤规则。
注意:定义网络过滤规则可以无视客户机的状态,并且可以及时生效,即使在客户机活跃的情况下。
遇到的问题
[root@localhost python]# virsh nwfilter-list
error: failed to connect to the hypervisor
error: no valid connection
error: Failed to connect socket to '/usr/local/var/run/libvirt/libvirt-sock': No such file or directory
解决方法:
增加软链接
[root@localhost python]# find / -name libvirt-sock
/run/libvirt/libvirt-sock
[root@localhost python]# ln -s /run/libvirt/libvirt-sock /usr/local/var/run/libvirt/libvirt-sock
[root@localhost python]# virsh nwfilter-list UUID Name
------------------------------------------------------------------3f3e2f00-ccb8-44a7-a1ba-8ce5aad28d63 allow-arp 456177a2-55f8-4d8d-8739-db6ccf27082e allow-dhcp deef433c-e9e8-42fc-9aed-bffeb16938a3 allow-dhcp-server 2b62107a-ad6b-4151-995d-cc0392ecb48b allow-incoming-ipv4 e33feac5-1a5e-4862-8bc2-52cdfcc863e5 allow-ipv4 4ef7bae1-bc5a-4162-a248-ff262239c7ef clean-traffic 2e633b9d-fd7f-4161-954c-2f99a7055480 no-arp-ip-spoofing bd85f81d-493c-4a0f-9874-f65a4bcbc268 no-arp-mac-spoofing 851f0aca-8f30-4e28-83c5-9ed2e1856e32 no-arp-spoofing b8e573ac-1310-4b63-b54d-f992c6dd4c05 no-ip-multicast 17c5d152-db6d-446f-9c9f-dae1cac1e38d no-ip-spoofing bc5893bb-45ea-4e11-9d01-9668bf987e5d no-mac-broadcast e1f413a3-0e15-43b8-a4d9-41768b8ab3ea no-mac-spoofing a3b73d23-6a10-45cb-a911-5244182d2e82 no-other-l2-traffic eed2e6bd-aa38-4cca-b808-68190712ca1c no-other-rarp-trafficc9da951e-323d-4623-ac71-9a6d40108b67 qemu-announce-self b48fe827-6453-4916-a8da-bcf2f044b6e1 qemu-announce-self-rarp
Network filters是通过XML完成参数的配置的,而且还可以和其他的filter搭配组合使用;当做模块调用被其他filter调用。KVM Server本身自带了许多filter,我们可以像操作虚拟机一样,对filter进行使用。系统自带的filters的目录是:
/etc/libvirt/nwfilter
配置实例
虚拟机初始状态可以正常访问外网。
[root@localhost ~]# ping baidu.com
PING baidu.com (123.125.114.144) 56(84) bytes of data.
64 bytes from 123.125.114.144 (123.125.114.144): icmp_seq=1 ttl=51 time=7.23 ms
64 bytes from 123.125.114.144 (123.125.114.144): icmp_seq=2 ttl=51 time=7.30 ms
64 bytes from 123.125.114.144 (123.125.114.144): icmp_seq=3 ttl=51 time=7.57 ms
^C
--- baidu.com ping statistics ---
3 packets transmitted, 3 received, 0% packet loss, time 2001ms
rtt min/avg/max/mdev = 7.238/7.372/7.576/0.146 ms
在虚拟机上面配置一个限制上外网的实例:
1、 定义netfilter
virsh nwfilter-define limit-internet.xml
limit-internet.xml 文件内容如下:
<filter name='limit-internet' chain='ipv4'> <uuid>fce8ae34-e69e-83bf-262e-30786c1f8073</uuid> <rule action='accept' direction='out' priority='100'> <ip protocol='udp' srcportstart='67' srcportend='68' dstportstart='67' dstportend='68'/> </rule> <rule action='accept' direction='in' priority='100'> <ip protocol='udp' srcportstart='67' srcportend='68' dstportstart='67' dstportend='68'/> </rule> <rule action='drop' direction='out' priority='200'> <ip match='no' dstipaddr='$GATEWAYIP' dstipmask='255.255.255.0'/> </rule>
</filter>
2、 virsh nwfilter-list查看启动的filters
[root@localhost nwfilter]# virsh nwfilter-list
UUID Name
----------------------------------------------------------
3f3e2f00-ccb8-44a7-a1ba-8ce5aad28d63 allow-arp
456177a2-55f8-4d8d-8739-db6ccf27082e allow-dhcp
deef433c-e9e8-42fc-9aed-bffeb16938a3 allow-dhcp-server
2b62107a-ad6b-4151-995d-cc0392ecb48b allow-incoming-ipv4
e33feac5-1a5e-4862-8bc2-52cdfcc863e5 allow-ipv4
4ef7bae1-bc5a-4162-a248-ff262239c7ef clean-traffic
fce8ae34-e69e-83bf-262e-30786c1f8073 limit-internet
………
3、 在虚拟机xml文件中添加 netfilter 名字 limit-internet ,启动虚拟机,此时虚拟机无法访问外网,只能通过vnc连接
<interface type='bridge'><mac address='52:54:00:31:f5:96'/><source bridge='br0'/><model type='rtl8139'/><filterref filter='limit-internet'/><address type='pci' domain='0x0000' bus='0x00' slot='0x03' function='0x0'/>
</interface>
4、 创建另外一个xml文件,重新定义netfilter ,虚拟机外网访问立即恢复正常
virsh nwfilter-define limit-internet-cancer.xml
<filter name='limit-internet' chain='ipv4'> <uuid>fce8ae34-e69e-83bf-262e-30786c1f8073</uuid> <rule action='accept' direction='out' priority='100'> </rule>
</filter>
参考
http://libvirt.org/firewall.html
http://libvirt.org/formatnwfilter.html#nwfwrite
https://my.oschina.net/amoshuang/blog/89439?p=1
http://blog.csdn.net/lipei1220/article/details/50673018
这篇关于使用libvirt的networkfilter对网络进行过滤的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!