0%

RHEL/CentOS的firewalld防火墙服务配置

从 RHEL/CentOS 7开始,使用新的防火墙服务——firewalld。这里介绍该防火墙服务的基本用法

abstract.png

防火墙服务管理

从 RHEL/CentOS 7开始采用Systemd作为新的系统管理器,而systemctl则是Systemd中用于管理服务的命令

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
# 启动防火墙服务
systemctl start firewalld

# 停止防火墙服务
systemctl stop firewalld

# 重启防火墙服务
systemctl restart firewalld

# 查看防火墙服务状态
systemctl status firewalld

# 防火墙服务 设置开机自启
systemctl enable firewalld

# 防火墙服务 取消开机自启
systemctl disable firewalld

防火墙配置

firewalld提供了命令行客户端——firewall-cmd用于实现配置、修改防火墙规则

区域

在firewalld中引入zone区域的概念。可以按网卡接口、网络连接的源地址将网络流量归属到不同的区域下进行管理。每个区域使用独立的防火墙规则。故一个网格连接只能属于一个区域,但一个区域拥有多个网络连接。当一个网络流量不属于任何一个区域管理时,则会使用默认区域(通常,该默认区域为public区域)

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
# 查看所有区域的名称
firewall-cmd --get-zones

# 查看所有区域的详情
firewall-cmd --list-all-zones

# 查看指定区域的详情(防火墙规则)
firewall-cmd --zone=<区域名称> --list-all

# 查看默认区域
firewall-cmd --get-default-zone

# 设置默认区域
firewall-cmd --set-default-zone <区域名称>

# 查看活动的区域 及其配置的 网卡接口、源地址
# (一个区域如果配置了 网卡接口 或 网络连接的源地址,即为active zone活动区域)
firewall-cmd --get-active-zones

# 查看指定网卡接口所属的区域
firewall-cmd --get-zone-of-interface=<网卡接口名称>

# 向指定区域 添加 网卡接口
firewall-cmd --zone=<区域名称> --add-interface=<网卡接口名称>

# 从指定区域 移除 网卡接口
firewall-cmd --zone=<区域名称> --remove-interface=<网卡接口名称>

# 查看指定源地址所属的区域
firewall-cmd --get-zone-of-source=<源地址>

# 向指定区域 添加 源地址
firewall-cmd --zone=<区域名称> --add-source=<源地址>

# 从指定区域 移除 源地址
firewall-cmd --zone=<区域名称> --remove-source=<源地址>

控制端口

开放端口

1
2
3
4
5
6
7
8
# 对指定区域,开放端口
firewall-cmd --zone=<区域名称> --add-port=<端口号>[-端口号]/<协议>

# 对public区域,开放tcp协议83端口
firewall-cmd --zone=public --add-port=83/tcp

# 对public区域,开放udp协议的10、11、12、13、14、15端口
firewall-cmd --zone=public --add-port=10-15/udp

删除端口,相当于禁用端口

1
2
3
4
5
6
7
8
# 从指定区域,删除端口
firewall-cmd --zone=<区域名称> --remove-port=<端口号>[-端口号]/<协议>

# 对public区域,删除tcp协议的83端口
firewall-cmd --zone=public --remove-port=83/tcp

# 对public区域,删除udp协议的10、11、12、13、14、15端口
firewall-cmd --zone=public --remove-port=10-15/udp

查看所有开放的端口

1
2
3
4
5
6
7
8
# 查看指定区域下,所有开放的端口
firewall-cmd --zone=<区域名称> --list-ports

# 查询指定区域下,指定协议的端口是否开放,结果yes表示开放,结果no表示未开放
firewall-cmd --zone=<区域名称> --query-port=<端口>/<协议>

# 查看public区域下,tcp协议的19999端口是否开放
firewall-cmd --zone=public --query-port=19999/tcp

使用服务

在firewalld中引入了服务service的概念,可以将其理解为一系列端口的集合。这样只需添加相应的服务到防火墙规则中,即可打开该服务关联的所有端口。firewalld中已经预定义了一部分service服务及其相应的端口

1
2
# 查看所有预定义的服务
firewall-cmd --get-services

figure 1.png

预定义服务的xml文件位于 /usr/lib/firewalld/services/ 下,可通过查看相应服务的xml文件确认其所关联的端口

figure 2.png

此外我们还可以自定义服务及其关联的端口集合,自定义服务xml文件的写法可以去抄预定义服务xml文件的作业;然后将自定义服务的xml文件存放于 /etc/firewalld/services 路径下;最后执行 firewall-cmd —reload 命令,使得自定义服务的xml文件生效。此时就可以像使用预定义服务一样,去使用自定义服务了(自定义服务的服务名即为xml文件的文件名,例如demo1.xml文件对应的服务名即为demo1)

1
2
3
4
5
6
7
8
9
10
11
# 查看指定区域下添加的服务
firewall-cmd --zone=<区域名称> --list-service

# 查询指定区域下,指定的服务是否被添加到该区域,结果yes表示已添加,结果no表示未添加
firewall-cmd --zone=<区域名称> --query-service=<服务名>

# 向指定区域中添加服务
firewall-cmd --zone=<区域名称> --add-service=<服务名>

# 从指定区域中移除服务
firewall-cmd --zone=<区域名称> --remove-service=<服务名>

Note

Runtime Mode 运行时模式、Permanent Mode 永久模式

  • Runtime Mode 运行时模式:通过 firewall-cmd 修改防火墙配置时,默认只会对当前立即有效,即所谓的Runtime Mode 运行时模式。防火墙服务重启后将会失效

  • Permanent Mode 永久模式:如果期望防火墙服务重启后使用新配置,可在firewall-cmd命令中使用 —permanent选项。此时新配置将不会在当前立即生效,而是在重启防火墙服务后永久生效。即所谓的Permanent Mode 永久模式

如果期望同时修改两种模式(运行时模式、永久模式)下的配置,可有下述两种方式实现。这里推荐使用方式1,这样可以实现在将新配置应用到永久模式前,能够立即验证修改配置的效果

  • 方式1
1
2
3
4
5
# 在 运行时模式下 修改防火墙配置
firewall-cmd <other options>

# 将修改后的所有配置保存到永久模式下,使得防火墙服务重启后新配置依然生效。即修改了永久模式的配置
firewall-cmd --runtime-to-permanent
  • 方式2
1
2
3
4
5
# 在 永久模式下 修改防火墙配置
firewall-cmd --permanent <other options>

# 重新加载配置,使得修改后的所有配置在当前立即生效。即修改了运行时模式的配置
firewall-cmd --reload

timeout 选项

通过远程访问服务器时,一旦使用错误配置可能会导致用户锁定自身的机器,无法再次登陆访问。故可以使用 —timeout 选项 避免发生该问题。在达到超时时间后,相关更改会恢复到之前的状态。此外使用该选项时,将无法使用—permanent选项

1
2
# 向pulbic区域添加名为demo6的服务,并在5分钟后撤销此配置
firewall-cmd --zone=public --add-service=demo6 --timeout 5m
请我喝杯咖啡捏~

欢迎关注我的微信公众号:青灯抽丝