使用 firewalld 限制服务访问

LinuxBeginner
立即练习

介绍

开启网络服务只是系统管理任务的一半。你还必须控制主机防火墙允许哪些流量通过。在 Red Hat 系统中,firewalld 通过区域(zones)、服务、端口和富规则(rich rules)来管理防火墙策略。

在本实验中,我们为你准备了一个运行在 TCP 端口 8088 上的小型 HTTP 服务。你将检查默认区域、在运行时开启端口、将规则设为永久生效、用基于源地址限制的富规则替换宽泛的端口开放规则,并对最终的防火墙状态进行审计。

检查防火墙与服务基准

在此步骤中,你将检查当前的 firewalld 状态以及准备好的网络服务。在更改规则之前,应确保防火墙正在运行。

环境初始化已在 public 区域中永久保留 SSH 和使用 3002/tcp 的 LabEx 浏览器终端访问规则。更改应用程序的防火墙策略时,请保留这些管理访问规则。

进入项目目录。

cd /home/labex/project

检查 firewalld 是否正在运行。在此环境中,请使用 sudo firewall-cmd 进行读取和写入操作。

sudo firewall-cmd --state

显示默认区域。

sudo firewall-cmd --get-default-zone

检查活动区域。请注意,ssh 是被允许的,因此 LabEx 的 SSH 会话可以保持连接。

sudo firewall-cmd --list-all

确认练习用的 Web 服务正在运行并监听 8088 端口。

systemctl is-active rhcsa-fw-web.service
ss -ltn | grep ':8088'
curl -s http://127.0.0.1:8088/

检查 8088/tcp 端口目前尚未在 firewalld 中被广泛开放。

sudo firewall-cmd --query-port=8088/tcp || echo "port 8088 is not open in the zone"

开启运行时端口

在此步骤中,你将添加一条运行时防火墙规则。运行时规则会立即生效,但除非你将其设为永久,否则在 firewalld 重载后它们会消失。

在当前的运行时配置中开启 TCP 端口 8088。由于未指定区域,firewall-cmd 会将更改应用于你之前检查过的默认区域。

sudo firewall-cmd --add-port=8088/tcp

查询运行时规则。结果为 yes 表示活动防火墙当前允许该端口。

sudo firewall-cmd --query-port=8088/tcp

列出运行时端口。这可以让你直观地查看活动区域中手动开启的端口。

sudo firewall-cmd --list-ports

检查永久配置。它应该仍然报告 no,因为运行时配置和永久配置是分开的;仅限运行时的规则现在有效,但在 firewalld 重载后会丢失。

sudo firewall-cmd --permanent --query-port=8088/tcp || echo "port 8088 is not permanent yet"

将端口规则设为永久生效

在此步骤中,你将把相同的端口添加到永久配置中并重载 firewalld。重载操作会将永久配置应用到运行时防火墙。

添加永久端口规则。--permanent 选项将规则写入 firewalld 配置,而不是仅更改正在运行的防火墙。

sudo firewall-cmd --permanent --add-port=8088/tcp

重载 firewalld。重载操作会根据永久配置重建运行时防火墙,这也是为什么这一步可以测试你保存的规则在重载后是否依然有效。

sudo firewall-cmd --reload

查询运行时和永久配置。第一条命令检查活动防火墙,第二条命令检查保存的配置。

sudo firewall-cmd --query-port=8088/tcp
sudo firewall-cmd --permanent --query-port=8088/tcp

两条命令都应该返回 yes。

使用富规则替换开放端口

在此步骤中,你将限制访问权限,而不是让服务对所有源地址开放。富规则可以在一条规则中同时包含源地址和目标端口。

移除宽泛的永久端口开放规则。这为更严格的规则做准备;否则,虽然富规则会生效,但宽泛的端口规则仍然会允许所有源地址访问。

sudo firewall-cmd --permanent --remove-port=8088/tcp

添加一条富规则,仅允许来自文档网络 192.0.2.0/24 的 8088/tcp 访问。当简单的服务或端口规则不够精确(例如需要限制源地址)时,富规则非常有用。

sudo firewall-cmd --permanent --add-rich-rule='rule family="ipv4" source address="192.0.2.0/24" port port="8088" protocol="tcp" accept'

重载 firewalld 以应用永久更改。

sudo firewall-cmd --reload

确认宽泛的端口不再开放。预期的 no 结果意味着该服务不再通过通用的端口规则暴露。

sudo firewall-cmd --query-port=8088/tcp || echo "broad port rule removed"

列出富规则。富规则的输出证明了基于源地址的严格规则已经取代了宽泛的开放规则。

sudo firewall-cmd --list-rich-rules

审计最终防火墙状态

在此步骤中,你将审计最终状态。最终验证是重要的管理习惯:确认服务正在运行、SSH 仍然被允许、宽泛端口已关闭,并且限制性规则已生效。

列出活动区域。

sudo firewall-cmd --list-all

列出永久富规则。

sudo firewall-cmd --permanent --list-rich-rules

确认 SSH 仍然被允许。

sudo firewall-cmd --query-service=ssh

确认服务本身在本地仍然有响应。本地回环访问验证了服务进程;而 firewalld 则独立控制入站区域流量。

curl -s http://127.0.0.1:8088/

总结

你练习了使用 firewalld 进行主机防火墙管理。你检查了默认区域、确认了网络服务正在运行、添加了运行时端口规则、将规则设为永久生效、重载了 firewalld、用基于源地址限制的富规则替换了宽泛的开放规则,并审计了最终的防火墙状态。