RHCE认证学习笔记(八):防火墙与SELinux,筑牢系统安全防线
RHCE认证学习笔记(八):防火墙与SELinux,筑牢系统安全防线

大家好,欢迎回到RHCE9学习笔记系列。在上一篇文章中,我们学习了网络配置与管理,掌握了如何为系统分配IP地址、配置路由和排查网络故障。今天,我们将迈出安全加固的关键一步:防火墙与SELinux。这两者共同构成了RHEL系统的基础安全防线,合理配置它们能有效抵御网络攻击,保护系统资源。
1. Linux防火墙基础
Linux内核本身并不直接提供防火墙功能,但内核中的Netfilter模块提供了包过滤、连接跟踪等能力。我们通过用户空间工具(如iptables或firewalld)向 Netfilter 添加规则,从而决定哪些流量放行、哪些拒绝。
1.1 iptables(传统防火墙工具)
iptables是经典的防火墙配置工具,直接操作 Netfilter 的规则表(filter、nat、mangle 等)和链(INPUT、OUTPUT、FORWARD)。它的配置方式直接但略显复杂。
常用操作示例
查看当前规则(filter表)iptables -L# 清空所有规则iptables -F# 设置默认策略(拒绝所有进入流量)iptables -P INPUT DROP# 允许本地回环iptables -A INPUT -i lo -j ACCEPT# 允许SSH(22端口)从特定网段访问iptables -A INPUT -s 192.168.1.0/24 -p tcp --dport 22 -j ACCEPT# 删除某条规则(需指定完整匹配)iptables -D INPUT -s 192.168.1.0/24 -p tcp --dport 22 -j ACCEPT
虽然iptables功能强大,但它的规则是静态的,每次修改都需要重新加载全部规则,且配置语法相对底层。现代 RHEL 系统推荐使用firewalld。
2. firewalld – 动态防火墙管理器
firewalld是一个守护进程,它提供了动态管理 Netfilter 规则的接口,支持运行时配置(立即生效)和永久配置(重启后保留),并且引入了区域(zone)的概念,使防火墙配置更加人性化。
2.1 区域(zone)的概念
区域是对网络信任级别的抽象。每块网卡可以绑定到一个区域,该区域内的所有规则都会应用到这块网卡上。RHEL 预定义了多个区域:
| 区域 | 信任级别 | 默认规则 |
|---|---|---|
| trusted | 最高 | 接受所有流量 |
| home / work | 中等 | 接受部分服务(如ssh、dhcpv6-client、cockpit) |
| public | 低 | 只接受预定义的服务,默认拒绝其他(默认区域) |
| dmz | 较低 | 只接受SSH |
| block / drop | 无 | 拒绝所有流量(block会返回icmp拒绝消息,drop静默丢弃) |
查看当前默认区域和已绑定网卡:
# 查看默认区域firewall-cmd --get-default-zone# 查看所有区域及绑定的网卡firewall-cmd --list-all-zones# 查看当前活动区域及配置firewall-cmd --list-all
2.2 基本操作
firewall-cmd是firewalld的命令行工具。不加--permanent时,操作立即生效但重启后丢失;加--permanent则写入配置文件,需要--reload生效。
# 永久添加 HTTP 服务(立即生效并写入配置)firewall-cmd --add-service=http --permanentfirewall-cmd --reload# 临时添加 HTTPS 服务(立即生效,重启后失效)firewall-cmd --add-service=https# 删除服务firewall-cmd --remove-service=http --permanentfirewall-cmd --reload# 添加端口(如8080)firewall-cmd --add-port=8080/tcp --permanentfirewall-cmd --reload# 查看当前所有配置firewall-cmd --list-all
2.3 添加富规则(rich rule)
富规则提供了更精细的控制,比如基于源地址、时间、日志等条件。语法较为复杂,但功能强大。
# 拒绝来自 192.168.1.100 的 SSH 访问firewall-cmd --add-rich-rule='rule family=ipv4 source address=192.168.1.100 service name=ssh reject' --permanent# 允许来自 10.0.0.0/8 的 HTTP 访问,并记录日志firewall-cmd --add-rich-rule='rule family=ipv4 source address=10.0.0.0/8 service name=http accept log prefix="HTTP_ALLOW" level=info' --permanentfirewall-cmd --reload
2.4 区域管理
# 查看某块网卡所属区域firewall-cmd --get-zone-of-interface=ens160# 将网卡移动到其他区域(如 dmz)firewall-cmd --change-interface=ens160 --zone=dmz --permanentfirewall-cmd --reload
2.5 常用场景
场景1:Web服务器放行HTTP/HTTPS
firewall-cmd --add-service=http --add-service=https --permanentfirewall-cmd --reload
场景2:自定义端口放行(如Tomcat 8080)
firewall-cmd --add-port=8080/tcp --permanentfirewall-cmd --reload
场景3:只允许特定IP访问SSH
firewall-cmd --add-rich-rule='rule family=ipv4 source address=192.168.1.10 service name=ssh accept' --permanentfirewall-cmd --remove-service=ssh --permanent # 移除原有SSH规则(否则所有人都能访问)firewall-cmd --reload
场景4:开启IP转发(用作路由器)
# 临时开启echo 1 > /proc/sys/net/ipv4/ip_forward# 永久开启(编辑 /etc/sysctl.conf)echo "net.ipv4.ip_forward = 1" >> /etc/sysctl.confsysctl -p# 防火墙开启伪装(MASQUERADE)firewall-cmd --add-masquerade --permanentfirewall-cmd --reload
3. SELinux – 增强型安全子系统
SELinux(Security-Enhanced Linux)是 Linux 内核中的强制访问控制(MAC)机制,它提供比传统自主访问控制(DAC)更精细的安全策略。简单来说,即使进程以 root 身份运行,SELinux 也可以限制它只能访问特定的资源。
3.1 DAC vs MAC
DAC(自主访问控制):传统的 Unix 权限模型,由文件所有者决定谁可以访问。root 用户拥有最高权限,可以访问任何文件。
MAC(强制访问控制):SELinux 在 DAC 之上增加了额外的安全策略。每个进程和文件都被赋予一个安全上下文(context),只有策略允许的访问才会被放行。即使是 root,违反策略也会被拒绝。
这种设计可以有效防止利用漏洞提升权限后对整个系统的破坏。
3.2 SELinux 工作模式
SELinux 有三种模式:
| 模式 | 说明 |
|---|---|
| Enforcing | 强制模式,策略生效,违反策略的操作会被拒绝并记录日志 |
| Permissive | 宽容模式,策略不生效,但违反策略的行为会记录日志(用于调试) |
| Disabled | 完全关闭 |
查看当前模式:
getenforce
临时切换模式:
setenforce 0 # 切换为 Permissivesetenforce 1 # 切换为 Enforcing
永久修改:编辑/etc/selinux/config,将SELINUX=enforcing改为disabled或permissive,然后重启系统。生产环境不建议关闭 SELinux,而是学会如何正确配置。
3.3 安全上下文(Security Context)
每个进程、文件、目录、端口等都有安全上下文,格式为user:role:type:level(MLS 等级可选)。其中type是最常用的部分。
查看文件上下文:
ls -Z # 查看当前目录下文件的安全上下文ps -Z # 查看进程的安全上下文
例如,Apache 的网页目录通常需要httpd_sys_content_t类型才能被 Web 服务读取:
$ ls -Z /var/www/html/-rw-r--r--. root root system_u:object_r:httpd_sys_content_t:s0 index.html
如果我们将网页放在自定义目录/web,就需要手动设置正确的上下文。
3.4 管理安全上下文
查看文件上下文规则
# 查看 /web 目录的默认上下文规则(当前未设置)semanage fcontext -l | grep /web
添加自定义上下文规则
# 将 /web 及其子目录的上下文设为 httpd_sys_content_tsemanage fcontext -a -t httpd_sys_content_t '/web(/.*)?'# 应用上下文更改(刷新)restorecon -Rv /web
恢复上下文
restorecon -Rv /path/to/dir # 恢复目录下所有文件为默认上下文
3.5 管理端口安全
SELinux 也限制了服务可以绑定的端口。例如,如果想让 Apache 监听 8080 端口,需要将 8080 添加到http_port_t类型中。
# 查看 http 相关的端口类型semanage port -l | grep http# 添加 8080 端口到 http_port_tsemanage port -a -t http_port_t -p tcp 8080# 验证semanage port -l | grep http_port_t
3.6 管理布尔值(Booleans)
布尔值是 SELinux 策略中的开关,用于开启或关闭某些特定的权限。例如,允许 httpd 访问用户家目录:
# 查看所有与 httpd 相关的布尔值semanage boolean -l | grep httpd# 临时开启(立即生效,重启后恢复)setsebool httpd_enable_homedirs on# 永久开启(写入策略文件)setsebool -P httpd_enable_homedirs on
3.7 查看与调试 SELinux 违规
当某个操作被 SELinux 拒绝时,通常会在/var/log/audit/audit.log(如果 auditd 运行)或/var/log/messages中记录。可以使用ausearch或journalctl查看:
# 查看最近违反 SELinux 策略的日志ausearch -m avc -ts recent# 或使用 sealert(需要安装 setroubleshoot)获取友好提示sealert -a /var/log/audit/audit.log
sealert往往会给出解决建议,比如“是否允许此访问?请执行semanage fcontext ...”等,极大地方便了调试。
3.8 实用 SELinux 命令汇总
| 命令 | 作用 |
|---|---|
<span leaf="">getenforce</span> | 查看当前模式 |
<span leaf="">setenforce 0/1</span> | 临时切换模式 |
<span leaf="">ls -Z</span> | 查看文件安全上下文 |
<span leaf="">ps -Z</span> | 查看进程安全上下文 |
<span leaf="">semanage fcontext -l</span> | 列出文件上下文规则 |
<span leaf="">semanage fcontext -a -t type '/path(/.*)?'</span> | 添加文件上下文规则 |
<span leaf="">restorecon -Rv /path</span> | 恢复文件上下文 |
<span leaf="">semanage port -l</span> | 查看端口类型 |
<span leaf="">semanage port -a -t type -p tcp PORT</span> | 添加端口到类型 |
<span leaf="">semanage boolean -l</span> | 查看布尔值状态 |
<span leaf="">setsebool -P boolean on</span> | 永久开启布尔值 |
<span leaf="">ausearch -m avc</span> | 查看SELinux拒绝日志 |
4. 综合实战:搭建一个安全的 Web 服务
假设我们想要在自定义目录/web下提供 HTTP 服务,使用 8080 端口,并且希望只有特定 IP 可以访问。
4.1 准备环境
# 安装 Apachednf install httpd -y# 创建自定义网页目录mkdir /webecho "<h1>Hello from custom web</h1>" > /web/index.html
4.2 配置防火墙
# 放行 8080 端口firewall-cmd --add-port=8080/tcp --permanent# 只允许 192.168.50.0/24 访问(可选)firewall-cmd --add-rich-rule='rule family=ipv4 source address=192.168.50.0/24 port port=8080 protocol=tcp accept' --permanent# 允许其他服务(如ssh)保持不变firewall-cmd --reload
4.3 修改 Apache 配置
编辑/etc/httpd/conf/httpd.conf,修改监听端口和 DocumentRoot:
Listen 8080DocumentRoot "/web"
4.4 配置 SELinux
# 为 /web 目录设置正确的上下文semanage fcontext -a -t httpd_sys_content_t '/web(/.*)?'restorecon -Rv /web# 允许 Apache 绑定 8080 端口semanage port -a -t http_port_t -p tcp 8080
4.5 启动服务并验证
systemctl start httpdsystemctl enable httpd# 验证端口监听ss -tuln | grep 8080# 本地访问测试curl http://localhost:8080# 从远程访问测试curl http://server-ip:8080
如果一切正常,你应该能看到网页内容。如果遇到权限问题,检查 SELinux 日志并按照提示解决。
总结
本篇我们系统学习了:
防火墙基础:Netfilter 内核模块与 iptables 工具。
firewalld:动态防火墙管理,区域概念,服务/端口/富规则的使用。
SELinux:强制访问控制原理,工作模式,安全上下文,端口管理,布尔值,调试方法。
综合实战:将防火墙与 SELinux 结合,安全部署 Web 服务。
防火墙和 SELinux 是 Linux 安全体系的两大支柱。掌握它们的配置与调试方法,你就能为系统筑起坚实的安全防线。在实际工作中,建议始终将 SELinux 保持为Enforcing模式,遇到问题时通过日志分析解决,而不是简单关闭它。
下一篇,我们将深入文件系统与存储管理,学习分区、格式化、逻辑卷、挂载等核心内容。敬请期待!
练习建议:
在自己的虚拟机中,尝试为 Nginx 或 Apache 配置自定义端口,并用semanage和firewall-cmd放行该端口。
将 SELinux 临时设为permissive,执行一个被拒绝的操作,观察日志;再切回enforcing,用sealert分析并修复问题。
编写一个脚本,自动配置防火墙:只允许 SSH 来自特定 IP,开放 80 和 443 端口给所有人。
尝试使用semanage fcontext为一个自定义目录设置正确的 Web 上下文,并验证网页是否能正常访问。
标题:RHCE认证学习笔记(八):防火墙与SELinux,筑牢系统安全防线
作者:shuaiqijun
地址:https://shuaiqijun.com/articles/2026/03/26/1774504755282.html