Linux 上的firewalld和firewall-cmd命令简介
客观的
了解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
一起使用。