CentOS 防火墙与 SELinux 的协同机制
一、核心概念与分工
- 防火墙(firewalld/iptables):工作于网络层/传输层,依据源/目的IP、端口、协议进行允许或拒绝,决定“包能不能进/出主机”。
- SELinux(Security-Enhanced Linux):工作于内核的强制访问控制(MAC)层,依据主体(进程/域)—客体(文件/套接字/端口等)—权限三元组进行细粒度控制,决定“进程被允许对资源做什么”。
- 协同关系:二者是互补而非替代。即使防火墙放行了某个端口,若 SELinux 策略不允许对应进程绑定/访问该端口或资源,访问仍会被拒绝;反之亦然。实际生效需要网络放行 + 策略放行同时满足。
二、典型工作流程
- 数据包到达网卡,按firewalld/iptables规则进行匹配与动作(ACCEPT/DROP/REJECT 等)。
- 若被放行进入内核,涉及本地进程访问资源(如绑定端口、读写文件、访问套接字)时,SELinux依据策略进行第二道检查。
- 任一环节拒绝,最终即被拒绝;只有两层都允许,访问才成功。
三、常见协同场景与配置要点
- 放行 Web 服务(HTTP/HTTPS)
- 防火墙放行服务或端口:
- 使用服务名:
firewall-cmd --permanent --add-service=http --add-service=https && firewall-cmd --reload
- 使用端口:
firewall-cmd --permanent --add-port=80/tcp --add-port=443/tcp && firewall-cmd --reload
- SELinux 允许进程使用对应端口类型:
- 确认/添加端口类型:
semanage port -a -t http_port_t -p tcp 8080(示例将 8080 加入 http_port_t)
- 如为自定义服务,必要时调整进程的 SELinux 域或策略模块。
- 文件与目录上下文(如网站根目录):
chcon -R -t httpd_sys_content_t /var/www/html(示例将目录标记为 httpd 可读内容)
- 变更建议:优先使用firewalld zones/服务/富规则进行编排,减少直接操作底层链表的复杂度与风险。
四、联合排查与日志定位
- 启用并观察防火墙拒绝日志:
firewall-cmd --permanent --set-log-denied=all && firewall-cmd --reload
journalctl -u firewalld -f(实时查看拒绝事件)
- 检查 SELinux 拒绝事件:
- 查看审计日志:
ausearch -m avc -ts recent 或 tail -f /var/log/audit/audit.log
- 分析并生成策略建议:
audit2why、audit2allow(审慎评估后再应用)
- 定位思路:
- 网络层被拒 → 先看 firewalld 日志与规则;
- 权限被拒 → 再看 SELinux AVC 日志与上下文/端口类型。
五、最佳实践与常见误区
- 保持 SELinux 为 Enforcing,仅对确有需要的服务做最小放宽;用
getenforce/setenforce 与 /etc/selinux/config 管理状态与策略类型。
- 新增端口或协议时,优先用 semanage port 将端口与正确类型关联(如 http_port_t),避免被 SELinux 拒绝。
- 与 fail2ban 联动时,推荐使用 firewallcmd-ipset 或 firewallcmd-rich-rules 动作,实现高效封禁与与 SELinux 的并行防护。
- 变更前备份规则,变更后在测试环境验证;对关键业务遵循最小暴露面原则。