简介
在前面的文章中我们已经介绍了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端口,且需要外部可以访问这些端口。
在/etc/firewalld/services/目录下创建一个test1.xml服务,服务内容就是我们上面所定义的那么多端口
重新加载防火墙,此时我们可以看到了刚才所创建的test1服务
此时我们将public应用到public zone。
此时我们在后端的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
创建一个名为托尔test2的ipset,类型为hash:ip
我这里直接编辑test2.xml文件来配置ip地址,因为我的firewalld不支持通过firewall-cmd --permanent --ipset=myipset --add-entry=100.1.1.1 该命令来添加IP地址进入ipset
引用ipset
通过rich rule来引用ipset
此时在iptables中已经可以看到引用了ipset
总结
自定义服务和ipset都是可以将我们自己需要的一类服务或者地址端口信息形成一个统一的整体,在复杂环境使用中可以极大的简化我们的操作方式。可以将两者结合使用形成自己独有的防火墙规则模式。