跳到主要内容
CentOS Firewalld 服务、端口及访问控制实战指南 | 极客日志
Shell / Bash
CentOS Firewalld 服务、端口及访问控制实战指南 Firewalld 是 CentOS 7 及以上版本推荐的动态防火墙管理工具,提供基于区域的网络流量控制。内容涵盖服务定义与管理、端口开放与关闭、自定义服务配置、端口转发设置,以及基于 IP 和 MAC 地址的访问控制规则。通过 firewall-cmd 命令可实现临时或永久策略调整,保障系统网络安全。
筑梦师 发布于 2026/3/15 更新于 2026/4/29 7 浏览一、引言
在 CentOS 系统中,防火墙管理工具经历了从 iptables 到 firewalld 的演变。了解这一变迁过程有助于更好地理解和使用当前的防火墙管理工具。
1. iptables 时代
简介
iptables 是 Linux 内核中 Netfilter 项目的用户空间实用程序,用于配置 IPv4 数据包过滤规则。它允许用户定义规则以控制网络流量的进出。
功能
**数据包过滤:**根据源地址、目标地址、端口等条件过滤数据包。
**NAT:**网络地址转换,主要用于互联网共享。
**状态检测:**跟踪连接状态,允许基于状态的规则。
**丰富的规则集:**支持复杂的规则和链结构,允许用户自定义网络流量控制。
配置
iptables 规则通过命令行工具 iptables 进行管理,通常规则配置会保存在 /etc/sysconfig/iptables 文件中。重启系统时,可以通过这个文件加载规则。
2. firewalld 时代
简介
firewalld 是一个动态管理防火墙的守护进程,提供基于区域的网络流量管理。它是在 CentOS 7 及以后版本中引入的,旨在简化防火墙管理,提供更灵活和动态的控制。
功能
**动态管理:**支持在不中断现有连接的情况下动态更改规则。
**区域概念:**基于信任级别定义不同的区域,每个区域有不同的规则。
**服务管理:**可以通过服务名称而不是端口号来配置规则。
**接口绑定:**可以将网络接口绑定到特定的区域。
**丰富的接口:**提供命令行工具 firewall-cmd 和图形界面工具(如 firewall-config)进行管理。
二、服务管理
1. Firewalld 中的服务定义
在 Firewalld 中,服务定义是指预定义的服务配置,这些配置包括服务的名称、描述以及服务所需的开放端口和协议。服务定义使得管理防火墙规则更加简便,因为我们可以直接通过服务名称来允许或禁止网络流量,而无需手动指定每个端口和协议。
2. 查看已定义的服务
我们可以查看 Firewalld 中所有已定义的服务:
sudo firewall-cmd --get-services
3. 启用/禁用特定服务
在 Firewalld 中,可以通过命令启用或禁用特定的服务。这些操作可以是临时的(当前运行时有效)或者永久的(重启后依然有效)。
启用服务
启用服务(临时)
要在指定区域中临时启用某个服务,可以使用以下命令:
sudo firewall-cmd --zone=<区域名> --add-service=<服务名>
例如,在 public 区域中启用 HTTP 服务:
sudo firewall-cmd --zone=public --add-service=http
启用服务(永久)
要永久启用某个服务,可以添加 --permanent 参数:
sudo firewall-cmd --zone=<区域名> --add-service=<服务名> --permanent
例如,在 public 区域中永久启用 HTTP 服务:
sudo firewall-cmd --zone=public --add-service=http --permanent
启用服务后,通常需要重新加载 Firewalld 配置以应用更改:
sudo firewall-cmd --reload
禁用服务 禁用服务(临时)
要在指定区域中临时禁用某个服务,可以使用以下命令:
sudo firewall-cmd --zone=<区域名> --remove-service=<服务名>
例如,在 public 区域中禁用 HTTP 服务:
sudo firewall-cmd --zone=public --remove-service=http
禁用服务(永久)
要永久禁用某个服务,可以添加 --permanent 参数:
sudo firewall-cmd --zone=<区域名> --remove-service=<服务名> --permanent
例如,在 public 区域中永久禁用 HTTP 服务:
sudo firewall-cmd --zone=public --remove-service=http --permanent
同样,禁用服务后,通常需要重新加载 Firewalld 配置以应用更改:
sudo firewall-cmd --reload
验证服务状态
我们可以使用以下命令验证某个服务在指定区域中是否启用:
sudo firewall-cmd --zone=<区域名> --query-service=<服务名>
例如,查询 HTTP 服务是否在 public 区域中启用:
sudo firewall-cmd --zone=public --query-service=http
该命令将返回 yes 或 no,表示服务是否已启用。
4. 自定义服务配置 在 Firewalld 中,自定义服务配置可以让你添加特定的服务,这些服务可能不包含在默认的 Firewalld 服务列表中。
1. 创建服务配置文件 自定义服务配置文件存储在 /etc/firewalld/services/ 目录下。文件名应以 .xml 结尾。例如,创建一个名为 my-custom-service.xml 的文件:
sudo nano /etc/firewalld/services/my-custom-service.xml
2. 编辑服务配置文件 在编辑器中,定义你的自定义服务。下面是一个示例配置文件,用于创建一个名为 "My Custom Service" 的服务,它使用 TCP 端口 12345:
<?xml version="1.0" encoding="utf-8" ?>
<service >
<short > My Custom Service</short >
<description > A custom service for demonstration purposes.</description >
<port protocol ="tcp" port ="12345" />
</service >
3. 重新加载 Firewalld 配置 保存并关闭文件后,重新加载 Firewalld 以应用新的服务配置:
sudo firewall-cmd --reload
4. 验证自定义服务 sudo firewall-cmd --get-services | grep my-custom-service
如果配置正确,你应该能看到 my-custom-service 列在输出中。
5. 启用自定义服务 现在我们可以像管理其他服务一样启用或禁用你的自定义服务。例如,启用它:
sudo firewall-cmd --zone=public --add-service=my-custom-service
sudo firewall-cmd --zone=public --add-service=my-custom-service --permanent
sudo firewall-cmd --reload
sudo firewall-cmd --zone=public --query-service=my-custom-service
三、端口管理
1. 开放特定端口 临时开放端口
要在当前区域(默认是 public)中临时开放一个特定端口(例如 TCP 端口 8080),请使用以下命令:
sudo firewall-cmd --zone=public --add-port=8080/tcp
永久开放端口
要永久开放一个端口,请添加 --permanent 选项,然后重新加载 Firewalld 配置:
sudo firewall-cmd --zone=public --add-port=8080/tcp --permanent
sudo firewall-cmd --reload
2. 关闭特定端口 临时关闭端口
要在当前区域中临时关闭一个端口(例如 TCP 端口 8080),请使用以下命令:
sudo firewall-cmd --zone=public --remove-port=8080/tcp
永久关闭端口
要永久关闭一个端口,请添加 --permanent 选项,然后重新加载 Firewalld 配置:
sudo firewall-cmd --zone=public --remove-port=8080/tcp --permanent
sudo firewall-cmd --reload
3. 查看当前开放的端口 要查看当前区域中所有开放的端口,可以使用以下命令:
sudo firewall-cmd --zone=public --list-ports
4. 端口转发设置 在 Firewalld 中设置端口转发(也称为端口重定向)可以通过以下步骤完成。假设我们希望将外部访问的某个端口重定向到另一台服务器的端口。
示例:设置端口转发
转发所有到本机 8080 端口的流量到内网的 192.168.1.100 的 80 端口
1. 启用 IP 转发 首先需要在系统中启用 IP 转发。编辑 /etc/sysctl.conf 文件并添加以下行:
2. 设置端口转发规则 通过 firewall-cmd 命令来设置端口转发规则:
sudo firewall-cmd --zone=public --add-forward-port=port=8080:proto=tcp:toport=80:toaddr=192.168.1.100
3. 使端口转发规则永久生效 要使上述端口转发规则永久生效,可以添加 --permanent 选项并重新加载配置:
sudo firewall-cmd --zone=public --add-forward-port=port=8080:proto=tcp:toport=80:toaddr=192.168.1.100 --permanent
sudo firewall-cmd --reload
5. 使用 firewall-cmd 的常见选项
**--zone=:**指定区域,默认为 public。
**--add-port=/:**添加要开放的端口和协议(例如 8080/tcp)。
**--remove-port=/:**删除要关闭的端口和协议。
**--permanent:**使更改永久生效,需要重新加载配置。
**--reload:**重新加载 Firewalld 配置以应用永久更改。
**--list-ports:**列出当前区域中开放的所有端口。
四、IP 地址与 MAC 地址过滤
1. 基于 IP 地址的访问控制
在 Firewalld 中,基于 IP 地址的访问控制可以通过创建特定的规则来允许或拒绝特定 IP 地址的访问。
1. 查看当前区域设置 首先,查看当前系统使用的防火墙区域,以便在该区域下进行配置:
sudo firewall-cmd --get-active-zones
假设返回结果为 public,那么接下来的配置将针对 public 区域进行。
2. 允许特定 IP 地址访问特定端口 假设我们希望允许 IP 地址 192.168.1.10 访问服务器的 22 端口(SSH),可以使用以下命令:
sudo firewall-cmd --zone=public --add-rich-rule='rule family="ipv4" source address="192.168.1.10" port protocol="tcp" port="22" accept'
要使该规则永久生效,可以加上 --permanent 参数,并重新加载防火墙规则:
sudo firewall-cmd --zone=public --add-rich-rule='rule family="ipv4" source address="192.168.1.10" port protocol="tcp" port="22" accept' --permanent
sudo firewall-cmd --reload
3. 拒绝特定 IP 地址访问特定端口 假设我们希望拒绝 IP 地址 192.168.1.20 访问服务器的 80 端口(HTTP),可以使用以下命令:
sudo firewall-cmd --zone=public --add-rich-rule='rule family="ipv4" source address="192.168.1.20" port protocol="tcp" port="80" reject'
要使该规则永久生效,可以加上 --permanent 参数,并重新加载防火墙规则:
sudo firewall-cmd --zone=public --add-rich-rule='rule family="ipv4" source address="192.168.1.20" port protocol="tcp" port="80" reject' --permanent
sudo firewall-cmd --reload
4. 允许或拒绝整个子网 如果需要允许或拒绝整个子网的访问,可以指定子网地址。比如允许整个 192.168.1.0/24 子网访问服务器的 80 端口,可以使用以下命令:
sudo firewall-cmd --zone=public --add-rich-rule='rule family="ipv4" source address="192.168.1.0/24" port protocol="tcp" port="80" accept'
要使该规则永久生效,可以加上 --permanent 参数,并重新加载防火墙规则:
sudo firewall-cmd --zone=public --add-rich-rule='rule family="ipv4" source address="192.168.1.0/24" port protocol="tcp" port="80" accept' --permanent
sudo firewall-cmd --reload
5. 查看现有的规则 要查看当前区域中的所有 rich 规则,可以使用以下命令:
sudo firewall-cmd --zone=public --list-rich-rules
6. 删除现有的规则 假设需要删除先前添加的允许 IP 地址 192.168.1.10 访问 22 端口的规则,可以使用以下命令:
sudo firewall-cmd --zone=public --remove-rich-rule='rule family="ipv4" source address="192.168.1.10" port protocol="tcp" port="22" accept'
要使该删除操作永久生效,可以加上 --permanent 参数,并重新加载防火墙规则:
sudo firewall-cmd --zone=public --remove-rich-rule='rule family="ipv4" source address="192.168.1.10" port protocol="tcp" port="22" accept' --permanent
sudo firewall-cmd --reload
2. MAC 地址绑定与过滤
在 Firewalld 中,MAC 地址绑定与过滤可以通过创建特定的规则来限制或允许基于 MAC 地址的访问。这种方式可以用于网络访问控制,确保只有特定设备能够访问某些资源。
1. 查看当前区域设置 首先,查看当前系统使用的防火墙区域,以便在该区域下进行配置:
sudo firewall-cmd --get-active-zones
假设返回结果为 public,那么接下来的配置将针对 public 区域进行。
2. 允许特定 MAC 地址访问网络 假设我们希望允许 MAC 地址 00:11:22:33:44:55 的设备访问网络,可以使用以下命令:
sudo firewall-cmd --zone=public --add-rich-rule='rule family="ipv4" source mac="00:11:22:33:44:55" accept'
要使该规则永久生效,可以加上 --permanent 参数,并重新加载防火墙规则:
sudo firewall-cmd --zone=public --add-rich-rule='rule family="ipv4" source mac="00:11:22:33:44:55" accept' --permanent
sudo firewall-cmd --reload
3. 拒绝特定 MAC 地址访问网络 假设我们希望拒绝 MAC 地址 00:11:22:33:44:66 的设备访问网络,可以使用以下命令:
sudo firewall-cmd --zone=public --add-rich-rule='rule family="ipv4" source mac="00:11:22:33:44:66" drop'
要使该规则永久生效,可以加上 --permanent 参数,并重新加载防火墙规则:
sudo firewall-cmd --zone=public --add-rich-rule='rule family="ipv4" source mac="00:11:22:33:44:66" drop' --permanent
sudo firewall-cmd --reload
4. 查看现有的规则 要查看当前区域中的所有 rich 规则,可以使用以下命令:
sudo firewall-cmd --zone=public --list-rich-rules
5. 删除现有的规则 假设需要删除先前添加的允许 MAC 地址 00:11:22:33:44:55 的规则,可以使用以下命令:
sudo firewall-cmd --zone=public --remove-rich-rule='rule family="ipv4" source mac="00:11:22:33:44:55" accept'
要使该删除操作永久生效,可以加上 --permanent 参数,并重新加载防火墙规则:
sudo firewall-cmd --zone=public --remove-rich-rule='rule family="ipv4" source mac="00:11:22:33:44:55" accept' --permanent
sudo firewall-cmd --reload
相关免费在线工具 Base64 字符串编码/解码 将字符串编码和解码为其 Base64 格式表示形式即可。 在线工具,Base64 字符串编码/解码在线工具,online
Base64 文件转换器 将字符串、文件或图像转换为其 Base64 表示形式。 在线工具,Base64 文件转换器在线工具,online
Markdown转HTML 将 Markdown(GFM)转为 HTML 片段,浏览器内 marked 解析;与 HTML转Markdown 互为补充。 在线工具,Markdown转HTML在线工具,online
HTML转Markdown 将 HTML 片段转为 GitHub Flavored Markdown,支持标题、列表、链接、代码块与表格等;浏览器内处理,可链接预填。 在线工具,HTML转Markdown在线工具,online
JSON 压缩 通过删除不必要的空白来缩小和压缩JSON。 在线工具,JSON 压缩在线工具,online
JSON美化和格式化 将JSON字符串修饰为友好的可读格式。 在线工具,JSON美化和格式化在线工具,online