使用libvirt的networkfilter对网络进行过滤

2024-01-20 22:38

本文主要是介绍使用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对网络进行过滤的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/627567

相关文章

C++中assign函数的使用

《C++中assign函数的使用》在C++标准模板库中,std::list等容器都提供了assign成员函数,它比操作符更灵活,支持多种初始化方式,下面就来介绍一下assign的用法,具有一定的参考价... 目录​1.assign的基本功能​​语法​2. 具体用法示例​​​(1) 填充n个相同值​​(2)

MySQL深分页进行性能优化的常见方法

《MySQL深分页进行性能优化的常见方法》在Web应用中,分页查询是数据库操作中的常见需求,然而,在面对大型数据集时,深分页(deeppagination)却成为了性能优化的一个挑战,在本文中,我们将... 目录引言:深分页,真的只是“翻页慢”那么简单吗?一、背景介绍二、深分页的性能问题三、业务场景分析四、

Spring StateMachine实现状态机使用示例详解

《SpringStateMachine实现状态机使用示例详解》本文介绍SpringStateMachine实现状态机的步骤,包括依赖导入、枚举定义、状态转移规则配置、上下文管理及服务调用示例,重点解... 目录什么是状态机使用示例什么是状态机状态机是计算机科学中的​​核心建模工具​​,用于描述对象在其生命

使用Python删除Excel中的行列和单元格示例详解

《使用Python删除Excel中的行列和单元格示例详解》在处理Excel数据时,删除不需要的行、列或单元格是一项常见且必要的操作,本文将使用Python脚本实现对Excel表格的高效自动化处理,感兴... 目录开发环境准备使用 python 删除 Excphpel 表格中的行删除特定行删除空白行删除含指定

SpringBoot结合Docker进行容器化处理指南

《SpringBoot结合Docker进行容器化处理指南》在当今快速发展的软件工程领域,SpringBoot和Docker已经成为现代Java开发者的必备工具,本文将深入讲解如何将一个SpringBo... 目录前言一、为什么选择 Spring Bootjavascript + docker1. 快速部署与

深入理解Go语言中二维切片的使用

《深入理解Go语言中二维切片的使用》本文深入讲解了Go语言中二维切片的概念与应用,用于表示矩阵、表格等二维数据结构,文中通过示例代码介绍的非常详细,需要的朋友们下面随着小编来一起学习学习吧... 目录引言二维切片的基本概念定义创建二维切片二维切片的操作访问元素修改元素遍历二维切片二维切片的动态调整追加行动态

prometheus如何使用pushgateway监控网路丢包

《prometheus如何使用pushgateway监控网路丢包》:本文主要介绍prometheus如何使用pushgateway监控网路丢包问题,具有很好的参考价值,希望对大家有所帮助,如有错误... 目录监控网路丢包脚本数据图表总结监控网路丢包脚本[root@gtcq-gt-monitor-prome

Python通用唯一标识符模块uuid使用案例详解

《Python通用唯一标识符模块uuid使用案例详解》Pythonuuid模块用于生成128位全局唯一标识符,支持UUID1-5版本,适用于分布式系统、数据库主键等场景,需注意隐私、碰撞概率及存储优... 目录简介核心功能1. UUID版本2. UUID属性3. 命名空间使用场景1. 生成唯一标识符2. 数

linux解压缩 xxx.jar文件进行内部操作过程

《linux解压缩xxx.jar文件进行内部操作过程》:本文主要介绍linux解压缩xxx.jar文件进行内部操作,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录一、解压文件二、压缩文件总结一、解压文件1、把 xxx.jar 文件放在服务器上,并进入当前目录#

SpringBoot中如何使用Assert进行断言校验

《SpringBoot中如何使用Assert进行断言校验》Java提供了内置的assert机制,而Spring框架也提供了更强大的Assert工具类来帮助开发者进行参数校验和状态检查,下... 目录前言一、Java 原生assert简介1.1 使用方式1.2 示例代码1.3 优缺点分析二、Spring Fr