CentOS 防火墙配置:从入门到精通
CentOS 作为一款流行的服务器操作系统,安全性是至关重要的。防火墙是保护服务器免受恶意攻击的第一道防线。CentOS 7 及更高版本默认使用 firewalld
作为防火墙管理工具,它提供了比旧版 iptables
更为灵活和动态的配置方式。本文将带你从 firewalld
的基础概念入手,逐步深入到高级配置,助你打造坚固的服务器安全体系。
第一部分:firewalld
基础入门
-
firewalld
简介:firewalld
是一个动态防火墙管理器,它允许你在运行时修改防火墙规则,而无需重启整个防火墙服务。这使得它非常适合动态变化的服务器环境。firewalld
使用区域 (zone) 的概念来管理规则,每个区域代表不同的信任级别。 -
firewalld
的核心概念:-
区域 (Zone): 预定义的规则集,代表不同的信任级别。例如:
drop
: 丢弃所有入站流量,不响应任何请求。block
: 拒绝所有入站流量,并返回 ICMP 错误消息。public
: 用于不受信任的公共网络,只允许少量入站连接。external
: 用于启用 NAT 的外部网络,用于路由器。dmz
: 用于隔离的 DMZ 区域,只允许特定服务。work
: 用于工作场所网络,信任网络中的其他计算机。home
: 用于家庭网络,信任网络中的其他计算机。internal
: 用于内部网络,信任网络中的其他计算机。trusted
: 允许所有流量。
-
服务 (Service): 预定义的规则集,用于允许特定服务的流量通过防火墙。例如:
http
,https
,ssh
,ftp
等。 -
端口 (Port): 指定允许或拒绝流量的 TCP 或 UDP 端口。
-
协议 (Protocol): 指定使用的网络协议,如 TCP 或 UDP。
-
源地址 (Source): 指定允许或拒绝流量的源 IP 地址或网络。
-
富规则 (Rich Rule): 更复杂的规则,可以组合多个条件来匹配流量。
-
-
firewalld
的基本操作:-
启动、停止和重启
firewalld
:bash
systemctl start firewalld # 启动 firewalld
systemctl stop firewalld # 停止 firewalld
systemctl restart firewalld # 重启 firewalld
systemctl status firewalld # 查看 firewalld 状态
systemctl enable firewalld # 设置开机自启
systemctl disable firewalld # 取消开机自启 -
查看当前防火墙状态:
bash
firewall-cmd --state # 查看 firewalld 运行状态
firewall-cmd --get-default-zone # 获取默认区域
firewall-cmd --get-active-zones # 获取当前激活的区域 -
切换默认区域:
bash
firewall-cmd --set-default-zone=public # 设置默认区域为 public -
查看区域的配置:
bash
firewall-cmd --list-all --zone=public # 查看 public 区域的所有配置
firewall-cmd --list-services --zone=public # 查看 public 区域允许的服务
firewall-cmd --list-ports --zone=public # 查看 public 区域允许的端口
-
第二部分:firewalld
常用配置
-
允许常用服务:
-
允许 SSH 服务:
bash
firewall-cmd --add-service=ssh --permanent
firewall-cmd --reload
这条命令允许 SSH 服务通过防火墙。--permanent
选项表示该规则永久生效,重启后依然有效。firewall-cmd --reload
命令重新加载防火墙配置,使新的规则生效。 -
允许 HTTP 和 HTTPS 服务:
bash
firewall-cmd --add-service=http --permanent
firewall-cmd --add-service=https --permanent
firewall-cmd --reload
这条命令允许 HTTP 和 HTTPS 服务通过防火墙。 -
允许 FTP 服务:
bash
firewall-cmd --add-service=ftp --permanent
firewall-cmd --reload
这条命令允许 FTP 服务通过防火墙。注意:FTP服务通常需要配置端口转发,并考虑使用更安全的SFTP替代。
-
-
允许特定端口:
-
允许 TCP 8080 端口:
bash
firewall-cmd --add-port=8080/tcp --permanent
firewall-cmd --reload -
允许 UDP 53 端口:
bash
firewall-cmd --add-port=53/udp --permanent
firewall-cmd --reload
-
-
允许特定源 IP 地址:
-
允许来自 192.168.1.100 的所有流量:
bash
firewall-cmd --add-source=192.168.1.100 --permanent
firewall-cmd --reload -
允许来自 192.168.1.0/24 网段的所有流量到 SSH 服务:
bash
firewall-cmd --add-rich-rule='rule family="ipv4" source address="192.168.1.0/24" service name="ssh" accept' --permanent
firewall-cmd --reload
-
-
删除规则:
-
删除允许 SSH 服务的规则:
bash
firewall-cmd --remove-service=ssh --permanent
firewall-cmd --reload -
删除允许 TCP 8080 端口的规则:
bash
firewall-cmd --remove-port=8080/tcp --permanent
firewall-cmd --reload -
删除允许来自 192.168.1.100 的所有流量的规则:
bash
firewall-cmd --remove-source=192.168.1.100 --permanent
firewall-cmd --reload
-
第三部分:firewalld
高级配置
-
使用富规则 (Rich Rules):
富规则提供了更强大的流量控制能力,可以基于多个条件匹配流量。
-
示例 1:允许来自 192.168.1.0/24 网段的所有流量到 TCP 80 端口:
bash
firewall-cmd --add-rich-rule='rule family="ipv4" source address="192.168.1.0/24" port port="80" protocol="tcp" accept' --permanent
firewall-cmd --reload -
示例 2:拒绝来自 10.0.0.10 的所有流量:
bash
firewall-cmd --add-rich-rule='rule family="ipv4" source address="10.0.0.10" reject' --permanent
firewall-cmd --reload -
示例 3:限制 SSH 连接速率,每分钟最多 5 个连接:
bash
firewall-cmd --add-rich-rule='rule service name="ssh" limit value="5/m" accept' --permanent
firewall-cmd --reload
-
-
端口转发 (Port Forwarding):
端口转发可以将流量从一个端口转发到另一个端口,或者从一个 IP 地址转发到另一个 IP 地址。
-
示例:将 80 端口的流量转发到 8080 端口:
bash
firewall-cmd --add-forward-port=port=80:proto=tcp:toport=8080 --permanent
firewall-cmd --reload -
示例:将 80 端口的流量转发到 192.168.1.100 的 80 端口:
bash
firewall-cmd --add-forward-port=port=80:proto=tcp:toaddr=192.168.1.100 --permanent
firewall-cmd --reload
-
-
直接规则 (Direct Rules):
直接规则允许你直接添加
iptables
规则,绕过firewalld
的抽象层。这提供了最大的灵活性,但也需要你对iptables
有深入的了解。 请谨慎使用直接规则,错误的配置可能导致防火墙失效甚至服务器无法访问。-
示例:允许来自 192.168.1.0/24 网段的所有流量到 TCP 22 端口:
bash
firewall-cmd --direct --permanent --add-rule ipv4 filter INPUT 0 -s 192.168.1.0/24 -p tcp --dport 22 -j ACCEPT
firewall-cmd --reload -
删除上面添加的直接规则:
bash
firewall-cmd --direct --permanent --remove-rule ipv4 filter INPUT 0 -s 192.168.1.0/24 -p tcp --dport 22 -j ACCEPT
firewall-cmd --reload
-
-
自定义服务 (Custom Service):
firewalld
允许你创建自定义服务,以便更方便地管理特定的应用程序或服务所需的端口和协议。-
创建自定义服务文件: 在
/etc/firewalld/services/
目录下创建一个.xml
文件,例如my-app.xml
,内容如下:xml
<?xml version="1.0" encoding="utf-8"?>
<service>
<short>My Application</short>
<description>This is my custom application service.</description>
<port protocol="tcp" port="9000"/>
<port protocol="udp" port="9001"/>
</service> -
添加自定义服务到区域:
bash
firewall-cmd --add-service=my-app --permanent
firewall-cmd --reload
-
第四部分:安全最佳实践
-
最小权限原则:
只允许必要的服务和端口通过防火墙,禁止所有其他流量。
-
定期审查防火墙规则:
定期检查防火墙规则,删除不再需要的规则,并确保规则仍然有效和安全。
-
使用强密码和密钥认证:
使用强密码,并尽可能使用密钥认证来保护 SSH 服务。
-
启用日志记录:
启用
firewalld
的日志记录,以便监控和分析防火墙活动。可以使用auditd
或rsyslog
等工具来记录日志。 -
及时更新系统和软件:
及时更新操作系统和软件,以修复安全漏洞。
-
使用入侵检测系统 (IDS):
考虑使用入侵检测系统 (IDS) 来监控恶意活动。
-
限制不必要的网络服务:
禁用或卸载不需要的网络服务,以减少攻击面。
总结
firewalld
是一个功能强大的防火墙管理工具,掌握其基本概念和配置方法对于保护 CentOS 服务器的安全至关重要。通过本文的学习,你应该能够配置 firewalld
来满足各种安全需求,并为你的服务器构建一道坚固的防线。记住,安全是一个持续的过程,需要不断学习和更新知识,才能应对不断变化的网络安全威胁。 始终保持警惕,并采取适当的安全措施,才能确保你的服务器的安全。