RHEL 8系统中集成了多款防火墙管理工具,其中firewalld(Dynamic Firewall Manager of Linux systems,Linux系统的动态防火墙管理器)服务是默认的防火墙配置管理工具,它拥有基于CLI(命令行界面)和基于GUI(图形用户界面)的两种管理方式。

常用的区域名称及策略规则

参数作用
--get-default-zone查询默认的区域名称
--set-default-zone=<区域名称>设置默认的区域,使其永久生效
--get-zones显示可用的区域
--get-services显示预先定义的服务
--get-active-zones显示当前正在使用的区域与网卡名称
--add-source=将源自此IP或子网的流量导向指定的区域
--remove-source=不再将源自此IP或子网的流量导向某个指定区域
--add-interface=<网卡名称>将源自该网卡的所有流量都导向某个指定区域
--change-interface=<网卡名称>将某个网卡与区域进行关联
--list-all显示当前区域的网卡配置参数、资源、端口以及服务等信息
--list-all-zones显示所有区域的网卡配置参数、资源、端口以及服务等信息
--add-service=<服务名>设置默认区域允许该服务的流量
--add-port=<端口号/协议>设置默认区域允许该端口的流量
--remove-service=<服务名>设置默认区域不再允许该服务的流量
--remove-port=<端口号/协议>设置默认区域不再允许该端口的流量
--reload让“永久生效”的配置规则立即生效,并覆盖当前的配置规则
--panic-on开启应急状况模式
--panic-off关闭应急状况模式

与Linux系统中其他的防火墙策略配置工具一样,使用firewalld配置的防火墙策略默认为运行时(Runtime)模式,又称为当前生效模式,而且会随着系统的重启而失效。如果想让配置策略一直存在,就需要使用永久(Permanent)模式了,方法就是在用firewall-cmd命令正常设置防火墙策略时添加--permanent参数,这样配置的防火墙策略就可以永久生效了。但是,永久生效模式有一个“不近人情”的特点,就是使用它设置的策略只有在系统重启之后才能自动生效。如果想让配置的策略立即生效,需要手动执行firewall-cmd --reload命令。

Runtime:当前立即生效,重启后失效。
Permanent:当前不生效,重启后生效。
systemctl start firewalld #开启防火墙
systemctl stop firewalld  #关闭防火墙
systemctl restart firewalld  #重启防火墙
systemctl status firewalld #查看防火墙状态

示例

1.查看firewalld服务当前所使用的区域。

这是一步非常重要的操作。在配置防火墙策略前,必须查看当前生效的是哪个区域,否则配置的防火墙策略将不会立即生效。
[root@53 ~]# firewall-cmd --get-default-zone
public

2.查询指定网卡在firewalld服务中绑定的区域。

在生产环境中,服务器大多不止有一块网卡。一般来说,充当网关的服务器有两块网卡,一块对公网,另外一块对内网,那么这两块网卡在审查流量时所用的策略肯定也是不一致的。因此,可以根据网卡针对的流量来源,为网卡绑定不同的区域,实现对防火墙策略的灵活管控。
[root@53 ~]# firewall-cmd --get-zone-of-interface=ens160
public

3.把网卡默认区域修改为external,并在系统重启后生效。

[root@53 ~]# firewall-cmd --permanent --zone=external --change-interface=ens160
The interface is under control of NetworkManager, setting zone to 'external'.
success
[root@53 ~]# firewall-cmd --permanent --get-zone-of-interface=ens160
external

4.把firewalld服务的默认区域设置为public。

默认区域也叫全局配置,指的是对所有网卡都生效的配置,优先级较低。在下面的代码中可以看到,当前默认区域为public,而ens160网卡的区域为external。此时便是以网卡的区域名称为准。
[root@53 ~]# firewall-cmd --set-default-zone=public
Warning: ZONE_ALREADY_SET: public
success
[root@53 ~]# firewall-cmd --get-default-zone 
public
[root@53 ~]# firewall-cmd --get-zone-of-interface=ens160
externa

5.启动和关闭firewalld防火墙服务的应急状况模式。



[root@53 ~]# firewall-cmd --panic-on
success
[root@53 ~]# firewall-cmd --panic-off
success

6.查询SSH和HTTPS协议的流量是否允许放行。


在工作中可以不使用--zone参数指定区域名称,firewall-cmd命令会自动依据默认区域进行查询,从而减少用户输入量。但是,如果默认区域与网卡所绑定的不一致时,就会发生冲突,因此规范写法的zone参数是一定要加的。

[root@53 ~]# firewall-cmd --zone=public --query-service=ssh
yes
[root@53 ~]# firewall-cmd --zone=public --query-service=https
no

7.把HTTPS协议的流量设置为永久允许放行,并立即生效。

默认情况下进行的修改都属于Runtime模式,即当前生效而重启后失效,因此在工作和考试中尽量避免使用。而在使用--permanent参数时,则是当前不会立即看到效果,而在重启或重新加载后方可生效。于是,在添加了允许放行HTTPS流量的策略后,查询当前模式策略,发现依然是不允许放行HTTPS协议的流量:

[root@53 ~]# firewall-cmd --permanent --zone=public --add-service=https
success
[root@53 ~]# firewall-cmd --zone=public --query-service=https
no

不想重启服务器的话,就用--reload参数吧:

[root@53 ~]# firewall-cmd --reload
success
[root@53 ~]# firewall-cmd --zone=public --query-service=https
yes

8.把HTTP协议的流量设置为永久拒绝,并立即生效。

由于在默认情况下HTTP协议的流量就没有被允许,所以会有“Warning: NOT_ENABLED: http”这样的提示信息,因此对实际操作没有影响。
[root@53 ~]# firewall-cmd --permanent --zone=public --remove-service=http
Warning: NOT_ENABLED: http
success
[root@53 ~]# firewall-cmd --reload
success

9.把访问8080和8081端口的流量策略设置为允许,但仅限当前生效。

[root@53 ~]# firewall-cmd --zone=public --add-port=8080-8081/tcp
success
[root@53 ~]# firewall-cmd --zone=public --list-ports
8080-8081/tcp
[root@53 ~]# 

10.把原来访问本机的888端口的流量转发到22端口,要求当前和长期有效

如果想让用户通过其他端口号也能访问ssh服务,就可以试试端口转发技术了。通过这项技术,新的端口号在收到用户请求后会自动转发到原本服务的端口上,使得用户能够通过新的端口访问到原本的服务。
--语法格式--
firewall-cmd --permanent --zone=<区域> --add-forward-port=port=<源端口号>:proto=<协议>:toport=<目标端口号>:toaddr=<目标IP地址>
[root@53 ~]# firewall-cmd --permanent --zone=public --add-forward-port=port=888:proto=tcp:toport=22:toaddr=192.168.1.116  ##192.168.1.116本机IP                         
success
[root@53 ~]# firewall-cmd --reload
success

11.富规则的设置

富规则也叫复规则,表示更细致、更详细的防火墙策略配置,它可以针对系统服务、端口号、源地址和目标地址等诸多信息进行更有针对性的策略配置。它的优先级在所有的防火墙策略中也是最高的。比如,我们可以在firewalld服务中配置一条富规则,使其拒绝192.168.10.0/24网段的所有用户访问本机的ssh服务(22端口):
[root@53 ~]# firewall-cmd --permanent --zone=public --add-rich-rule="rule family="ipv4" source address="192.168.10.0/24" service name="ssh" reject"
success
[root@53 ~]# firewall-cmd --reload
success

测试用192.168.10.0网段的机器访问本机22端口
[root@dosbat ~]# ssh 192.168.1.116
Connecting to 192.168.1.116:22...
Could not connect to '192.168.1.116' (port 22): Connection failed.
最后修改:2022 年 08 月 01 日
如果觉得我的文章对你有用,请随意赞赏