一、管理服务器防火墙(firewalld)
RHEL 默认使用 firewalld 作为防火墙管理工具,它通过 “区域(zone)” 和 “服务(service)” 的概念简化规则配置,支持动态更新规则而无需重启服务。
1.1 防火墙基础操作
首先需要了解 firewalld 的基本状态和常用命令:
查看防火墙运行状态:
sudo systemctl status firewalld
若防火墙未启动,执行以下命令启动并设置开机自启:
sudo systemctl start firewalld
sudo systemctl enable firewalld
查看当前默认区域(默认区域是规则的主要应用对象):
sudo firewall-cmd --get-default-zone
查看当前区域的所有规则(包括开放的端口和服务):
sudo firewall-cmd --list-all
1.2 配置防火墙规则(核心操作)
开放指定服务
firewalld 预定义了常见服务(如 ssh、http、ftp)的端口配置,直接开放服务比手动指定端口更便捷。
例如,允许 HTTP 服务通过默认区域:
# 临时开放(重启防火墙后失效)
sudo firewall-cmd --add-service=http
# 永久开放(需重新加载规则生效)
sudo firewall-cmd --add-service=http --permanent
# 重新加载规则,使永久配置生效
sudo firewall-cmd --reload
验证服务是否已开放:
sudo firewall-cmd --list-services
开放指定端口
对于非预定义服务,需直接开放端口(需指定协议,如 tcp 或 udp)。
例如,开放 TCP 8080 端口(临时 + 永久):
# 临时开放
sudo firewall-cmd --add-port=8080/tcp
# 永久开放
sudo firewall-cmd --add-port=8080/tcp --permanent
# 重新加载规则
sudo firewall-cmd --reload
验证端口是否已开放:
sudo firewall-cmd --list-ports
限制特定 IP 访问
为提升安全性,可限制只有指定 IP 或网段能访问服务。
例如,仅允许 192.168.1.0/24 网段访问 SSH 服务:
sudo firewall-cmd --add-rich-rule='rule family="ipv4" source address="192.168.1.0/24" service name="ssh" accept' --permanent
# 重新加载规则
sudo firewall-cmd --reload
删除规则
若需移除已配置的规则,将--add
替换为--remove
即可:
# 永久删除HTTP服务开放规则
sudo firewall-cmd --remove-service=http --permanent
# 永久删除8080/tcp端口开放规则
sudo firewall-cmd --remove-port=8080/tcp --permanent
# 重新加载规则
sudo firewall-cmd --reload
1.3 工作区域管理
firewalld 的 “区域” 本质是预设的规则集合,不同区域对应不同的安全级别(如 public、internal、dmz 等)。可根据服务器网络环境切换区域:
查看所有可用区域:
sudo firewall-cmd --get-zones
切换默认区域为 internal(适合内部网络,开放更多服务):
sudo firewall-cmd --set-default-zone=internal --permanent
sudo firewall-cmd --reload
为特定网卡指定区域(如为 ens33 网卡应用 dmz 区域):
sudo firewall-cmd --zone=dmz --add-interface=ens33 --permanent
sudo firewall-cmd --reload
二、控制 SELinux 端口标记
SELinux(安全增强型 Linux)通过强制访问控制(MAC)机制限制进程权限,其中 “端口标记” 是控制网络服务端口访问的核心手段 —— 只有为端口分配正确的 SELinux 类型(如 http_port_t、ssh_port_t),对应服务才能正常监听该端口。
2.1 SELinux 基础状态
首先查看 SELinux 当前模式(enforcing、permissive 或 disabled):
getenforce
或查看详细配置:
sestatus
注意:RH134 课程推荐使用 enforcing 模式(强制生效),如需临时切换为宽容模式(仅日志记录不阻止操作),执行
sudo setenforce 0
,切换回强制模式执行sudo setenforce 1
。
2.2 查看端口 SELinux 标记
每个网络服务都有默认的 SELinux 端口类型,例如:
- SSH 服务默认使用 ssh_port_t(对应端口 22)
- HTTP 服务默认使用 http_port_t(对应端口 80、443)
查看某服务的默认端口标记:
# 查看HTTP服务的SELinux端口类型及关联端口
semanage port -l | grep http_port_t
输出示例:
http_port_t tcp 80, 81, 443, 488, 8008, 8009, 8443, 9000
2.3 为非默认端口添加 SELinux 标记
当服务使用非默认端口时(如 HTTP 服务使用 8080 端口),需手动为该端口添加对应的 SELinux 标记,否则 SELinux 会阻止服务监听端口。
步骤如下:
1,查看服务所需的 SELinux 端口类型(如 HTTP 服务需要 http_port_t):
semanage port -l | grep http
2,为 8080 端口添加 http_port_t 标记(永久生效):
sudo semanage port -a -t http_port_t -p tcp 8080
3,验证端口标记是否添加成功:
semanage port -l | grep http_port_t
若输出包含 8080,则表示配置成功:
http_port_t tcp 8080, 80, 81, 443, 488, 8008, 8009, 8443, 9000
2.4 删除错误的端口标记
若需移除已添加的端口标记,将-a
(添加)替换为-d
(删除):
sudo semanage port -d -t http_port_t -p tcp 8080
2.5 解决 SELinux 相关的端口访问问题
当服务启动失败或无法访问端口时,若防火墙规则已正确配置,很可能是 SELinux 端口标记问题。可通过以下步骤排查:
1,查看 SELinux 审计日志(记录被阻止的操作):
sudo grep "SELinux is preventing" /var/log/audit/audit.log
2,若日志中提示 “bind to port” 相关的拒绝信息,确认端口是否已添加正确标记:
semanage port -l | grep <端口号>
3,若未添加,按 2.3 的步骤为端口添加正确标记即可。
三、总结
1,防火墙(firewalld)通过区域和规则控制网络流量进出,是第一道防线;
2,SELinux 通过端口标记限制服务可使用的端口,是第二道强制访问控制防线。