目录
防火墙介绍
防⽕墙是保护机器不受来⾃外部的、不需要的⽹络数据的⼀种⽅式。它允许⽤⼾通过定义⼀组防
⽕墙规则来控制主机上的⼊站⽹络流量。这些规则⽤于对进⼊的流量进⾏排序,并可以阻断或允
许流量。
firewalld 是⼀个防⽕墙服务守护进程
firewalld 使⽤区和服务的概念来简化流量管理。
----zones 是预定义的规则集。⽹络接⼝和源可以分配给区。允许的流量取决于您计算机连接到的⽹络,并分配了这个⽹络的安全级别。
----防⽕墙服务是预定义的规则,覆盖了允许特定服务进⼊流量的所有必要设置,并在区中应⽤。
服务使⽤⼀个或多个端⼝或地址进⾏⽹络通信。防⽕墙会根据端⼝过滤通讯。要允许服务的⽹络
流量,必须打开其端⼝。 firewalld 会阻⽌未明确设置为打开的端⼝的所有流量。⼀些区
(如可信区)默认允许所有流量。
zones
可以根据⽤⼾对该⽹络中的接⼝和流量设置的信任程度,使⽤ firewalld 来将⽹络划分为
不同的区。⼀个连接只能是⼀个区的⼀部分,但⼀个区可以被⽤来进⾏很多⽹络连接。
已经存在的预定义的区存储在 /usr/lib/firewalld/zones/ 文件中
[redhat@bogon ansible]$ ll /usr/lib/firewalld/zones/
total 44
-rw-r--r--. 1 root root 299 Jul 30 2021 block.xml
-rw-r--r--. 1 root root 293 Jul 30 2021 dmz.xml
-rw-r--r--. 1 root root 291 Jul 30 2021 drop.xml
-rw-r--r--. 1 root root 304 Jul 30 2021 external.xml
-rw-r--r--. 1 root root 397 Jul 30 2021 home.xml
-rw-r--r--. 1 root root 412 Jul 30 2021 internal.xml
-rw-r--r--. 1 root root 809 Nov 27 2019 libvirt.xml
-rw-r--r--. 1 root root 729 Aug 18 2021 nm-shared.xml
-rw-r--r--. 1 root root 343 Jul 30 2021 public.xml
-rw-r--r--. 1 root root 162 Jul 30 2021 trusted.xml
-rw-r--r--. 1 root root 339 Jul 30 2021 work.xml
各个文件介绍
block.xml 任何传⼊的⽹络连接都会被拒绝 ,只有从系统启动的⽹络连接才能进⾏。
dmz.xml 对于您的⾮企业化区⾥的计算机来说,这些计算机可以被公开访问,且有限访问您的内部⽹络。只接受所选的⼊站连接。
drop.xml 所有传⼊的⽹络数据包都会丢失,没有任何通知。只有外发⽹络连接也是可⾏的。
external 适⽤于启⽤了伪装的外部⽹络,特别是路由器。您不信任⽹络中的其他计算机不会损害您的计算机。只接受所选的⼊站连接。
home.xml ⽤于家⽤,因为您可以信任其他计算机。只接受所选的⼊站连接。
internal.xml 当您主要信任⽹络中的其他计算机时,供内部⽹络使⽤。只接受所选的⼊站连接。
public.xml 可⽤于您不信任⽹络中其他计算机的公共区域。只接受所选的⼊站连接
trusted.xml 所有⽹络连接都被接受。
work.xml 可⽤于您主要信任⽹络中其他计算机的⼯作。只接受所选的⼊站连接。
安装防火墙时,默认在public区域
预定义服务
服务可以是本地端⼝、协议、源端⼝和⽬的地列表,并在启⽤了服务时⾃动载⼊防⽕墙帮助程序
模块列表。使⽤服务可节省⽤⼾时间,因为它们可以完成⼀些任务,如打开端⼝、定义协议、启
⽤数据包转发等等,⽽不必在另外的步骤中设置所有任务。
服务配置选项和通⽤⽂件信息在 firewalld.service(5) ⼿册⻚中进⾏了描述。
可 使 ⽤ 图 形 化 的 firewall-config ⼯ 具 、 firewall-cmd 和 firewall-offline-cmd来添加和删除服务。
或者可以在 /etc/firewalld/services/ 目录中编辑xml 文件,如果⽤⼾没有添加或更改服务,则在 /etc/firewalld/services/ 中找不到相应的xml文件,如果要添加或更改服务,/usr/lib/firewalld/services/文件可以作为参考
firewalld启动与停止
请在root身份下进行启动停止操作
开启
systemctl unmask firewalld
systemctl start firewalld
关闭
systemctl stop firewalld
systemctl disable firewalld
unmask: 将不标记 firewalld 服务 ,如果为 mask 无论怎么都不启动防火墙
stop: 停止防火墙,重新启动系统时还是会重新启动防护墙
disable: 在系统重新启动时也不启动防火墙
查看firewalld当前状态和设置
firewarll-cmd --state 显示状态
systemctl status firewalld.service 更详细的
使⽤ CLI 查看 firewalld 设置
firewalld 使⽤区来管理流量。如果没有通过 --zone 指定区域,则 该命令会将其分配到默认的区域
列出默认区所以相关信息
firewall-cmd --list-all
列出指定区域的相关信息
firewall-cmd --list-all --zone=block
查看帮助信息
irewall-cmd --help
firewalld控制流量
firewalld 软件包安装⼤量预定义的服务⽂件,您可以添加更多或⾃定义它们。然后,您可以使⽤这些服务定义为服务打开或关闭端⼝,⽽⽆需了解这些服务使⽤的协议和端⼝号。
使⽤ CLI 禁⽤紧急事件的所有流量
1,要⽴即禁⽤⽹络流量,请切换 panic 模式:
启⽤ panic 模式可停⽌所有⽹络流量。因此,只有当您具有对机器的物理访问权限或使⽤串⾏控制台登录时,才应使⽤它。
firewall-cmd --panic-on
使⽤ CLI 控制预定义服务的流量
控制流量的最简单的⽅法是在 firewalld 中添加预定义的服务,这会打开所有必需的端⼝并根据 服务定义⽂件 修改其他设置。
列出被添加的服务
firewall-cmd --list-services
列出所有的预定义服务
firewall-cmd --get-services
在允许的服务中添加服务
firewall-cmd --add-service=http 默认在默认区域添加,但是重载后该服务就会不见,需要重新添加
永久添加这个服务
firewall-cmd --add-service=http --permanent 重载后也不会不见
使⽤ CLI 控制端⼝
端⼝是可让操作系统接收和区分⽹络流量并将其转发到系统服务的逻辑设备。它们通常由侦听端⼝的守护进程来表⽰,它会等待到达这个端⼝的任何流量。
通常,系统服务侦听为它们保留的标准端⼝。例如, httpd 守护进程监听 80 端⼝。但默认情况下,系统管理员会将守护进程配置为在不同端⼝上侦听以便增强安全性或出于其他原因。
打开端口
通过打开端⼝,系统可从外部访问,这代表了安全⻛险。通常,让端⼝保持关闭,且只在某些服务需要时才打开。
列出所有允许的端口
firewall-cmd --list-ports
在允许的端⼝中添加⼀个端⼝,以便为⼊站流量打开这个端⼝
firewall-cmd --add-port=80/tcp 添加80端口,类型为tcp
端⼝类型为 tcp,udp ,sctp,dccp 这个类型必须与⽹络通信的类型匹配
关闭端口
当打开的端⼝不再需要时,在 firewalld 中关闭此端⼝。强烈建议您尽快关闭所有不必要的端⼝,因为端⼝处于打开状态会存在安全隐患。
从允许的端口中删除端口,以便对传⼊的流量关闭
firewall-cmd --remove-port=80/tcp
使用 firewalld 区
zones 代表⼀种更透明管理传⼊流量的概念。这些区域连接到联⽹接⼝或者分配⼀系列源地址。您可以独⽴为每个区管理防⽕墙规则,这样就可以定义复杂的防⽕墙设置并将其应⽤到流量。
列出系统中可用的区域
firewall-cmd --get-zones
查看所有系统中可用区的详细信息:
firewall-cmd --list-all-zones
更改特定区的 firewalld 设置
例如,要允许在区public 中使⽤ SSH 服务
firewall-cmd --add-service=ssh --zone=public
更改默认区
系统管理员在其配置⽂件中为⽹络接⼝分配区域。如果接⼝没有被分配给指定区,它将被分配给默认区。每次重启 firewalld 服务后,firewalld 会加载默认区的设置,并使其处于活动状态。
当系统的前默认区
firewall-cmd --get-default-zone
设置默认区为home区
firewall-cmd --set-default-zone home
将网络接口分配给区
列出活跃区以及分配给它们的接⼝
[root@bogon ~]# firewall-cmd --get-active-zones
public
interfaces: ens160
使用nmcli 命令为连接分配区域
nmcli connection modify ens160 connection.zone public 分配到public区
创建⼀个新区
要使⽤⾃定义区,创建⼀个新的区并使⽤它像预定义区⼀样。新区需要 --permanent 选项,否则命令⽆法正常⼯作。
例:创建⼀个新区testzone
[root@bogon ~]# firewall-cmd --new-zone=testzone --permanent
[root@bogon ~]# firewall-cmd --reload
success
[root@bogon ~]# firewall-cmd --get-zones
block dmz drop external home internal libvirt nm-shared public testzone trusted work
可在文件 /etc/firewalld/zones/ 中看到新建的区
使⽤区⽬标设定传⼊流量的默认⾏为
对于每个区,您可以设置⼀种处理尚未进⼀步指定的传⼊流量的默认⾏为。此⾏为是通过设置区的⽬标来定义的。有四个选项:
ACCEPT :接受除特定规则不允许的所有传⼊的数据包。
REJECT :拒绝所有传⼊的数据包,但特定规则允许的数据包除外。当firewalld 拒绝数据包时,源 机器会发出有关拒绝的信息。
DROP:除⾮由特定规则允许,丢弃所有传⼊数据包。当firewalld 丢弃数据包时,源 机器不会发出有关丢弃的信息。
default:与 REJECT 的⾏为类似,但在某些情况下有特殊含义。详情请查看 firewalld-cmd(1)man page 中的 Options to Adapt and Query Zones and Policies 部分。
列出特定区的信息以查看默认⽬标:
[root@bogon ~]# firewall-cmd --zone=public --list-all
public (active)
target: default
icmp-block-inversion: no
interfaces: ens160
sources:
services: cockpit dhcpv6-client http ssh
ports:
protocols:
forward: no
masquerade: no
forward-ports:
source-ports:
icmp-blocks:
rich rules:
给区设定新的目标
firewall-cmd --permanent --zone=public --set-target=ACCEPT
综合运用
定义2个虚拟机node1,node2
1,在node1主机上配置chrony时间服务器,将该主机作为时间服务器。
2,在node1主机上创建防火墙区域testzone,将node1主机网络接口接入该区域
3,在node1将该防火定义为允许chrony服务通过。
4,在node2主机上配置chrony时间客户段,该主机将node1主机作为时间源服务器
5,配置完防火墙服务后,node1和node2主机的时间服务器可正常工作。
大概思路:
1,首先要知道2个主机的ip ,在各自主机中配置chrony服务器,服务端的时间向真正的网络中请求,客户端的时间向主机node1请求
2,时间服务器配置准备好了后,再到node1上配置防火墙,防火墙不能关闭,导致node2不能直接获取到node1时间,所以为了客户端访问到node1 的时间就需要在node1进行防火墙操作,怎么操作?
3,先知道node1 主机对chrony 监听的端口,然后将这个端口以及对应的协议添加到testznoe 区域。
步骤
步骤1: 首先要知道服务器和客户的ip地址或者主机名字,如下:
客户端:192.168.190.128
服务器:192.168.190.129
2,更改临时主机名
192.168.190.128 设置为 node2
192.168.190.129 设置为 node1
3, 时间服务器的配置
客户端和服务端需要事先安装时间服务器的软件
对node1
[root@node1]# vim /etc/chrony.conf 配置时间服务器的文件
在该文件中写入:
pool 2.rhel.pool.ntp.org iburst 服务器请求网络中的源
allow 192.168.190.128/24 允许来请求时间的主机
保存退出重新启动chronyd
对node2
[root@node2]# vim /etc/chrony.conf 配置时间服务器的文件
在该文件中写入:
pool 192.168.190.129 iburst
保存退出重新启动chronyd
到这里的时候我们尝试用客户端(node2)请求时间,发现怎么请求也不能得到时间
因为服务器开启的,没有允许chrony服务通过
4,node1 主机的防火墙设置
(1),创建防火墙区域testzone
[root@node1]# firewall-cmd --new-zone=testzone --permanent
(2)node1主机网络接口接入该区域
[root@node1]# nmcli c modify ens160 connection.zone testzone
重新载入
[root@node1]# firewall-cmd --reload
查看正活动的区域
[root@node1]# firewall-cmd --get-active-zones
testzone
interfaces: ens160
查看chrony 服务的端口,发现chrony 服务端口为123 ,udp协议
[root@node1]# netstat -lntup | grep chrony
udp 0 0 127.0.0.1:323 0.0.0.0:* 3747/chronyd
udp 0 0 0.0.0.0:123 0.0.0.0:* 3747/chronyd
udp6 0 0 ::1:323 :::* 3747/chrony
(3)防火墙允许chrony 服务通过
[root@node1]# firewall-cmd --permanent --add-port=123/udp --zone=testzone
重新加载
[root@node1]# firewall-cmd --permanent --set-target=ACCEPT --zone=testzone
重新加载
查看testzone 区
[root@bogon ~]# firewall-cmd --list-all --zone=testzone
testzone (accept)
target: default
icmp-block-inversion: no
interfaces: ens160
sources:
services:
ports: 123/udp
protocols:
forward: no
masquerade: no
forward-ports:
source-ports:
icmp-blocks:
rich rules:
最后到node2 主机再次请求时间,发现隔一会就好了
查看node2 chrony 发现有来自 服务器:192.168.190.129 的记录