简介
Firewalld 是一款适用于许多 Linux 发行版的防火墙管理解决方案。它作为 Linux 内核提供的 iptables 数据包过滤系统的接口。在本指南中,您将学习如何为您的服务器配置防火墙。我们还将向您展示使用 firewall-cmd 管理工具管理防火墙的基础知识。
Firewalld 基础知识
FirewallD 使用区域(zones)和服务(services)的概念,而不是 iptables 的链(chain)和规则(rules)。根据您配置的区域和服务,您可以控制允许或不允许进出系统的流量。可以使用命令行工具 firewall-cmd 来配置和管理 FirewallD。
安装并启用防火墙以在开机时启动
在大多数 Linux 发行版上,firewallD 已经安装。但是,如果您需要自己安装,请键入以下语法:
|
1 |
sudo yum install firewalld |
安装 firewalld 后,您可以启用该服务并重启服务器:
|
1 2 |
sudo systemctl enable firewalld sudo reboot |
接下来,重启您的服务器。成功重启服务器后,您的防火墙将被启用。之后,使用以下命令验证服务是否已激活:
|
1 |
sudo firewall-cmd --state |

输出显示默认的防火墙设置正在工作。
检查默认设置
您可以使用此命令检查服务器选择的区域:
|
1 |
firewall-cmd --get-default-zone |

通过键入以下内容验证活动区域:
|
1 |
firewall-cmd --get-active-zones |

使用此语法打印默认区域的配置,以了解附加到公共区域的规则:
|
1 |
sudo firewall-cmd --list-all |

输出表明该区域既是默认区域也是活动区域。它还显示 eth0 和 eth1 接口已分配给该区域。
检查备用区域
除了默认和活动区域外,您还可以探索其他区域。输入此命令以查看所有可用区域:
|
1 |
firewall-cmd --get-zones |

通过在 –list-all 命令中添加 –zone= 参数来检查分配给特定区域的配置:
|
1 |
sudo firewall-cmd --zone=home --list-all |

更改接口区域
您可以使用 –change-interface 选项轻松更改接口区域。以下命令将接口 eth1 分配给工作区:
|
1 |
sudo firewall-cmd --zone=work --change-interface=eth1 |
您可以通过键入以下内容来验证更改:
|
1 |
sudo firewall-cmd --get-active-zones |
更改默认区域
要更改默认区域,请使用 –set-default-zone,后跟要设置为默认的区域名称。例如,要更改默认区域,您应该运行以下命令:
|
1 |
sudo firewall-cmd --set-default-zone=home |
接下来,您可以使用以下命令验证更改:
|
1 |
sudo firewall-cmd --get-default-zone |
为您的应用程序设置规则
让我们了解一下为服务定义防火墙例外所需的基础知识:
向您的区域添加服务
最直接的方法是将所需的端口或服务添加到您正在使用的区域中。同样,您可以使用 –get-services 选项来查看所有可用的服务:
|
1 |
firewall-cmd --get-services |

您可以使用参数 –add-service = 为区域激活服务。该操作针对默认区域或由 –zone = 参数定义的任何区域。默认情况下,仅配置当前的防火墙会话。您可以通过激活 –permanent 标志来设置永久防火墙配置。例如,如果您运行的 Web 服务器提供常规 HTTP 流量,您可以通过输入以下内容,在此会话中允许我们 “public” 区域中的接口使用此流量:
|
1 |
sudo firewall-cmd --zone=public --add-service=http |
如果您想更改默认区域,可以省略 –zone =。您可以使用 –list-all 或 –list-services 操作来检查操作是否成功:
|
1 |
sudo firewall-cmd --zone=public --list-services |

一旦您验证了所有内容都按预期工作,您很可能希望更改永久防火墙规则,以便在重启后您的服务仍然可用。我们可以通过输入以下语法永久更改我们的 “public” 区域:
|
1 2 3 4 |
sudo firewall-cmd --zone=public --permanent --add-service=http output: success |
您可以通过在 –list-services 操作中添加 –permanent 标志来检查这是否成功。对于所有 –all 永久操作,您必须使用 sudo:
|
1 2 3 4 |
sudo firewall-cmd --zone=public --permanent --list-services output: dhcpv6-client http ssh |
您的 “public” 区域现在允许端口 80 上的 HTTP 流量。您可以使用以下命令将其添加到当前会话和持久规则集中:
|
1 2 3 |
sudo firewall-cmd --zone=public --add-service=https sudo firewall-cmd --zone=public --permanent --add-service=https |
如果没有符合您要求的服务,您有两种极佳的选择来处理这种情况:
- 为您的区域打开端口
为特定应用程序添加支持最直接的方法是打开每个区域中使用的端口。这非常简单,只需为您需要打开的端口指定端口或端口范围以及相应的协议即可。例如,如果您的应用程序在端口 5000 上运行并使用 TCP,您可以使用 –add-port = 参数将其添加到此会话的 “public” 区域。协议可以是 TCP 或 UDP:
|
1 2 3 4 |
sudo firewall-cmd --zone=public --add-port=5000/tcp output: success |
为了检查操作是否成功,请使用 –list-ports 操作:
|
1 2 3 4 |
sudo firewall-cmd --zone=public --list-ports Output: 5000/tcp |
您还可以通过用连字符分隔范围中的起始端口和结束端口来指定连续端口的范围。例如,如果您的应用程序使用 UDP 端口 4990 到 4999,您可以通过编写以下内容在 “public” 中打开它们:
|
1 |
sudo firewall-cmd --zone=public --add-port=4990-4999/udp |
测试后,我们可能希望将它们添加到永久防火墙中。您可以通过输入以下内容来执行此操作:
|
1 2 3 |
sudo firewall-cmd --zone=public --permanent --add-port=5000/tcp sudo firewall-cmd --zone=public --permanent --add-port=4990-4999/udp sudo firewall-cmd --zone=public --permanent --list-ports |

- 定义服务
服务是具有关联名称和描述的端口集合。服务比端口更容易管理,但需要一些初始工作。最直接的入门方法是将现有脚本(位于 / usr / lib / firewalld / services 中)复制到 /etc/firewalld/services 目录。例如,您可以按如下方式复制 SSH 服务定义,以便在 “example” 服务定义中使用。文件名减去 XML 后缀决定了防火墙服务列表中的服务名称:
|
1 |
sudo cp /usr/lib/firewalld/services/ssh.xml /etc/firewalld/services/example.xml |
此时,您可以调整复制文件中的定义:
|
1 |
sudo vi /etc/firewalld/services/example.xml |
首先,该文件包含您复制的 SSH 定义:
|
1 2 3 4 5 6 |
<?xml version="1.0" encoding="utf-8"?> <service> <short>SSH</short> <description>Secure Shell (SSH) 是 一个 协议 用于 登录 到 和 执行 命令 在 远程 机器. 它 提供 安全 加密 通信. 如果 您 计划 在 访问 您的 机器 远程 通过 SSH 通过 一个 受防火墙保护的 接口, 启用 此 选项. 您 需要 该 openssh-服务器 包 已安装 为了 此 选项 以 生效 有用.</description> <port protocol="tcp" port="22"/> </service> |
此定义的大部分内容由元数据组成。您必须更改 <short> 标签中的服务简称。这是一个易于辨认的服务名称。假设对于我们的 “example” 服务,我们需要为 TCP 打开端口 7777,为 UDP 打开端口 8888。您可以通过按 i 进入插入(INSERT)模式来更改现有定义:
|
1 2 3 4 5 6 7 |
<?xml version="1.0" encoding="utf-8"?> <service> <short>示例 服务</short> <description>这 是 只是 一个 示例 服务. 它 可能 不应该't 被 使用 在 一个 真实 系统.</description> <port protocol="tcp" port="7777"/> <port protocol="udp" port="8888"/> </service> |
接下来,按 ESC 并输入 :x 以保存并关闭文件。然后,输入以下命令重启防火墙,以便能够访问您的新服务;
|
1 |
sudo firewall-cmd --reload |
之后,使用以下命令获取可用服务列表:
|
1 |
firewall-cmd --get-services |

此服务现在已在您的区域中可用。
创建您自己的区域
虽然预定义的区域可能对大多数用户来说已经足够,但定义您自己的区域以更全面地描述其功能可能会很有用。
添加区域时,请将其添加到您的永久防火墙设置中。然后您可以重新加载以将设置应用到当前会话。例如,您可以通过输入以下内容来创建前面讨论的两个区域:
|
1 2 |
sudo firewall-cmd --permanent --new-zone=publicweb sudo firewall-cmd --permanent --new-zone=privateDNS |
您可以使用此命令确认它们存在于您的永久配置中:
|
1 |
sudo firewall-cmd --permanent --get-zones |

重新加载防火墙以使这些新区域进入活动配置:
|
1 2 3 4 5 |
sudo firewall-cmd --reload firewall-cmd --get-zones 输出: block dmz drop external home internal privateDNS public publicweb trusted work |
现在,您可以为您的区域分配适当的服务和端口。例如,对于 —publicweb” 区域,您可能希望添加 SSH、HTTP 和 HTTPS 服务:
|
1 2 3 |
sudo firewall-cmd --zone=publicweb --add-service=ssh sudo firewall-cmd --zone=publicweb --add-service=http sudo firewall-cmd --zone=publicweb --add-service=https |

此外,您可以使用此命令将 DNS 服务添加到您的“privateDNS”区域:
|
1 2 |
sudo firewall-cmd --zone=privateDNS --add-service=dns sudo firewall-cmd --zone=privateDNS --list-all |

接下来,您可以将您的接口更改为这些新区域以进行测试:
|
1 2 3 |
sudo firewall-cmd --zone=publicweb --change-interface=eth0 sudo firewall-cmd --zone=privateDNS --change-interface=eth1 |
测试配置以查看其是否正常工作。如果这些值对您有效,您必须将相同的规则添加到永久配置中。您可以通过使用 —permanent 指示符重新应用规则来执行此操作:
|
1 2 3 4 5 6 7 |
sudo firewall-cmd --zone=publicweb --permanent --add-service=ssh sudo firewall-cmd --zone=publicweb --permanent --add-service=http sudo firewall-cmd --zone=publicweb --permanent --add-service=https sudo firewall-cmd --zone=privateDNS --permanent --add-service=dns |
永久应用这些规则后,您可以重新启动网络并重新加载防火墙服务:
|
1 2 3 |
sudo systemctl restart network sudo systemctl reload firewalld |
检查区域是否已正确分配:
|
1 |
firewall-cmd --get-active-zones |

此外,确保两个区域都具有正确的服务:
|
1 2 3 4 |
sudo firewall-cmd --zone=publicweb --list-services 输出: http https ssh |
|
1 2 3 4 5 |
sudo firewall-cmd --zone=privateDNS --list-services 输出: dns |
如果您想将其中一个区域设置为其他接口的默认区域,则必须使用此命令配置带有参数 –set-default-zone= 的行为:
|
1 |
sudo firewall-cmd --set-default-zone=publicweb |
结论
至此,您已成功创建了自己的区域。您应该对在 CentOS 系统上管理 firewalld 服务以进行日常使用有了基本的了解。很好地掌握 firewalld 服务使您能够充分利用其强大功能和灵活性。
祝您使用愉快!


评论
暂无评论。发表第一条评论吧。