第2篇:Linux防火墙-firewalld的rich规则配置

1.防火墙firewall的基本概述

现在的RedHat/CentOS7版本默认都使用firewall防火墙了,firewall的配方法大致可以分为图形化和命令行。firewalld跟iptables比起来,不好的地方是每个服务都需要去设置才能放行,因为默认是拒绝。而iptables里默认是每个服务是允许,需要拒绝的才去限制。
firewalld自身并不具备防火墙的功能,而是和iptables一样需要通过内核的netfilter来实现,也就是说firewalld和 iptables一样,他们的作用都是用于维护规则,而真正使用规则干活的是内核的netfilter,只不过firewalld和iptables的结构以及使用方法不一样罢了。
wiki百科↓
Firewalld - Fedora Project Wiki

2.防火墙使用区域管理

阻塞区域(block):任何传入的网络数据包都将被阻止。
工作区域(work):相信网络上的其他计算机,不会损害你的计算机。
家庭区域(home):相信网络上的其他计算机,不会损害你的计算机。
公共区域(public):不相信网络上的任何计算机,只有选择接受传入的网络连接。
隔离区域(DMZ):隔离区域也称为非军事区域,内外网络之间增加的一层网络,起到缓冲作用。对于隔离区域,只有选择接受传入的网络连接。
信任区域(trusted):所有的网络连接都可以接受。
丢弃区域(drop):任何传入的网络连接都被拒绝。
内部区域(internal):信任网络上的其他计算机,不会损害你的计算机。只有选择接受传入的网络连接。
外部区域(external):不相信网络上的其他计算机,不会损害你的计算机。只有选择接受传入的网络连接。

注:FirewallD的默认区域是public。
firewalld默认提供了九个zone配置文件:block.xml、dmz.xml、drop.xml、external.xml、 home.xml、internal.xml、public.xml、trusted.xml、work.xml,他们都保存在“/usr/lib /firewalld/zones/”目录下。

3、查看当前区域:firewall-cmd --get-default-zone,设置当前区域为--set-default-zone,创建区域为--new-zone

4、内部端口转发:

firewall-cmd -- add-rich-rule='rule family=ipv4 forward-port port=2222 protocol=tcp to-port=22 ' --permanent 

5、查看预定义的服务列表:firewall-cmd --get-services

6、显示区域预定义:firewall-cmd --zone=external|internal|etc. --list-all

在某些情况下,我们可能需要创建更复杂的规则,而不仅仅是允许区域中的某些端口或服务。例如,我们可能想要创建一条规则来阻止来自特定机器的某种类型的流量。这就是rich规则的意义所在。规则基本上由两部分组成:在第一部分中,我们指定要应用规则必须满足的条件,在第二部分中,指定要执行的操作:accept、drop或reject

实验目的

在下面的实验拓网络拓扑中,防火墙的 ens33网卡是分配到external区域,ens34网卡分配的internal区域

第2篇:Linux防火墙-firewalld的rich规则配置_第1张图片


我们的实现目的是防止特定外网(用192.168.168.0/24来模拟)的主机192.168.168.105访问我们防火墙的ssh服务

我们先来看看防火墙本身的一些以下是external区域的预配置

第2篇:Linux防火墙-firewalld的rich规则配置_第2张图片

以下是internal区域的预配置

第2篇:Linux防火墙-firewalld的rich规则配置_第3张图片

拦截来自外部网路中IP为192.168.168.105主机的流量:我们将如何组成我们的规则,事实上,就是iptables规则的一种变相语法:

firewall-cmd --zone=external --add-rich-rule="rule \
family="ipv4" \
source address=192.168.168.105 \
service name=ssh 
reject \"

rich规则详解

  • --add-rich-rule选项,将该规则描述为其参数。规则以rule关键字开头。
    • family:我们指定该规则仅应用于IPv4数据包:如果未提供此关键字,则该规则将同时应用于IPv4和IPv6。
    • source address:我们提供数据包必须具有的源地址,才能使用源地址触发规则。
    • service,我们指定了规则的服务类型,在本例中为ssh。
    • reject/drop/accept,我们提供了数据包与规则匹配时要执行的操作,在本例中为reject.

当我们将上面的rich规则添加的external区域,我们192.168.168.105再也无法访问到防火墙的外部接口192.168.168.106了。这是rich规则的一个简单用法

第2篇:Linux防火墙-firewalld的rich规则配置_第4张图片

上面的一个非常简单,但是规则可能变得非常复杂。您应该查看firewalld文档,以查看所有可用设置和选项的范围。

rich规则的其他命令行参数

可以查看如下表,里面列举了rich规则常用的方法

第2篇:Linux防火墙-firewalld的rich规则配置_第5张图片


我这里没必要一一列出示例,我们先将刚才添加的rich规则删掉

firewall-cmd --zone=external --remove-rich-rule=" \
rule family="ipv4" \
 source address="192.168.168.105" \
service name="ssh"  \
reject"

Rich规则的优先级

首先我们在解析这个问题,仍然使用上面的例子,比如我们希望只有192.168.50.17的主机能够远程ssh到防火墙,而同一网络192.168.50.0/24的其他主机我们禁止其他访问。

第2篇:Linux防火墙-firewalld的rich规则配置_第6张图片

在写rich规则时,往往会遇到两条冲突的规则。例如,为了只允许来自192.168.50.0/24网络的一台主机192.168.50.17允许通过ssh访问防火墙,显然下面的规则是不可取的

  • 规则1:-拒绝来自192.168.50.0/24网络的所有主机(drop/reject)
  • 规则2:-允许来自192.168.50.17的主机(accept)

由于192.168.50.17主机也属于192.168.50.0/24这个网络号,因此这两个规则都将应用于该主机,如果你对iptables规则熟悉的话,可能会去如下这样理解防火墙匹配规则的行为。

  1. 仅处理入站的数据包
  2. 数据包始终以从上到下的方向进行处理
    • Step1:一旦数据包与规则匹配,将立即对该数据包执行关联操作(允许或拒绝)。
    • Step2:数据包将不可用于进一步处理。

然后可能就许就这样定义防火墙的规则:

  • 规则1:允许来自192.168.50.17的主机(accept)
  • 规则2:拒绝来自192.168.50.0/24网络的所有主机(drop/reject)

规则精确度越高的放在规则列表的最前,逻辑上应该是先设定accept行为的规则,然后再设定drop/reject行为的规则,这样的逻辑在iptables是正确,甚至其他传统的防火墙也是这样行为逻辑的。但你要搞清楚,到了firewalld的rich规则就不适用了。为了证实这一说法,我么参考了firewalld.org的技术文档,请好好理解图中划黄线的一段话。

第2篇:Linux防火墙-firewalld的rich规则配置_第7张图片


中文的翻译

当前的rich规则的一个问题是,它们是基于规则操作来组织的。 日志规则始终在拒绝规则之前发生。 拒绝规则总是发生在允许规则之前。 这导致用户感到困惑,因为它隐式地对规则进行了重新排序。 这也使得不可能添加全面的rich规则来拒绝流量。

因此firewalld的rich规则执行逻辑如下:

  1. 日志规则
  2. drop/reject规则
  3. accept规则

实验示例

目标:验证rich规则的潜在问题

  • 我们允许192.168.50.0/24所有网络访问局域网的10.10.10.1上的远程桌面
  • 允许192.168.50.17的主机通过ssh访问防火墙
  • 拒绝192.168.50.0/24其他主机通过ssh访问防火墙
  • 拒绝所有来自192.168.50.0/24对防火墙的ping请求

进行上面的拓扑实验前,我们检测一下防火墙的状态

第2篇:Linux防火墙-firewalld的rich规则配置_第8张图片


在Linux管理配置防火墙时,先在文本编辑器将你的思路理顺了,然后一条条命令拷贝到shell中回车,是一种很好的习惯,这些命令能出错的话,我们部署到生产环境再写成shell或python脚本程序。

rich规则有两种书写方法,你不得不吐嘈:"这些地球上最丑陋的命令形式,没有之一",你不管使用那种形式,都很容易出错,所以建议你在文件编辑器修改到没有毛病才粘贴到shell终端窗口中。

  • 不换行风格--add-rich-rule=之后的规则内容用单引号括起来,见下图第一个的命令
  • 换行风格,需要了解一些shell解析器的基础,说明见下图第二个命令

     

    第2篇:Linux防火墙-firewalld的rich规则配置_第9张图片

允许192.168.50.0/24所有主机网络访问局域网的10.10.10.1上的远程桌面

firewall-cmd --zone=external --add-forward-port=\
port=3389:proto=tcp:toport=3389:toaddr=10.10.10.1

允许192.168.50.17的主机通过ssh访问防火墙

firewall-cmd --zone=external --add-rich-rule="rule \
family="ipv4" \
source address="192.168.50.17" \
service name="ssh" \
log prefix=\"ssh connect from:\" \
level="notice" \
accept"

拒绝192.168.50.0/24的其他主机访问防火墙的ssh服务

firewall-cmd  --zone=external --add-rich-rule="rule \
family="ipv4" \
source address="192.168.50.0/24" \
service name="ssh" \
log prefix=\"ssh reject from:\" \
level="notice" \
drop"

拒绝所有来自192.168.50.0/24对防火墙的ping请求

firewall-cmd  --zone=external --add-rich-rule="rule \
protocol value="icmp" \
reject"

ok,整个过程没出错

第2篇:Linux防火墙-firewalld的rich规则配置_第10张图片


我们使用以下命令查看,刚才在external区域配置的rich规则

firewall-cmd --zone=external --list-rich-rules

实验的重点:就是要验证第一条rich的规则是否会被优先执行,还是第二条drop规则会先于第一条accept规则执行?

第2篇:Linux防火墙-firewalld的rich规则配置_第11张图片

我们在192.168.50.17的主机上测试一下能否ssh到防火墙?如下图ssh请求无响应且没有错误提示返回,这里至少已经证实

  • 即便在规则列表中accept规则位置先于drop规则,但是drop规则总是会优先于accept规则被匹配
  • 已经无法ping通防火墙,并且由防火墙返回错误信息

    第2篇:Linux防火墙-firewalld的rich规则配置_第12张图片

防火墙的端口转发测试,192.168.50.17是一台Ubuntu主机,我们使用Remmina远程桌面软件连接到内网10.10.10.1的主机

第2篇:Linux防火墙-firewalld的rich规则配置_第13张图片

OK,端口转发也是成功

第2篇:Linux防火墙-firewalld的rich规则配置_第14张图片

那么实现遗留的问题,就是rich规则如何能如我们所愿地定的规则顺序执行?这正是本文的重点

Rich规则的priority字段

新版的firewalld添加了新的priority字段。它可以是-32768到32767之间的任何数字,其中数字越小,优先级越高。此范围足够大,以允许从脚本或其他实体自动生成规则。

那么就非常简单:只需在你想优先执行的rich规则中给priority字段定义一个足够小的负数,就能确保能优先于其他drop/reject规则被firewalld匹配。如下图所示

第2篇:Linux防火墙-firewalld的rich规则配置_第15张图片

Ok,此时,accept的规则优先于其他drop/reject规则被匹配,这正是我们所希望的。

第2篇:Linux防火墙-firewalld的rich规则配置_第16张图片

按照我上面的实验步骤,应该没什么问题,能达到预期实验的目地,结束本篇之前,要记得
将上面的运行时配置转化为持久配置,执行下面命令

firewall-cmd --runtime-to-permanent

小结

目前,rich规则的定义,至少目前来说我算是全简书里解说地很清楚了,但rich规则的语法是非常令人恶心的,这点不容否认。

你可能感兴趣的:(centos,ssh)