2022
我们一起努力

firewalld(firewall的有哪几种规则)

目录:

  • 1、第10篇 firewalld基于后端iptables的运行原理
  • 2、安点科技防火墙命令
  • 3、Centos下配置firewalld实现nat路由转发
  • 4、firewalld配置

第10篇 firewalld基于后端iptables的运行原理

在firewalld使用时候过程中,定义的多条rich规则,或者和direct规则混用,导致firewalld的过滤的数据包的规则,在某些情况下不会按照我们定义的规则顺序去执行,之所以造成这种问题的原因,是因为不了解firewalld对区域和其规则的设定在底层发生了什么!例如

我在 《第2篇:Linux防火墙-firewalld的rich规则配置》 已经探讨过这个问题。

我们在深入探讨firewalld基于它的后端iptables的内部机制,需要了解iptables过滤数据表的原理,下图是一个很好的总结。

firewalld作为iptables的前端,它在iptables的 PREROUTING / FORWARD / INPUT/OUTPUT链内部为其活动区域都预设了的不同区域名称的链,这些链的执行尤其固定的顺序,下图我们以上面的iptables数据包过滤流程图为导向,绘制了一个关于firewalld的external和internal为活动区域的规则集执行流程,读者可以通过iptables命令来查看各个链来验证下图的完整性,不过这个图因为篇幅我做了一些精简。

下图的流程是承接上图的路由系统

从上图可知,firewalld的internal/external区域会映射到iptables内部的对应区域链的规则集,例如,在PREROUTING链中firewalld在iptables中加载了三个chain,并且这三个chain的优先级依次是

我们通过iptables命令 查看PREROUTING链来证实我们的说法

此时,我们通过firewalld定义下面一条direct规则,来继续印证上面提到的PREROUTING_direct链的作用。

首先从下图演示中,我们定义了上面的direct规则,在重装firewalld后我们通过iptables命令来查看 通过direct命令选项定义的规则会在装载到PREROUTING_direct链当中 。

我们因此知道PREROUTING_direct是用于装载direct选项定义iptables规则。

我们继续通过iptables查看另外一个PREROUTING_Zones链,如下命令

在上图输出中,我们得知PREROUTING_direct链中装载着三条规则,这三条规则分别指向着下面三个chain,它们是firewalld为其活动区域相关的。其匹配顺序如下

PRE_internal ➤ PRE_external ➤ PRE_public

没错,我们通过 firewall-cmd --get-active-zones 的演示来验证我们的想法。

其中的 public区域对于的PRE_public链在0.63版本的firewalld中是默认存在的 ,而在centOS8中的0.70版本,除非显式定义public为活动区域,否则会默认取消了PRE_public

那么,我们继续在这里提出一个问题,firewall-cmd设定默认区域会否对- PRE_internal和PRE_external的先后次序有所影响?

我们按照如下图, 首先查看firewalld的默认区域和活动区域,并且查看PREROUTING_ZONES链中三条链的顺序 。根前文是一致的。

之后,firewalld的默认区域由 public区域 替换为 external区域 ,其顺序变更为

PRE_internal ➤ PRE_external ➤ PRE_externl

然后,再将默认区域由 external区域 替换为 internal区域 ,如下图所示

在iptables的PREROUTING链中,顺序如下 PRE_internal ➤ PRE_external ➤ PRE_internal

在firewalld中,通过前后对比,我们得出如下几个基本的结论

注意:

我们通过上面的操作,读者你们会否发现? 如果firewalld已经存在两个活动区域,而将其中一个活动区域设定为默认区域 ,这种配置是错误的。因为internal区域内的规则会被优先匹配,而internal区域又被设置为默认的区域,同一个链的上下文中,internal作为最后一条默认规则并不会被执行。

因此,当我们的防火墙存在两个区域internal/trust/work和external时,这些区域是用于安全地相互传递信息,而对于一些不可信任的连接请求是会被拒之防火墙之外的,我们可以交由默认规则来处理,而firewalld中有一个区域叫drop非常适合作为iptables规则列表中的默认规则。

从上文的我们已经知道firewalld的特定区域会在iptables规则列表存在与该区域名称对应的链。例如在PREROUTING链中

internal区域会被映射为 pre_interanl链

external区域会被映射为pre_external链

在FORWARD链中,即更为复杂的映射关系,你们可以自行使用iptables命令去查看,这里不一一举例。

我们知道firewalld中引入了区域这个概念后,可以在区域中进行类似如下操作

我们用iptables查看external相关的规则集,会发现 在iptables的filter表--INPUT链--IN_external_allow链,会存在这样的一条规则 。

iptables的INPUT_ZONES_SOURCE链多了一条放行主机172.42.38.128的规则,其实就是由上面的命令执行后,添加到预设这个链中的。

那么上面设定rich规则会被内化为iptables的 filter表--INPUT链--INPUT_ZONES链--IN_internal_deny链内的一条iptables规则 ,如下图

上面的rich规则首选会分成两个部分,如下图所示

在改变external的默认target后,变为

如下图所示

当然对区域的target设定,firewall-cmd会同时修改FORWARDING链下各个FORWARD对应的子区域链的最后一条规则,例如

FWDI_internal对应的是internal区域,上面的命令会在FWDI_internal链中的最后一条规则修改为

如下图 所示

如果将internal区域的默认target设定为DROP,那么对应的FWDI_internal链的最后一条规则即会默认丢弃所有需要转发的数据包,例如如下命令

对应的FWDI_internal链内的 最终效果图

首先这里要明确一个概念,firewalld中的任何预设区域,例如public/external/internal/work,都会被映射为iptables规则列表中的与该区域名称相关的预设链( Firewalld-Preference-Chain ),我称为这些预设链叫 区域链(Chain for Zone)

前面列举这些区域配置相关的例子,是为了印证firewalld的区域执行各种配置设定,已经按照预设一套规则列表去执行这些设定。每个firewalld的区域链的 入站方向 (注意:关键字)都有4条固有基本规则

1. 日志规则, 如图中的 IN_external_log

2. deny规则,如上图的 IN_external_deny

3. allow规则,如上图的 IN_external_allow

4. 默认规则,如上图的 DROP all any any

那么,这四条规则的顺序,连firewalld.org撰写firewalld技术文档的主站都承认非常奇葩的设定,狠狠地抽开发者自己脸,奇葩的原因就是deny规则一定要在allow规则之前吗?这一设定会导致使用rich规则时,原本匹配精度更高的放行规则,永远不会被执行。例如刚才对internal区域的rich规则配置 见下图

由于第一条rich规则会转换为IN_internal_deny链内的iptables规则,第二条rich规则会转换为IN_internal_allow链内的iptables规则,由于IN_internal_deny链在IN_internal_allow之前,所以对于那些目标网段一样的匹配精度不一样的rich规则列表来说,就算倒大霉!图中的第二条规则是永远不会被匹配到的。

看过我Linux防火墙系列文章的读者,就是这一篇 《第2篇:Linux防火墙-firewalld的rich规则配置》 ,可能会知道rich规则有个叫priority关键字可以解决这一问题, 但你要注意0.63版本的firewalld还没有关于rich规则的priority优先级设定 。

对于CentOS8之后的版本是0.64版本之后的firewalld,已经在原来区域链新增一些预设规则, 如下图 ,

其中的pre规则就是用于装载显式设定了priority关键字为某个负数后的rich规则的。这样可以确保那些需要执行的rich规则被优先匹配执行。

其实,我写到这里,你应该要明确对firewalld的基本原理有个全局的认识,不认识iptables对firewalld的配置会寸步难行,因为复杂的规则,基本上需要你熟悉direct规则或rich规则内部运行原理,因为它们的原型都是iptables规则,只是匹配的优先级不一样。

安点科技防火墙命令

1、firewalld的基本使用

启动: systemctl start firewalld

查看状态: systemctl status firewalld

禁用,禁止开机启动: systemctl disable firewalld

停止运行: systemctl stop firewalld

2.配置firewalld-cmd

查看版本: firewall-cmd --version

查看帮助: firewall-cmd --help

显示状态: firewall-cmd --state

查看所有打开的端口: firewall-cmd --zone=public --list-ports

更新防火墙规则: firewall-cmd --reload

更新防火墙规则,重启服务: firewall-cmd --completely-reload

查看已激活的Zone信息: firewall-cmd --get-active-zones

查看指定接口所属区域: firewall-cmd --get-zone-of-interface=eth0

拒绝所有包:firewall-cmd --panic-on

取消拒绝状态: firewall-cmd --panic-off

查看是否拒绝: firewall-cmd --query-panic

3.信任级别,通过Zone的值指定

drop: 丢弃所有进入的包,而不给出任何响应

block: 拒绝所有外部发起的连接,允许内部发起的连接

public: 允许指定的进入连接

external: 同上,对伪装的进入连接,一般用于路由转发

dmz: 允许受限制的进入连接

work: 允许受信任的计算机被限制的进入连接,类似 workgroup

home: 同上,类似 homegroup

internal: 同上,范围针对所有互联网用户

trusted: 信任所有连接

4.firewall开启和关闭端口

以下都是指在public的zone下的操作,不同的Zone只要改变Zone后面的值就可以

添加:

firewall-cmd --zone=public --add-port=80/tcp --permanent (--permanent永久生效,没有此参数重启后失效)

重新载入:

firewall-cmd --reload

查看:

firewall-cmd --zone=public --query-port=80/tcp

删除:

firewall-cmd --zone=public --remove-port=80/tcp --permanent

5.管理服务

以smtp服务为例, 添加到work zone

添加:

firewall-cmd --zone=work --add-service=smtp

查看:

firewall-cmd --zone=work --query-service=smtp

删除:

firewall-cmd --zone=work --remove-service=smtp

5.配置 IP 地址伪装

查看:

firewall-cmd --zone=external --query-masquerade

打开:

firewall-cmd --zone=external --add-masquerade

关闭:

firewall-cmd --zone=external --remove-masquerade

6.端口转发

打开端口转发,首先需要打开IP地址伪装

firewall-cmd --zone=external --add-masquerade

转发 tcp 22 端口至 3753:

firewall-cmd --zone=external --add-forward-port=22:porto=tcp:toport=3753

转发端口数据至另一个IP的相同端口:

firewall-cmd --zone=external --add-forward-port=22:porto=tcp:toaddr=192.168.1.112

转发端口数据至另一个IP的 3753 端口:

firewall-cmd --zone=external --add-forward-port=22:porto=tcp::toport=3753:toaddr=192.168.1.112

6.systemctl是CentOS7的服务管理工具中主要的工具,它融合之前service和chkconfig的功能于一体。

启动一个服务:systemctl start firewalld.service

关闭一个服务:systemctl stop firewalld.service

重启一个服务:systemctl restart firewalld.service

显示一个服务的状态:systemctl status firewalld.service

在开机时启用一个服务:systemctl enable firewalld.service

在开机时禁用一个服务:systemctl disable firewalld.service

查看服务是否开机启动:systemctl is-enabled firewalld.service

查看已启动的服务列表:systemctl list-unit-files|grep enabled

查看启动失败的服务列表:systemctl --failed

Centos下配置firewalld实现nat路由转发

firewalld介绍:

nat介绍:

1. 准备两台虚拟机:nat01, nat02 (centos, 安装时选择安装类型,nat02需要有浏览器)

2. 转发用虚拟机[nat01]准备两张网卡,一张网卡与要测试环境网络互通,一张网卡与局域网虚拟机[nat02]网络互通

3. 局域网虚拟机[nat02]与转发用虚拟机网络互通,相同网段,且网关为[nat01]ip地址(修改ifcfg-eth0文件后重启网络即可)

    nat01:33.33.33.35  nat02:33.33.33.52

4. 配置转发用虚拟机[nat01]:

 step1:内核参数文件sysctl.conf配置ip转发

    vi /etc/sysctl.conf

    在文本内容中添加:net.ipv4.ip_forward = 1

    保存文件后,输入命令sysctl -p生效

step2:开启firewalld.service 

    systemctl start firewalld.service #开启

    systemctl enable firewalld.service #开机自启动

step3:防火墙开启伪装IP功能

    firewall-cmd --add-masquerade --permanent#允许防火墙伪装IP

    firewall-cmd --query-masquerade #检查是否允许伪装IP

    firewall-cmd --reload #重载配置文件生效

step4:开放端口:

    firewall-cmd --zone=public --add-port=10020/tcp --permanent #开放通过tcp访问10020

    firewall-cmd --list-ports #查看开放端口

    firewall-cmd --reload #重载配置文件生效

step5:端口转发

    firewall-cmd --zone=public--add-forward-port=port=10020:proto=tcp:toport=443:toaddr=192.25.1.2 --permanent

    # 将10020端口的流量转发到192.25.1.2:443

    firewall-cmd --reload

    ps:zone=external 针对伪装进入连接,一般用于路由转发

        --permanent 永久生效

        192.25.1.2:443 修改为需要访问环境的IP和开放端口

5. 测试

    登录[nat02]虚拟机,进入ssh终端,wget 33.33.33.35:10020

    进入浏览器,访问:33.33.33.35:10020   --》自动跳转到环境地址,访问正常

    ps:若需要访问地址是https,则在浏览器中输入:

firewalld配置

1.使用firewalld配置的防火墙策略默认为运行时(Runtime)模式,又称为当前生效模式,而且随着系统的重启会失效。

2.想让配置策略一直存在,就需要使用永久(Permanent)模式了,方法就是在用firewall-cmd命令正常设置防火墙策略时添加--permanent参数,永久生效模式设置的策略只有在系统重启之后才能自动生效。

3.如果想让配置的策略立即生效,需要手动执行firewall-cmd --reload命令。

4.启动/关闭firewalld防火墙服务的应急状况模式,阻断一切网络连接(当远程控制服务器时请慎用):

[root@localhost ~]# firewall-cmd --panic-on

success

[root@localhost ~]# firewall-cmd --panic-off

success

5.流量转发

命令格式为firewall-cmd --permanent --zone=区域 --add-forward-port=port=源端口号:proto=协议:toport=目标端口号:toaddr=目标IP地址

eg:把原本访问本机888端口的流量转发到22端口,要且求当前和长期均有效

[root@localhost ~]# firewall-cmd --permanent --zone=public --add-forward-port=port=888:proto= tcp:toport=22:toaddr=192.168.10.10

success

[root@localhost ~]# firewall-cmd --reload

success

6.拒绝访问(富规则)

firewalld可以针对系统服务、端口号、源地址和目标地址等诸多信息进行更有针对性的策略配置。它的优先级在所有的防火墙策略中也是最高的。

eg:

firewalld服务中配置一条富规则,使其拒绝192.168.10.0/24网段的所有用户访问本机的ssh服务(22端口):

[root@localhost ~]# firewall-cmd --permanent --zone=public --add-rich-rule="rule family="ipv4" source address="192.168.10.0/24" service name="ssh" reject"

success

[root@localhost ~]# firewall-cmd --reload

success

赞(0)
文章名称:《firewalld(firewall的有哪几种规则)》
文章链接:https://www.fzvps.com/152118.html
本站文章来源于互联网,如有侵权,请联系管理删除,本站资源仅供个人学习交流,请于下载后24小时内删除,不允许用于商业用途,否则法律问题自行承担。
图片版权归属各自创作者所有,图片水印出于防止被无耻之徒盗取劳动成果的目的。

评论 抢沙发

评论前必须登录!