firewalld(6)自定义services、ipset

简介

在前面的文章中我们已经介绍了zone、rich rule 、--direct等功能和基本配置。在前面文章中,我们提到过firewalld内置了很多服务,可以通过firewall-cmd --get-services来查看服务,也可以通过配置文件查看这些服务/var/lib/firewalld/services/目录下。这些都是系统内置的服务,那么我们该如何自定义属于自己的服务呢?我们有很多IP地址信息,我们如何将同一类IP地址信息整合统一设置策略进行管理?这些就是我们这篇文章所介绍的内容。

自定义services

自定义服务配置文件:通常位于/etc/firewalld/services/目录下,文件名以.xml结尾。这些文件允许用户定义自己的服务,包括其使用的端口、协议、模块(如内核模块)以及目标地址等。

系统级服务配置文件:位于/usr/lib/firewalld/services/目录下,这些文件包含预定义的服务配置,这些服务通常是众所周知的网络服务(如HTTP、SSH等)。

参考/usr/lib/firewalld/services/ssh.xml,在/usr/lib/firewalld/services/下面新建你需要的服务名以.xml结尾,内容格式参照如ssh.xml、rdp.xml等文件中的内容即可。

服务配置参数介绍

<?xml version="1.0" encoding="utf-8"?>
<service>
  <short>My Service</short>
  <description>description</description>
  <port port="137" protocol="tcp"/>
  <protocol value="igmp"/>
  <module name="nf_conntrack_netbios_ns"/>
  <destination ipv4="224.0.0.251" ipv6="ff02::fb"/>
  <include service="ssdp"/>
  <helper name="ftp"/>
</service>

以上选项其中一些是必需的,其他是可选的。

service:
    必需的开始和结束标签,定义了服务。在服务配置文件中只能使用一次该标签。
    服务有一些可选属性:
    version="string":为服务指定版本。
    short:
        可选的开始和结束标签,用于向服务提供更易读的名称。

description:
    可选的开始和结束标签,为服务提供描述信息。

port:
    可选的空元素标签,可以多次使用以添加多个端口条目。
    端口条目的所有属性都是必需的:

    port="string":
        端口字符串可以是单个端口号,端口范围(portid-portid),也可以为空以仅匹配协议。

protocol="string":
    协议值可以是 tcp、udp、sctp 或 dccp。

    protocol:
        可选的空元素标签,可以多次使用以添加多个协议条目。一个协议条目仅有一个属性:

    value="string":
        协议可以是系统支持的任何协议。查看 /etc/protocols 获取支持的协议列表。
    source-port:
        可选的空元素标签,可以多次使用以添加多个源端口条目。源端口条目的所有属性都是必需的:

    port="string":
        端口字符串可以是单个端口号或端口范围(portid-portid)。

    protocol="string":
        协议值可以是 tcp、udp、sctp 或 dccp。

module:
    此元素已废弃。请使用下面“helper”部分中描述的 helper。

destination:
    可选的空元素标签,仅可使用一次。目标指定目标网络作为网络 IP 地址(可选带 /mask),或者纯粹的 IP 地址。

    ipv4="address[/mask]":
        IPv4 目标地址及可选掩码。
    ipv6="address[/mask]":
        IPv6 目标地址及可选掩码。

include:
   include是一个可选的空元素标签,可以多次使用以包含多个服务。这允许将多个服务的配置组合在一起,而不是在每个服务中重复相同的配置。

    service="string":
        可以是 firewalld 支持的任何服务。
注意:Firewalld 只会在应用到区域时检查包含的服务是否是有效的服务。

helper:
    helper是一个可选的空元素标签,可以多次使用以指定多个辅助程序(helper)。辅助程序是firewalld用于处理特定类型网络流量的程序,一个 helper 条目仅有一个属性,例如FTP或DHCP。
    name="string":
        可以是 firewalld 支持的任何辅助程序。

helper

在上面服务的定义中有一个参数为helper,helper 是 firewalld 防火墙服务中用于配置辅助程序(helper)的XML文件。这些辅助程序通常用于增强 firewalld 对特定网络协议或应用服务的识别和处理能力。通过配置这些辅助程序,firewalld 可以更智能地管理网络流量,比如自动跟踪和管理特定的端口和协议。

配置示例

<?xml version="1.0" encoding="utf-8"?>
<helper module="nf_conntrack_module" [family="ipv4|ipv6"]>
  <short>short</short>
  <description>description</description>
  <port portid[-portid]" protocol="tcp|udp|sctp|dccp"/>
</helper>

ports: 指定辅助程序需要关注的端口号或端口范围,以及这些端口所使用的协议(如TCP、UDP、SCTP、DCCP)。
family: 指定辅助程序适用的IP协议版本,可以是IPv4或IPv6。如果不指定,则辅助程序同时适用于IPv4和IPv6。
module: 指定辅助程序所使用的Netfilter连接跟踪(conntrack)模块。这些模块以nf_conntrack_开头,用于跟踪和识别网络流量。

辅助程序的配置文件可以放在两个位置之一:

  • /etc/firewalld/helpers/:这个目录下的配置文件用于自定义或覆盖系统默认的辅助程序配置。
  • /usr/lib/firewalld/helpers/:这个目录包含了firewalld默认提供的辅助程序配置。通常不建议直接修改这些文件,而是通过创建自定义配置文件来覆盖默认设置。

配置自定义服务

例如,我系统提供了一套服务,这套服务同时需要使用tcp 5000、5500、4500和udp 22000端口,且需要外部可以访问这些端口。

32760911c2894f23bcff73496c3c098a.png

在/etc/firewalld/services/目录下创建一个test1.xml服务,服务内容就是我们上面所定义的那么多端口

6c057c022a1940a4bbd8525680015c8d.png

重新加载防火墙,此时我们可以看到了刚才所创建的test1服务

d7e10efdbf264f6f893892f1c2a084d6.png

b69ba94aba7447828ec2a54d6ba9400b.png

此时我们将public应用到public zone。

4f076b69bd54445bbcb8c2c1a815b338.png

此时我们在后端的iptables中也可以看到我们刚才设置的策略

IPSET

firewalld.ipset 是指 firewalld 防火墙服务中用于配置 IP 集(ipset)的 XML 文件。IP 集是 iptables 的一个扩展,允许你将多个 IP 地址或网络组合成一个集合,然后在防火墙规则中引用这个集合,从而简化规则的管理和维护。

IP 集的配置文件可以放在两个位置之一:

  • /etc/firewalld/ipsets/:这个目录下的配置文件用于自定义 IP 集。当你需要为防火墙规则添加自定义的 IP 地址或网络集合时,应该在这个目录下创建配置文件。
  • /usr/lib/firewalld/ipsets/:这个目录包含了 firewalld 默认提供的 IP 集配置。通常不建议直接修改这些文件,因为它们是系统级的默认配置。

配置文件结构

<?xml version="1.0" encoding="utf-8"?>
<ipset type="hash:ip">
  <short>My Ipset</short>
  <description>description</description>
  <entry>1.2.3.4</entry>
  <entry>1.2.3.5</entry>
  <entry>1.2.3.6</entry>
</ipset>

ipset:
    必需的开始和结束标签,定义了 ipset。在 ipset 配置文件中只能使用一次该标签。ipset 有一个必需且可选的属性:
    type="string":
        ipset 的类型是必需的。要获取支持的类型列表,使用 firewall-cmd --get-ipset-types。
    version="string":为 ipset 指定一个版本。

short:
    可选的开始和结束标签,用于向 ipset 提供一个更易读的名称。

description:
    可选的开始和结束标签,用于为 ipset 添加描述信息。

entry:可选的开始和结束标签,可以多次使用以添加多个条目。一个条目条目没有属性。

<option>
    可选:<option>是一个空元素标签,可以多次使用以设置多个选项。大多数选项的属性都是必需的:
    name="string":必需的,指定选项的名称。
    value="string":可选的,指定选项的值。
    支持的选项包括:family(值为"inet"或"inet6",指定IP地址族)、timeout(整数,指定超时时间)、hashsize(整数,指定哈希表的大小)、maxelem(整数,指定IP集可以包含的最大元素数量)。

配置ipset

        配置ipsec可以通过直接创建ipset配置文件或者通过命令firewall-cmd --permanent --new-ipset=来创建ipset。

firewall-cmd --get-ipset-types
hash:ip hash:ip,mark hash:ip,port hash:ip,port,ip hash:ip,port,net hash:mac hash:net hash:net,iface hash:net,net hash:net,port hash:net,port,net

hash:ip
这个类型用于存储 IPv4 或 IPv6 地址。它是基于哈希表的,因此查找和插入操作都非常快。

hash:ip,mark
除了存储 IPv4 或 IPv6 地址外,这个类型还允许为每个地址关联一个标记(mark)。这可以用于基于地址和标记的组合进行更复杂的规则匹配。

hash:ip,port
这个类型用于存储 IP 地址和端口的组合。它允许你同时根据 IP 地址和端口号来过滤流量。

hash:ip,port,ip
这个类型存储的是源 IP 地址、源端口和目标 IP 地址的组合。这可以用于更精确地控制哪些源 IP 地址和端口可以与哪些目标 IP 地址通信。

hash:ip,port,net
类似于 hash:ip,port,ip,但这个类型允许目标 IP 地址是一个网络(即一个 IP 地址范围),而不仅仅是单个 IP 地址。

hash:mac
这个类型用于存储 MAC 地址。它允许你根据网络接口的 MAC 地址来过滤流量,这在某些情况下(如基于物理设备的访问控制)非常有用。

hash:net
这个类型用于存储 IP 网络(即 IP 地址范围)。它允许你根据 IP 地址范围来过滤流量,而不是单个 IP 地址。

hash:net,iface
除了存储 IP 网络外,这个类型还允许你为每个网络关联一个网络接口名称。这可以用于基于网络接口和 IP 地址范围的组合来过滤流量。

hash:net,net
这个类型允许你存储两个 IP 网络(源网络和目标网络)的组合。它可能用于定义哪些源网络可以与哪些目标网络通信。

hash:net,port
类似于 hash:ip,port,但这个类型允许源或目标 IP 地址是一个网络范围,而不仅仅是单个 IP 地址。

hash:net,port,net
它允许你存储源网络、源端口和目标网络的组合。这可以用于定义非常具体的流量过滤规则。

创建配置ipset

97f7aa6b585244db96bba1b012d441f8.png

创建一个名为托尔test2的ipset,类型为hash:ip

52dfe5eaf34d47c68864fb599727957a.png

我这里直接编辑test2.xml文件来配置ip地址,因为我的firewalld不支持通过firewall-cmd --permanent --ipset=myipset --add-entry=100.1.1.1  该命令来添加IP地址进入ipset

引用ipset

62d419fd064146ec9cef70deb85a93dc.png

通过rich rule来引用ipset

e9944ca1f6984083a32ebbebe3d0f331.png

此时在iptables中已经可以看到引用了ipset

总结

        自定义服务和ipset都是可以将我们自己需要的一类服务或者地址端口信息形成一个统一的整体,在复杂环境使用中可以极大的简化我们的操作方式。可以将两者结合使用形成自己独有的防火墙规则模式。

 

 

 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/768244.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

汽车IVI中控开发入门及进阶(三十三):i.MX linux开发之开发板

前言: 大部分物料/芯片,不管MCU 还是SoC,都会有原厂提供配套开发板,有这样一个使用原型,在遇到问题时或者进行开发时可以使用。 i.MX 8QuadXPlus MEK board: 1、要测试display显示器,可使用i.MX mini SAS将“LVDS1_CH0”端口连接到LVDS到HDMI适配器的cable。 2、要测试…

12. Revit API: Document、Element

12. Revit API: Document、Element 前言 还是先讲一下Document吧&#xff0c;不然Selection不好讲&#xff0c;那涉及到了挺多东西的&#xff0c;比元素&#xff08;Element&#xff09;和各类Filter&#xff0c;这些都与Document有关&#xff0c;所以先简单讲一下这个。 一、…

解码AWS EC2:塑造云服务器新标杆的五大核心优势

在云计算领域&#xff0c;亚马逊弹性计算云&#xff08;Amazon Elastic Compute Cloud, 简称EC2&#xff09;作为AWS的明星服务&#xff0c;凭借其卓越的性能、灵活性和广泛的生态系统&#xff0c;已经成为企业构建云上基础设施的首选。EC2不仅仅是一个简单的云服务器租用服务&…

【C++】多态详解

&#x1f497;个人主页&#x1f497; ⭐个人专栏——C学习⭐ &#x1f4ab;点击关注&#x1f929;一起学习C语言&#x1f4af;&#x1f4ab; 目录 一、多态概念 二、多态的定义及实现 1. 多态的构成条件 2. 虚函数 2.1 什么是虚函数 2.2 虚函数的重写 2.3 虚函数重写的两个…

【坚果识别】果实识别+图像识别系统+Python+计算机课设+人工智能课设+卷积算法

一、介绍 坚果识别系统&#xff0c;使用Python语言进行开发&#xff0c;通过TensorFlow搭建卷积神经网络算法模型&#xff0c;对10种坚果果实&#xff08;‘杏仁’, ‘巴西坚果’, ‘腰果’, ‘椰子’, ‘榛子’, ‘夏威夷果’, ‘山核桃’, ‘松子’, ‘开心果’, ‘核桃’&a…

C++基础(三):C++入门(二)

上一篇博客我们正式进入C的学习&#xff0c;这一篇博客我们继续学习C入门的基础内容&#xff0c;一定要学好入门阶段的内容&#xff0c;这是后续学习C的基础&#xff0c;方便我们后续更加容易的理解C。 目录 一、内联函数 1.0 产生的原因 1.1 概念 1.2 特性 1.3 面试题 …

nohup java -jar 启动java项目

hi&#xff0c;我是程序员王也&#xff0c;一个资深Java开发工程师&#xff0c;平时十分热衷于技术副业变现和各种搞钱项目的程序员~&#xff0c;如果你也是&#xff0c;可以一起交流交流。 今天我们聊聊linux中运行java jar包的问题~ 理解nohup命令 nohup命令的基本概念 noh…

Flutter Navigator.popUntil 参数传递

Flutter 使用页面传参 以下是 在flutter 中页面传参的常用形式&#xff0c;都可以有有直接的传值参数提供。 Navigator.push #跳转到指定页面 压栈路由表Navigator.pushReplacement #关闭当前页面 跳转到指定页面压栈路由表Navigator.pus…

[单master节点k8s部署]16.监控系统构建(一)Prometheus介绍

prometheus prometheus是继k8s之后&#xff0c;第二个被托管到CNCF的项目&#xff0c;是一个开源的监控报警系统。 1.prometheus支持多维数据模型&#xff0c;每一个时间序列数据都由metric度量指标名称和它的标签label组成一组键值对。 2.Prometheus有自己的PromQL查询语言…

【刷题汇总--简写单词、dd爱框框、除2!】

C日常刷题积累 今日刷题汇总 - day0031、简写单词1.1、题目1.2、思路1.3、程序实现 - 思路11.4、程序实现 - 思路2(优化) 2、dd爱框框2.1、题目2.2、思路2.3、程序实现 - 蛮力法2.4、程序实现 - 同向双指针(滑动窗口) 3、除2!3.1、题目3.2、思路3.3、程序实现 4、题目链接 今日…

Trident Dehazing Network

Trident去雾网络 【Trident&#xff1a;三齿的&#xff0c;三叉戟】 摘要 针对现有的去雾方法对非均匀雾霾的鲁棒性差&#xff0c;以及高雾霾区域的信息未知且难以估计&#xff0c;导致去雾效果模糊的问题&#xff0c;提出了一种由粗到精的模型Trident Dehazing Network&…

基于iview.viewUI实现行合并(无限制/有限制合并)【已验证可正常运行】

1.基于iview.viewUI实现行合并&#xff08;列之间没有所属对应关系&#xff0c;正常合并&#xff09; 注&#xff1a;以下代码来自于GPT4o&#xff1a;国内直连GPT4o 只需要修改以下要合并的列字段&#xff0c;就可以方便使用啦 mergeFields: [majorNo, devNam, overhaulAdvic…

查找python包的安装路径

前提&#xff1a;自己已经安装过的包 1、打开任一python解析器&#xff0c;如VSCode 2、 以matplotlib为例&#xff0c;敲下面命令 import matplotlibprint(matplotlib.path) 3、运行代码就可以了 需要注意&#xff1a; 部分包没有path&#xff08;比如time&#xff09;&am…

使用 Java Swing 和 XChart 创建多种图表

在现代应用程序开发中&#xff0c;数据可视化是一个关键部分。本文将介绍如何使用 Java Swing 和 XChart 库创建各种类型的图表。XChart 是一个轻量级的图表库&#xff0c;支持多种类型的图表&#xff0c;非常适合在 Java 应用中进行快速的图表绘制。 1、环境配置 在开始之前&…

ElementUI中的el-table解决宽度问题 - 根据内容自动撑开

在使用element-ui中&#xff0c;会发现表格组件el-table在未指定宽度情况下&#xff0c;会自动计算并给表格宽度赋值。但实际开发中&#xff0c;有时需要根据内容实际长度自动撑开显示&#xff0c;由内容的多少而决定表格的宽度&#xff0c;而不是默认宽度为100%。在默认情况下…

韩语日常口语留学韩语旅游韩语口语柯桥语言培训

韩语每日一词打卡&#xff1a;행정적[행정적]【名词】行政 原文:나라는 항상 행정적 명령을 통해 경제운행을 조절합니다. 意思&#xff1a;国家经常通过行政命令去调节经济的运行。 【原文分解】 1、항상[항상]总是 &#xff0c;经常 2、나라[나라]国家 3、명령[명:녕]命令 …

计算机网络——数据链路层(点对点协议PPP)

点对点协议PPP的概述 对于点对点的链路&#xff0c;目前使用得最广泛的数据链路层协议是点对点协议 PPP (Point-to-Point Protocol)。 它主要应用于两个场景&#xff1a; 用户计算机与ISP之间的链路层协议就是点对点协议 PPP&#xff0c;1999年公布了回以在以太网上运行的PPP协…

JAVA每日作业day7.1-7.3小总结

ok了家人们前几天学了一些知识&#xff0c;接下来一起看看吧 一.API Java 的 API &#xff08; API: Application( 应用 ) Programming( 程序 ) Interface(接口 ) &#xff09; Java API 就是 JDK 中提供给我们使用的类&#xff0c;这些类将底层 的代码实现封装了起来&#x…

10 docker 安装 mysql详解

目录 一、安装mysql 1. 镜像获取 2. 简单版 2.1. 使用mysql镜像 2.2. 建库建表插入数据 2.3. 外部win 连接并插入中文数据测试 2.4. 简单版本问题 3. 创建容器-实战版 3.1. 新建容器实列并挂载卷 3.2. 新建my.cnf , 解决中文乱码 3.3. 重启容器验证 3.4. 总结 一、…

2024年精选推荐的16个向量数据库:提升你的AI应用性能

在人工智能时代&#xff0c;向量数据库已成为数据管理和AI模型不可或缺的一部分。向量数据库是一种专门设计用来存储和查询向量嵌入数据的数据库。这些向量嵌入是AI模型用于识别模式、关联和潜在结构的关键数据表示。随着AI和机器学习应用的普及&#xff0c;这些模型生成的嵌入…