活动公告

系统通知
05-18 21:22
系统通知
通知:本站资源由网友上传分享,如有违规等问题请到版务模块进行投诉,资源失效请在帖子内回复要求补档,会尽快处理!
10-23 09:31

Red Hat Enterprise Linux网络防火墙配置实战指南 从基础规则到高级策略的完整实例解析助您轻松掌握企业级系统安全防护

SunJu_FaceMall

3万

主题

2860

科技点

3万

积分

白金月票

碾压王

积分
32872

塔罗立华奏

<font color=白金月票" /> 发表于 2025-9-7 23:40:02 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。

您需要 登录 才可以下载或查看,没有账号?立即注册

x
引言

在当今网络环境中,企业级系统安全防护至关重要。Red Hat Enterprise Linux (RHEL) 作为领先的企业级Linux发行版,其内置的防火墙功能为系统提供了强大的安全防护能力。本文将详细介绍RHEL网络防火墙的配置方法,从基础规则到高级策略,通过完整的实例解析,帮助您轻松掌握企业级系统安全防护技能。

RHEL默认使用firewalld作为防火墙管理工具,它提供了动态管理的防火墙功能,支持网络/防火墙区域(zone)定义,以及网络连接或接口的信任级别。通过本文的指导,您将能够根据企业实际需求,灵活配置和管理RHEL系统的防火墙规则。

RHEL防火墙基础

firewalld简介

firewalld是RHEL中的默认防火墙管理工具,它取代了传统的iptables服务。firewalld提供了动态管理的防火墙,支持网络区域定义,允许您根据不同的环境设置不同的安全策略。

firewalld的主要特点包括:

• D-Bus接口提供动态管理功能
• 支持IPv4、IPv6、以太网桥和IPSet
• 区域(zone)概念,根据信任级别划分网络
• 支持服务和应用程序的直接接口
• 运行时和永久配置分离

核心概念

在开始配置之前,需要了解firewalld的几个核心概念:

1. 区域(Zones): 预定义的规则集,根据接口的信任级别应用不同的规则。常见的区域包括:drop: 丢弃所有传入的网络数据包,没有回复block: 拒绝所有传入的网络数据包,并回复ICMP主机禁止消息public: 用于公共区域,不信任网络上的其他计算机external: 用于启用了伪装的外部网络,特别是路由器internal: 用于内部网络,信任网络上的其他计算机dmz: 用于非军事区,可公开访问,但对内部网络有限制work: 用于工作区域,信任网络上的大多数计算机home: 用于家庭区域,信任网络上的大多数计算机trusted: 信任所有网络连接
2. drop: 丢弃所有传入的网络数据包,没有回复
3. block: 拒绝所有传入的网络数据包,并回复ICMP主机禁止消息
4. public: 用于公共区域,不信任网络上的其他计算机
5. external: 用于启用了伪装的外部网络,特别是路由器
6. internal: 用于内部网络,信任网络上的其他计算机
7. dmz: 用于非军事区,可公开访问,但对内部网络有限制
8. work: 用于工作区域,信任网络上的大多数计算机
9. home: 用于家庭区域,信任网络上的大多数计算机
10. trusted: 信任所有网络连接
11. 服务(Services): 预定义的端口/协议组合,如HTTP、SSH等。
12. 端口(Ports): 单独的TCP或UDP端口。
13. 富规则(Rich Rules): 更复杂的规则,允许更精细的控制。
14. 直接规则(Direct Rules): 直接传递给防火墙的原始规则。

区域(Zones): 预定义的规则集,根据接口的信任级别应用不同的规则。常见的区域包括:

• drop: 丢弃所有传入的网络数据包,没有回复
• block: 拒绝所有传入的网络数据包,并回复ICMP主机禁止消息
• public: 用于公共区域,不信任网络上的其他计算机
• external: 用于启用了伪装的外部网络,特别是路由器
• internal: 用于内部网络,信任网络上的其他计算机
• dmz: 用于非军事区,可公开访问,但对内部网络有限制
• work: 用于工作区域,信任网络上的大多数计算机
• home: 用于家庭区域,信任网络上的大多数计算机
• trusted: 信任所有网络连接

服务(Services): 预定义的端口/协议组合,如HTTP、SSH等。

端口(Ports): 单独的TCP或UDP端口。

富规则(Rich Rules): 更复杂的规则,允许更精细的控制。

直接规则(Direct Rules): 直接传递给防火墙的原始规则。

firewalld基本配置

安装与启动

在RHEL系统中,firewalld通常已经预装。如果没有安装,可以使用以下命令安装:
  1. # 安装firewalld
  2. sudo yum install firewalld
  3. # 启动firewalld服务
  4. sudo systemctl start firewalld
  5. # 设置firewalld开机自启
  6. sudo systemctl enable firewalld
  7. # 检查firewalld状态
  8. sudo systemctl status firewalld
复制代码

基本命令

以下是firewalld的一些基本管理命令:
  1. # 查看firewalld状态
  2. sudo firewall-cmd --state
  3. # 查看当前活动的区域
  4. sudo firewall-cmd --get-active-zones
  5. # 查看所有可用区域
  6. sudo firewall-cmd --get-zones
  7. # 查看默认区域
  8. sudo firewall-cmd --get-default-zone
  9. # 查看特定区域的详细信息
  10. sudo firewall-cmd --zone=public --list-all
  11. # 重新加载防火墙配置(不丢失当前连接)
  12. sudo firewall-cmd --reload
  13. # 完全重启防火墙(会丢失当前连接)
  14. sudo systemctl restart firewalld
复制代码

运行时与永久配置

firewalld支持两种配置模式:运行时(Runtime)和永久(Permanent)。

• 运行时配置: 立即生效,但重启后丢失
• 永久配置: 重启后仍然有效,但不会立即生效

默认情况下,firewall-cmd命令修改的是运行时配置。要修改永久配置,需要添加--permanent选项。例如:
  1. # 运行时配置(立即生效,重启后丢失)
  2. sudo firewall-cmd --zone=public --add-service=http
  3. # 永久配置(重启后生效,现在不生效)
  4. sudo firewall-cmd --zone=public --add-service=http --permanent
  5. # 永久配置并立即生效
  6. sudo firewall-cmd --zone=public --add-service=http --permanent
  7. sudo firewall-cmd --reload
复制代码

基础规则配置

区域管理

区域是firewalld的核心概念,正确配置区域对于网络安全至关重要。
  1. # 查看默认区域
  2. sudo firewall-cmd --get-default-zone
  3. # 更改默认区域
  4. sudo firewall-cmd --set-default-zone=internal
复制代码
  1. # 查看接口所属区域
  2. sudo firewall-cmd --get-active-zones
  3. # 将接口分配到特定区域(临时)
  4. sudo firewall-cmd --zone=dmz --change-interface=eth0
  5. # 将接口分配到特定区域(永久)
  6. sudo firewall-cmd --zone=dmz --change-interface=eth0 --permanent
  7. sudo firewall-cmd --reload
复制代码
  1. # 创建新区域
  2. sudo firewall-cmd --permanent --new-zone=myzone
  3. # 设置新区域的目标(默认为ACCEPT)
  4. sudo firewall-cmd --permanent --zone=myzone --set-target=DROP
  5. # 激活新区域
  6. sudo firewall-cmd --reload
复制代码

服务管理

服务是预定义的端口/协议组合,使用服务可以简化配置过程。
  1. # 查看所有可用服务
  2. sudo firewall-cmd --get-services
  3. # 查看服务的详细信息
  4. sudo firewall-cmd --info-service=http
复制代码
  1. # 在public区域添加HTTP服务(临时)
  2. sudo firewall-cmd --zone=public --add-service=http
  3. # 在public区域添加HTTP服务(永久)
  4. sudo firewall-cmd --zone=public --add-service=http --permanent
  5. sudo firewall-cmd --reload
复制代码
  1. # 从public区域移除HTTP服务(临时)
  2. sudo firewall-cmd --zone=public --remove-service=http
  3. # 从public区域移除HTTP服务(永久)
  4. sudo firewall-cmd --zone=public --remove-service=http --permanent
  5. sudo firewall-cmd --reload
复制代码

端口管理

除了使用预定义的服务,您还可以直接管理端口。
  1. # 在public区域添加TCP端口8080(临时)
  2. sudo firewall-cmd --zone=public --add-port=8080/tcp
  3. # 在public区域添加UDP端口53(永久)
  4. sudo firewall-cmd --zone=public --add-port=53/udp --permanent
  5. sudo firewall-cmd --reload
复制代码
  1. # 从public区域移除TCP端口8080(临时)
  2. sudo firewall-cmd --zone=public --remove-port=8080/tcp
  3. # 从public区域移除UDP端口53(永久)
  4. sudo firewall-cmd --zone=public --remove-port=53/udp --permanent
  5. sudo firewall-cmd --reload
复制代码
  1. # 添加TCP端口范围7000-8000(临时)
  2. sudo firewall-cmd --zone=public --add-port=7000-8000/tcp
  3. # 添加UDP端口范围7000-8000(永久)
  4. sudo firewall-cmd --zone=public --add-port=7000-8000/udp --permanent
  5. sudo firewall-cmd --reload
复制代码

协议管理

您还可以允许特定协议通过防火墙:
  1. # 允许ICMP协议(临时)
  2. sudo firewall-cmd --zone=public --add-protocol=icmp
  3. # 允许IGMP协议(永久)
  4. sudo firewall-cmd --zone=public --add-protocol=igmp --permanent
  5. sudo firewall-cmd --reload
复制代码

端口转发

firewalld支持端口转发功能,可以将传入的连接转发到指定的内部端口。
  1. # 将本地端口80的流量转发到本地端口8080(临时)
  2. sudo firewall-cmd --zone=public --add-forward-port=port=80:proto=tcp:toport=8080
  3. # 将本地端口443的流量转发到本地端口8443(永久)
  4. sudo firewall-cmd --zone=public --add-forward-port=port=443:proto=tcp:toport=8443 --permanent
  5. sudo firewall-cmd --reload
复制代码
  1. # 将本地端口80的流量转发到远程主机192.168.1.100的端口8080(临时)
  2. sudo firewall-cmd --zone=public --add-forward-port=port=80:proto=tcp:toaddr=192.168.1.100:toport=8080
  3. # 将本地端口443的流量转发到远程主机192.168.1.100的端口8443(永久)
  4. sudo firewall-cmd --zone=public --add-forward-port=port=443:proto=tcp:toaddr=192.168.1.100:toport=8443 --permanent
  5. sudo firewall-cmd --reload
复制代码

ICMP阻塞控制

您可以控制哪些ICMP类型被阻塞或允许:
  1. # 查看所有ICMP类型
  2. sudo firewall-cmd --get-icmptypes
  3. # 阻塞echo-request(ping请求)(临时)
  4. sudo firewall-cmd --zone=public --add-icmp-block=echo-request
  5. # 阻塞echo-request(ping请求)(永久)
  6. sudo firewall-cmd --zone=public --add-icmp-block=echo-request --permanent
  7. sudo firewall-cmd --reload
  8. # 允许echo-request(ping请求)(临时)
  9. sudo firewall-cmd --zone=public --remove-icmp-block=echo-request
  10. # 允许echo-request(ping请求)(永久)
  11. sudo firewall-cmd --zone=public --remove-icmp-block=echo-request --permanent
  12. sudo firewall-cmd --reload
复制代码

高级策略配置

富规则(Rich Rules)

富规则提供了更精细的控制,允许您创建复杂的规则,如基于源/目标地址、端口、协议、日志操作等的规则。

富规则的基本语法如下:
  1. rule [family="ipv4|ipv6"]
  2. [ source address="address[/mask]" [invert="True"] ]
  3. [ destination address="address[/mask]" [invert="True"] ]
  4. [ service name="service name" ]
  5. [ port port="port number" protocol="tcp|udp" ]
  6. [ protocol value="protocol" ]
  7. [ icmp-block name="icmptype" ]
  8. [ masquerade ]
  9. [ forward-port port="port number" protocol="tcp|udp" to-port="port number" to-addr="address" ]
  10. [ log [prefix="prefix text"] [level="emerg|alert|crit|err|warn|notice|info|debug"] ]
  11. [ audit ]
  12. [ accept|reject|drop ]
复制代码

1. 允许来自特定IP的访问:
  1. # 允许来自192.168.1.100的HTTP访问(临时)
  2. sudo firewall-cmd --zone=public --add-rich-rule='rule family="ipv4" source address="192.168.1.100" service name="http" accept'
  3. # 允许来自192.168.1.0/24子网的SSH访问(永久)
  4. sudo firewall-cmd --zone=public --add-rich-rule='rule family="ipv4" source address="192.168.1.0/24" service name="ssh" accept' --permanent
  5. sudo firewall-cmd --reload
复制代码

1. 拒绝特定IP的访问:
  1. # 拒绝来自192.168.1.200的所有访问(临时)
  2. sudo firewall-cmd --zone=public --add-rich-rule='rule family="ipv4" source address="192.168.1.200" reject'
  3. # 拒绝来自10.0.0.0/8子网的MySQL访问(永久)
  4. sudo firewall-cmd --zone=public --add-rich-rule='rule family="ipv4" source address="10.0.0.0/8" service name="mysql" reject' --permanent
  5. sudo firewall-cmd --reload
复制代码

1. 基于时间的规则:
  1. # 在工作时间(周一至周五9:00-18:00)允许来自特定IP的SSH访问(临时)
  2. sudo firewall-cmd --zone=public --add-rich-rule='rule family="ipv4" source address="192.168.1.0/24" service name="ssh" accept' --timeout=3600
  3. # 注意:firewalld本身不支持基于时间的规则,但可以通过结合cron和其他脚本来实现
复制代码

1. 日志记录规则:
  1. # 记录并拒绝来自192.168.1.300的HTTP访问(临时)
  2. sudo firewall-cmd --zone=public --add-rich-rule='rule family="ipv4" source address="192.168.1.300" service name="http" log prefix="http_denied" level="notice" reject'
  3. # 记录并允许来自192.168.1.400的SSH访问(永久)
  4. sudo firewall-cmd --zone=public --add-rich-rule='rule family="ipv4" source address="192.168.1.400" service name="ssh" log prefix="ssh_allowed" level="info" accept' --permanent
  5. sudo firewall-cmd --reload
复制代码

1. 端口转发规则:
  1. # 将来自192.168.1.0/24的TCP端口8080流量转发到内部服务器192.168.2.100的端口80(临时)
  2. sudo firewall-cmd --zone=public --add-rich-rule='rule family="ipv4" source address="192.168.1.0/24" forward-port port="8080" protocol="tcp" to-port="80" to-addr="192.168.2.100"'
  3. # 将来自10.0.0.0/8的TCP端口8443流量转发到内部服务器192.168.2.200的端口443(永久)
  4. sudo firewall-cmd --zone=public --add-rich-rule='rule family="ipv4" source address="10.0.0.0/8" forward-port port="8443" protocol="tcp" to-port="443" to-addr="192.168.2.200"' --permanent
  5. sudo firewall-cmd --reload
复制代码
  1. # 列出所有富规则
  2. sudo firewall-cmd --zone=public --list-rich-rules
  3. # 删除特定富规则(需要完全匹配规则字符串)
  4. sudo firewall-cmd --zone=public --remove-rich-rule='rule family="ipv4" source address="192.168.1.100" service name="http" accept'
  5. # 删除所有富规则
  6. sudo firewall-cmd --zone=public --remove-rich-rules
复制代码

直接规则(Direct Rules)

直接规则允许您直接将原始iptables规则传递给防火墙。这提供了最大的灵活性,但也可能导致配置冲突,应谨慎使用。
  1. # 添加直接规则(临时)
  2. sudo firewall-cmd --direct --add-rule ipv4 filter INPUT 0 -p tcp --dport 1234 -j ACCEPT
  3. # 添加直接规则(永久)
  4. sudo firewall-cmd --direct --add-rule ipv4 filter INPUT 0 -p tcp --dport 1234 -j ACCEPT --permanent
  5. sudo firewall-cmd --reload
复制代码
  1. # 列出所有直接规则
  2. sudo firewall-cmd --direct --get-all-rules
  3. # 删除特定直接规则
  4. sudo firewall-cmd --direct --remove-rule ipv4 filter INPUT 0 -p tcp --dport 1234 -j ACCEPT
  5. # 删除所有直接规则
  6. sudo firewall-cmd --direct --remove-rules ipv4 filter INPUT
复制代码

自定义服务

您可以创建自定义服务,以便更轻松地管理复杂的应用程序端口需求。

1. 创建服务定义文件:
  1. # 创建自定义服务文件
  2. sudo vi /etc/firewalld/services/custom-service.xml
复制代码

1. 添加以下内容:
  1. <?xml version="1.0" encoding="utf-8"?>
  2. <service>
  3.   <short>Custom Service</short>
  4.   <description>This is a custom service for our application.</description>
  5.   <port protocol="tcp" port="8080"/>
  6.   <port protocol="tcp" port="8081"/>
  7.   <port protocol="udp" port="10000"/>
  8.   <module name="nf_conntrack_netbios_ns"/>
  9. </service>
复制代码

1. 重新加载firewalld:
  1. sudo firewall-cmd --reload
复制代码
  1. # 添加自定义服务到区域(临时)
  2. sudo firewall-cmd --zone=public --add-service=custom-service
  3. # 添加自定义服务到区域(永久)
  4. sudo firewall-cmd --zone=public --add-service=custom-service --permanent
  5. sudo firewall-cmd --reload
复制代码

IP集(IPSet)管理

IP集允许您创建和管理IP地址、网络、端口等的集合,可以与防火墙规则一起使用。
  1. # 创建IP集(临时)
  2. sudo firewall-cmd --permanent --new-ipset=blacklist --type=hash:ip
  3. sudo firewall-cmd --reload
  4. # 创建网络集(永久)
  5. sudo firewall-cmd --permanent --new-ipset=netblock --type=hash:net
  6. sudo firewall-cmd --reload
复制代码
  1. # 向IP集添加条目
  2. sudo firewall-cmd --permanent --ipset=blacklist --add-entry=192.168.1.100
  3. sudo firewall-cmd --permanent --ipset=netblock --add-entry=10.0.0.0/8
  4. sudo firewall-cmd --reload
  5. # 从IP集删除条目
  6. sudo firewall-cmd --permanent --ipset=blacklist --remove-entry=192.168.1.100
  7. sudo firewall-cmd --permanent --ipset=netblock --remove-entry=10.0.0.0/8
  8. sudo firewall-cmd --reload
  9. # 列出IP集内容
  10. sudo firewall-cmd --permanent --ipset=blacklist --get-entries
  11. sudo firewall-cmd --permanent --ipset=netblock --get-entries
复制代码
  1. # 使用IP集创建富规则(拒绝来自blacklist中IP的所有访问)
  2. sudo firewall-cmd --permanent --zone=public --add-rich-rule='rule source ipset=blacklist reject'
  3. sudo firewall-cmd --reload
  4. # 使用网络集创建富规则(允许来自netblock中网络的SSH访问)
  5. sudo firewall-cmd --permanent --zone=public --add-rich-rule='rule source ipset=netblock service name="ssh" accept'
  6. sudo firewall-cmd --reload
复制代码

实战案例

案例1:Web服务器防火墙配置

假设我们有一台RHEL Web服务器,需要允许HTTP(80)、HTTPS(443)和SSH(22)访问,同时限制其他所有访问。
  1. # 设置默认区域为public
  2. sudo firewall-cmd --set-default-zone=public
  3. # 添加HTTP服务
  4. sudo firewall-cmd --zone=public --add-service=http --permanent
  5. # 添加HTTPS服务
  6. sudo firewall-cmd --zone=public --add-service=https --permanent
  7. # 添加SSH服务
  8. sudo firewall-cmd --zone=public --add-service=ssh --permanent
  9. # 重新加载防火墙配置
  10. sudo firewall-cmd --reload
  11. # 验证配置
  12. sudo firewall-cmd --zone=public --list-all
复制代码

案例2:数据库服务器防火墙配置

假设我们有一台RHEL数据库服务器,只允许特定应用服务器(192.168.1.100和192.168.1.101)访问MySQL(3306)端口,同时允许管理员从特定网络(10.0.0.0/8)进行SSH访问。
  1. # 设置默认区域为dmz
  2. sudo firewall-cmd --set-default-zone=dmz
  3. # 创建IP集包含允许访问数据库的应用服务器
  4. sudo firewall-cmd --permanent --new-ipset=app-servers --type=hash:ip
  5. sudo firewall-cmd --permanent --ipset=app-servers --add-entry=192.168.1.100
  6. sudo firewall-cmd --permanent --ipset=app-servers --add-entry=192.168.1.101
  7. sudo firewall-cmd --reload
  8. # 允许来自应用服务器的MySQL访问
  9. sudo firewall-cmd --permanent --zone=dmz --add-rich-rule='rule source ipset=app-servers service name="mysql" accept'
  10. # 允许来自管理员网络的SSH访问
  11. sudo firewall-cmd --permanent --zone=dmz --add-rich-rule='rule family="ipv4" source address="10.0.0.0/8" service name="ssh" accept'
  12. # 重新加载防火墙配置
  13. sudo firewall-cmd --reload
  14. # 验证配置
  15. sudo firewall-cmd --zone=dmz --list-all
复制代码

案例3:负载均衡器防火墙配置

假设我们有一台RHEL负载均衡器,需要将外部HTTP(80)请求转发到内部Web服务器(192.168.2.100:8080和192.168.2.101:8080),同时允许管理员SSH访问。
  1. # 设置默认区域为external
  2. sudo firewall-cmd --set-default-zone=external
  3. # 启用IP伪装(NAT)
  4. sudo firewall-cmd --zone=external --add-masquerade --permanent
  5. # 添加端口转发规则,将外部端口80转发到内部服务器
  6. sudo firewall-cmd --zone=external --add-forward-port=port=80:proto=tcp:toport=8080:toaddr=192.168.2.100 --permanent
  7. sudo firewall-cmd --zone=external --add-forward-port=port=80:proto=tcp:toport=8080:toaddr=192.168.2.101 --permanent
  8. # 添加SSH服务
  9. sudo firewall-cmd --zone=external --add-service=ssh --permanent
  10. # 重新加载防火墙配置
  11. sudo firewall-cmd --reload
  12. # 验证配置
  13. sudo firewall-cmd --zone=external --list-all
复制代码

案例4:多区域防火墙配置

假设我们有一台RHEL服务器,有多个网络接口:

• eth0连接到公共网络(使用public区域)
• eth1连接到内部网络(使用internal区域)
• eth2连接到DMZ网络(使用dmz区域)

我们需要为每个区域配置不同的规则:
  1. # 将接口分配到不同的区域
  2. sudo firewall-cmd --zone=public --change-interface=eth0 --permanent
  3. sudo firewall-cmd --zone=internal --change-interface=eth1 --permanent
  4. sudo firewall-cmd --zone=dmz --change-interface=eth2 --permanent
  5. # 配置public区域(只允许SSH和HTTP访问)
  6. sudo firewall-cmd --zone=public --add-service=ssh --permanent
  7. sudo firewall-cmd --zone=public --add-service=http --permanent
  8. # 配置internal区域(允许所有内部流量)
  9. sudo firewall-cmd --zone=internal --set-target=ACCEPT --permanent
  10. # 配置dmz区域(允许HTTP、HTTPS和特定应用端口)
  11. sudo firewall-cmd --zone=dmz --add-service=http --permanent
  12. sudo firewall-cmd --zone=dmz --add-service=https --permanent
  13. sudo firewall-cmd --zone=dmz --add-port=8080/tcp --permanent
  14. # 重新加载防火墙配置
  15. sudo firewall-cmd --reload
  16. # 验证配置
  17. sudo firewall-cmd --zone=public --list-all
  18. sudo firewall-cmd --zone=internal --list-all
  19. sudo firewall-cmd --zone=dmz --list-all
复制代码

案例5:高级安全策略配置

假设我们有一台高安全性的RHEL服务器,需要实现以下策略:

• 允许来自特定管理网络的SSH访问
• 允许HTTP和HTTPS访问
• 限制SSH连接频率(每分钟最多5次新连接)
• 记录并拒绝所有其他连接尝试
  1. # 设置默认区域为public
  2. sudo firewall-cmd --set-default-zone=public
  3. # 添加HTTP和HTTPS服务
  4. sudo firewall-cmd --zone=public --add-service=http --permanent
  5. sudo firewall-cmd --zone=public --add-service=https --permanent
  6. # 允许来自管理网络(10.0.0.0/8)的SSH访问
  7. sudo firewall-cmd --zone=public --add-rich-rule='rule family="ipv4" source address="10.0.0.0/8" service name="ssh" accept' --permanent
  8. # 限制SSH连接频率(使用直接规则)
  9. sudo firewall-cmd --permanent --direct --add-rule ipv4 filter INPUT 0 -p tcp --dport 22 -m conntrack --ctstate NEW -m recent --set
  10. sudo firewall-cmd --permanent --direct --add-rule ipv4 filter INPUT 1 -p tcp --dport 22 -m conntrack --ctstate NEW -m recent --update --seconds 60 --hitcount 5 -j DROP
  11. # 记录并拒绝所有其他连接尝试
  12. sudo firewall-cmd --zone=public --add-rich-rule='rule family="ipv4" source address="0.0.0.0/0" log prefix="denied: " level="notice" limit value="5/m" reject' --permanent
  13. # 重新加载防火墙配置
  14. sudo firewall-cmd --reload
  15. # 验证配置
  16. sudo firewall-cmd --zone=public --list-all
  17. sudo firewall-cmd --direct --get-all-rules
复制代码

防火墙日志与监控

启用防火墙日志

firewalld可以通过syslog记录日志,您需要配置rsyslog来处理这些日志。
  1. # 创建firewalld日志配置文件
  2. sudo vi /etc/rsyslog.d/firewall.conf
复制代码

添加以下内容:
  1. # Log firewall messages to a separate file
  2. :msg, contains, "denied: " /var/log/firewall.log
  3. & stop
复制代码

重启rsyslog服务:
  1. sudo systemctl restart rsyslog
复制代码

查看防火墙日志
  1. # 查看防火墙日志
  2. sudo tail -f /var/log/firewall.log
  3. # 查看被拒绝的连接
  4. sudo grep "denied:" /var/log/firewall.log
复制代码

监控防火墙状态
  1. # 实时监控防火墙规则匹配情况
  2. sudo watch -n 1 'sudo firewall-cmd --direct --get-all-rules'
  3. # 查看连接跟踪表
  4. sudo conntrack -L
  5. # 查看特定IP的连接
  6. sudo conntrack -L -s 192.168.1.100
复制代码

使用日志分析工具

您可以使用日志分析工具如fail2ban来自动阻止恶意IP:
  1. # 安装fail2ban
  2. sudo yum install fail2ban
  3. # 创建jail.local配置文件
  4. sudo cp /etc/fail2ban/jail.conf /etc/fail2ban/jail.local
  5. # 编辑jail.local配置文件
  6. sudo vi /etc/fail2ban/jail.local
复制代码

添加以下内容:
  1. [sshd]
  2. enabled = true
  3. port = ssh
  4. filter = sshd
  5. logpath = /var/log/secure
  6. maxretry = 3
  7. bantime = 3600
  8. [apache-auth]
  9. enabled = true
  10. port = http,https
  11. filter = apache-auth
  12. logpath = /var/log/httpd/error_log
  13. maxretry = 3
  14. bantime = 3600
复制代码

启动fail2ban服务:
  1. sudo systemctl start fail2ban
  2. sudo systemctl enable fail2ban
复制代码

安全最佳实践

最小权限原则

只开放必要的服务和端口,拒绝所有其他流量:
  1. # 设置默认区域为drop(拒绝所有传入流量)
  2. sudo firewall-cmd --set-default-zone=drop
  3. # 只添加必要的服务和端口
  4. sudo firewall-cmd --zone=drop --add-service=ssh --permanent
  5. sudo firewall-cmd --zone=drop --add-service=http --permanent
  6. sudo firewall-cmd --reload
复制代码

网络分段

使用不同的区域来隔离不同安全级别的网络:
  1. # 为不同安全级别的网络创建不同区域
  2. sudo firewall-cmd --permanent --new-zone=high-security
  3. sudo firewall-cmd --permanent --zone=high-security --set-target=DROP
  4. sudo firewall-cmd --permanent --new-zone=medium-security
  5. sudo firewall-cmd --permanent --zone=medium-security --set-target=DROP
  6. sudo firewall-cmd --permanent --new-zone=low-security
  7. sudo firewall-cmd --permanent --zone=low-security --set-target=ACCEPT
  8. # 将接口分配到相应的区域
  9. sudo firewall-cmd --permanent --zone=high-security --change-interface=eth0
  10. sudo firewall-cmd --permanent --zone=medium-security --change-interface=eth1
  11. sudo firewall-cmd --permanent --zone=low-security --change-interface=eth2
  12. # 为每个区域配置适当的规则
  13. sudo firewall-cmd --permanent --zone=high-security --add-service=ssh
  14. sudo firewall-cmd --permanent --zone=medium-security --add-service=http
  15. sudo firewall-cmd --permanent --zone=medium-security --add-service=https
  16. sudo firewall-cmd --reload
复制代码

定期审查和更新

定期审查防火墙规则,移除不再需要的规则:
  1. # 导出当前防火墙配置
  2. sudo firewall-cmd --permanent --direct --get-all-rules > /root/firewall-rules-$(date +%Y%m%d).txt
  3. sudo firewall-cmd --zone=public --list-all > /root/firewall-public-$(date +%Y%m%d).txt
  4. # 定期审查日志
  5. sudo grep "denied:" /var/log/firewall.log | awk '{print $8}' | sort | uniq -c | sort -nr
复制代码

使用IP白名单

限制只有特定IP可以访问敏感服务:
  1. # 创建管理员IP集
  2. sudo firewall-cmd --permanent --new-ipset=admin-ips --type=hash:ip
  3. sudo firewall-cmd --permanent --ipset=admin-ips --add-entry=192.168.1.100
  4. sudo firewall-cmd --permanent --ipset=admin-ips --add-entry=192.168.1.101
  5. # 只允许管理员IP访问SSH
  6. sudo firewall-cmd --permanent --zone=public --remove-service=ssh
  7. sudo firewall-cmd --permanent --zone=public --add-rich-rule='rule source ipset=admin-ips service name="ssh" accept'
  8. sudo firewall-cmd --reload
复制代码

定期备份和恢复

定期备份防火墙配置,以便在需要时恢复:
  1. # 备份firewalld配置
  2. sudo cp -r /etc/firewalld /root/firewalld-backup-$(date +%Y%m%d)
  3. # 恢复firewalld配置
  4. sudo systemctl stop firewalld
  5. sudo cp -r /root/firewalld-backup-YYYYMMDD/* /etc/firewalld/
  6. sudo systemctl start firewalld
复制代码

使用配置管理工具

对于大型环境,考虑使用配置管理工具如Ansible、Puppet或Chef来管理防火墙配置:
  1. # Ansible示例:配置firewalld
  2. ---
  3. - hosts: webservers
  4.   become: yes
  5.   tasks:
  6.     - name: Install firewalld
  7.       yum:
  8.         name: firewalld
  9.         state: present
  10.    
  11.     - name: Start and enable firewalld
  12.       service:
  13.         name: firewalld
  14.         state: started
  15.         enabled: yes
  16.    
  17.     - name: Open HTTP and HTTPS ports
  18.       firewalld:
  19.         service: "{{ item }}"
  20.         permanent: yes
  21.         state: enabled
  22.         immediate: yes
  23.       with_items:
  24.         - http
  25.         - https
复制代码

总结

Red Hat Enterprise Linux的firewalld提供了强大而灵活的网络防火墙功能,通过本文的详细解析,您已经了解了从基础规则到高级策略的完整配置方法。从基本的服务和端口管理,到复杂的富规则和直接规则,firewalld能够满足企业级系统的各种安全需求。

通过合理配置区域、服务和规则,您可以构建一个安全可靠的网络防护体系。同时,结合日志监控和最佳实践,您可以持续优化防火墙策略,确保系统安全。

在实际应用中,请记住以下几点:

1. 始终遵循最小权限原则,只开放必要的服务和端口
2. 定期审查和更新防火墙规则,移除不再需要的配置
3. 使用网络分段来隔离不同安全级别的网络
4. 建立完善的日志记录和监控机制
5. 定期备份防火墙配置,以便在需要时恢复

通过掌握这些技能,您将能够有效地保护您的RHEL系统免受网络威胁,确保企业级系统的安全性和稳定性。
「七転び八起き(ななころびやおき)」
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则