Linux 上的firewalld和firewall-cmd命令简介Linux 上的firewalld和firewall-cmd命令简介Linux 上的firewalld和firewall-cmd命令简介Linux 上的firewalld和firewall-cmd命令简介
  • 业务
  • 目标
  • 支持
  • 登录
找到的结果: {phrase} (显示: {results_count} 共: {results_count_total})
显示: {results_count} 共: {results_count_total}

加载更多搜索结果...

搜索范围
模糊匹配
搜索标题
搜索内容

Linux 上的firewalld和firewall-cmd命令简介

发表 admin at 2025年2月28日
类别
未分类
标签

客观的

了解firewalld背后的基本概念以及如何使用firewall-cmd实用程序与其交互

要求

  • 根权限

困难

简单的

惯例

  • # – 需要以root权限执行给定的linux命令
    直接以 root 用户身份或使用 sudo 命令

  • $ – 要求以常规非特权用户身份执行给定的 Linux 命令

介绍

基于区域的防火墙

Firewalld 是基于区域的防火墙:每个区域都可以配置为接受或拒绝某些服务或端口,因此具有不同的安全级别。区域可以与一个或多个网络接口关联。通常,firewalld 附带一组预配置区域:要列出这些区域,以及更一般地与防火墙交互,我们将使用 firewall-cmd 实用程序。我在 Fedora 27 系统上运行,让我们检查一下可用区域有哪些:

$ firewall-cmd --get-zones
FedoraServer FedoraWorkstation block dmz drop external home internal public trusted work

如您所见,上面的命令返回我的系统中所有可用接口的列表。它们的名称很能说明它们的用途,但我们需要知道通过它们可以使用哪些服务和端口:一般默认规则是拒绝每个服务或端口。然后,根据必须允许的服务,为每个接口配置一些例外。如果我们想要获得与某个区域关联的所有服务的列表,我们可以使用 --get-services 选项运行 firewall-cmd 。如果没有显式地将区域传递给命令,则将查询默认区域:

# firewall-cmd --list-all
public (active)
  target: default
  icmp-block-inversion: no
  interfaces: ens5f5
  sources:
  services: ssh mdns dhcpv6-client
  ports:
  protocols:
  masquerade: no
  forward-ports:
  source-ports:
  icmp-blocks:
  rich rules:

该命令返回区域状态的摘要(在本例中为默认区域“公共”)。除此之外,您还可以清楚地看到哪些网络接口与该区域(本例中为 ens5f5)关联以及其中允许哪些服务(ssh、mdns、dhcpv6-client)。如果我们想要检索有关特定非默认区域的信息,我们应该将区域名称作为参数传递给 --zone 选项。例如,要检索有关 external 区域的信息,我们将运行:

# firewall-cmd --zone=external --list-all
external
  target: default
  icmp-block-inversion: no
  interfaces:
  sources:
  services: ssh
  ports:
  protocols:
  masquerade: yes
  forward-ports:
  source-ports:
  icmp-blocks:
  rich rules:

区域操纵

如前所述,在使用firewall-cmd工具时,如果未指定区域,则引用默认区域。我们可能想要更改默认区域。举例来说,我们要将外部区域设置为默认区域:

# firewall-cmd --set-default=external

非常简单,不是吗?现在让我们看看如何向特定区域添加或删除服务或端口。首先,服务是一组与特定协议关联的预配置端口。例如:ssh 服务将包含 TCP 端口 22,而 samba 服务将包含端口 139 和 445 集TCP 和 137 和 138 UDP。使用服务我们可以避免每次都记住特定的端口。假设我们想要将 samba 服务添加到外部区域,我们要做的就是:

# firwall-cmd --zone=external --add-service=samba
success

firewalld 守护进程响应 success,这意味着执行成功。为了验证它,让我们检查区域服务:

$ sudo firewall-cmd --zone=external --list-services
ssh samba

正如您所看到的,我们使用了 --list-services 选项来达到此目的。该命令的结果清楚地表明 samba 服务已添加到区域中。但是,以这种方式进行的修改是暂时的,并且在 firewalld 守护进程重新启动后将无法保留。我们来验证一下。首先我们重新加载服务:

 # firewall-cmd --reload

然后我们再次检查 external 区域允许的服务:

# firewall-cmd --zone=external --list-services
ssh

如您所见,external 区域中允许的唯一服务是 ssh。要对区域进行持久修改,我们必须使用 --permanent 选项:

 # firewall-cmd --permanent --zone=external --add-service=samba

永久修改需要重新加载防火墙才能生效。

如果我们想要进行相反的操作,从而从区域中删除服务,我们会执行:

 # firewall-cmd --permanent --zone=external --remove-service=samba

语法非常直观,不需要任何进一步的解释。但是如果我们想添加特定端口而不是服务怎么办?语法会略有变化:

 # firewall-cmd --permanent --zone=external --add-port=139/tcp

验证端口是否已添加到区域:

# firewall-cmd --zone=external --list-ports
139/tcp

手术成功了。以同样的方式,要删除端口,我们可以这样做:

# firewall-cmd --permanent --zone=external --remove-port=139/tcp

创建自定义区域

到目前为止,我们只看到了如何修改现有区域。也可以创建一些新的,而且同样简单。假设我们要创建一个名为 linuxconfig 的自定义区域:

# firewall-cmd --permanent --new-zone=linuxconfig

已创建一个新的空区域:默认情况下,其中不允许任何服务或端口。还可以通过加载配置文件来创建区域:

# firewall-cmd --permanent --new-zone-from-file=file --name=linuxconfig

其中 file 是包含区域定义的文件的路径。请注意,创建或删除区域时,--permanent 选项是必需的:如果未提供,将会引发错误。

将区域与接口关联

创建区域只是第一步:我们现在必须将其与网络接口关联。假设我们想要使用新创建的区域,将其与 ens5f5 以太网接口关联:下面是让我们完成任务的命令:

# firewall-cmd --permanent --zone=linuxconfig --add-interface=ens5f5

如果我们查询区域以获取分配给它的接口,我们应该看到:

# firewall-cmd --zone=linuxconfig --list-interfaces
ens5f5

从区域中删除接口就像以下一样简单:

# firewall-cmd --remove-interface=ens5f5 --zone=linuxconfig

丰富的规则

在某些情况下,我们可能需要创建更复杂的规则,而不仅仅是允许区域中的某些端口或服务。例如,我们可能想要创建一条规则来阻止来自特定计算机的某种类型的流量。这就是丰富规则的用途。规则基本上由两部分组成:第一部分我们指定应用规则必须满足的条件,第二部分指定要执行的操作:accept、drop,或拒绝。

假设我们想要阻止来自本地网络中 ip 192.168.0.37 的机器的流量:以下是我们如何编写规则:

# firewall-cmd --zone=linuxconfig --add-rich-rule="rule \
    family="ipv4" \
    source address=192.168.0.37 \
    service name=ssh \
    reject \

为了添加丰富的规则,我们使用了 --add-rich-rule 选项,将规则描述为其参数。该规则以 rule 关键字开头。在 family 中,我们指定该规则仅应用于 ipv4 数据包:如果未提供此关键字,则该规则将同时应用于 ipv4 和 <代码>ipv6。然后,我们提供了数据包必须具有的源地址,以便使用源地址触发规则。通过service,我们指定了规则的服务类型,在本例中为ssh。最后,我们提供了数据包与规则匹配时要执行的操作,在本例中为reject。如果我们现在尝试从具有 192.168.0.37 IP 的计算机建立 ssh 连接,我们会收到:

ssh 192.168.0.35
ssh: connect to host 192.168.0.35 port 22: Connection refused

上面的规则非常简单,但规则可能会变得非常复杂。您应该检查firewalld 文档以查看所有可用设置和选项的范围。

恐慌模式

恐慌模式是一种只有在网络环境确实存在严重问题的情况下才应该使用的模式。当此模式处于活动状态时,所有现有连接都将被丢弃,并且所有传入和传出数据包都将被丢弃。可以启用它运行:

# firewall-cmd --panic-on

要退出恐慌模式,命令是:

# firewall-cmd --panic-off

甚至可以查询紧急模式状态,运行:

# firewall-cmd --query-panic

这些选项仅在运行时有效,不能与--permanent一起使用。

©2015-2025 Norria support@norria.com