使用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

相关文章

中文分词jieba库的使用与实景应用(一)

知识星球:https://articles.zsxq.com/id_fxvgc803qmr2.html 目录 一.定义: 精确模式(默认模式): 全模式: 搜索引擎模式: paddle 模式(基于深度学习的分词模式): 二 自定义词典 三.文本解析   调整词出现的频率 四. 关键词提取 A. 基于TF-IDF算法的关键词提取 B. 基于TextRank算法的关键词提取

使用SecondaryNameNode恢复NameNode的数据

1)需求: NameNode进程挂了并且存储的数据也丢失了,如何恢复NameNode 此种方式恢复的数据可能存在小部分数据的丢失。 2)故障模拟 (1)kill -9 NameNode进程 [lytfly@hadoop102 current]$ kill -9 19886 (2)删除NameNode存储的数据(/opt/module/hadoop-3.1.4/data/tmp/dfs/na

Hadoop数据压缩使用介绍

一、压缩原则 (1)运算密集型的Job,少用压缩 (2)IO密集型的Job,多用压缩 二、压缩算法比较 三、压缩位置选择 四、压缩参数配置 1)为了支持多种压缩/解压缩算法,Hadoop引入了编码/解码器 2)要在Hadoop中启用压缩,可以配置如下参数

Makefile简明使用教程

文章目录 规则makefile文件的基本语法:加在命令前的特殊符号:.PHONY伪目标: Makefilev1 直观写法v2 加上中间过程v3 伪目标v4 变量 make 选项-f-n-C Make 是一种流行的构建工具,常用于将源代码转换成可执行文件或者其他形式的输出文件(如库文件、文档等)。Make 可以自动化地执行编译、链接等一系列操作。 规则 makefile文件

深入探索协同过滤:从原理到推荐模块案例

文章目录 前言一、协同过滤1. 基于用户的协同过滤(UserCF)2. 基于物品的协同过滤(ItemCF)3. 相似度计算方法 二、相似度计算方法1. 欧氏距离2. 皮尔逊相关系数3. 杰卡德相似系数4. 余弦相似度 三、推荐模块案例1.基于文章的协同过滤推荐功能2.基于用户的协同过滤推荐功能 前言     在信息过载的时代,推荐系统成为连接用户与内容的桥梁。本文聚焦于

使用opencv优化图片(画面变清晰)

文章目录 需求影响照片清晰度的因素 实现降噪测试代码 锐化空间锐化Unsharp Masking频率域锐化对比测试 对比度增强常用算法对比测试 需求 对图像进行优化,使其看起来更清晰,同时保持尺寸不变,通常涉及到图像处理技术如锐化、降噪、对比度增强等 影响照片清晰度的因素 影响照片清晰度的因素有很多,主要可以从以下几个方面来分析 1. 拍摄设备 相机传感器:相机传

【Prometheus】PromQL向量匹配实现不同标签的向量数据进行运算

✨✨ 欢迎大家来到景天科技苑✨✨ 🎈🎈 养成好习惯,先赞后看哦~🎈🎈 🏆 作者简介:景天科技苑 🏆《头衔》:大厂架构师,华为云开发者社区专家博主,阿里云开发者社区专家博主,CSDN全栈领域优质创作者,掘金优秀博主,51CTO博客专家等。 🏆《博客》:Python全栈,前后端开发,小程序开发,人工智能,js逆向,App逆向,网络系统安全,数据分析,Django,fastapi

Linux 网络编程 --- 应用层

一、自定义协议和序列化反序列化 代码: 序列化反序列化实现网络版本计算器 二、HTTP协议 1、谈两个简单的预备知识 https://www.baidu.com/ --- 域名 --- 域名解析 --- IP地址 http的端口号为80端口,https的端口号为443 url为统一资源定位符。CSDNhttps://mp.csdn.net/mp_blog/creation/editor

pdfmake生成pdf的使用

实际项目中有时会有根据填写的表单数据或者其他格式的数据,将数据自动填充到pdf文件中根据固定模板生成pdf文件的需求 文章目录 利用pdfmake生成pdf文件1.下载安装pdfmake第三方包2.封装生成pdf文件的共用配置3.生成pdf文件的文件模板内容4.调用方法生成pdf 利用pdfmake生成pdf文件 1.下载安装pdfmake第三方包 npm i pdfma

零基础学习Redis(10) -- zset类型命令使用

zset是有序集合,内部除了存储元素外,还会存储一个score,存储在zset中的元素会按照score的大小升序排列,不同元素的score可以重复,score相同的元素会按照元素的字典序排列。 1. zset常用命令 1.1 zadd  zadd key [NX | XX] [GT | LT]   [CH] [INCR] score member [score member ...]