紧急模式(panic模式)
panic模式仅应在网络环境存在严重问题的情况下使用。当此模式处于活动状态时,将丢弃所有现有连接,并丢弃所有传入和传出数据包。启用panic模式:
# firewall-cmd --panic-on
退出panic模式:
# firewall-cmd --panic-off
查询panic模式状态:
# firewall-cmd --query-panic
这些选项仅在“运行时”有效,不能与“--permanent”一起使用。
富规则
在某些情况下,我们可能需要创建更复杂的规则,而不仅仅是在区域中允许某些端口或者服务。例如,我们可能希望创建一个规则来阻止来自特定机器的某些类型的通信。这就是“富规则”的意义所在。规则基本上由两部分组成:第一部分指定应用规则必须满足的条件,第二部分指定要执行的操作:accept
, drop
, 或者 reject
。
假设我们想在本地网络中阻止来自ip为'192.168.0.37'的机器的流量,
下面是我们将如何编写规则:
# firewall-cmd --zone=onitroad --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'。最后,我们提供了当数据包与规则匹配时要执行的操作,在本例中为“拒绝”。如果我们现在尝试从具有'192.168.0.37'ip的计算机建立ssh连接,我们将收到:
ssh 192.168.0.35 ssh: connect to host 192.168.0.35 port 22: Connection refused
上面这一条非常简单,但规则可能会变得非常复杂。您应该查看firewalld文档以查看所有可用设置和选项。
创建自定义区域
到目前为止,我们只看到了如何修改现有区域。也可以创建一些新的区域,而且同样简单。
假设我们要创建一个名为“onitroad”的自定义区域:
# firewall-cmd --permanent --new-zone=onitroad
已创建新的空区域:默认情况下,其中不允许任何服务或者端口。也可以通过加载配置文件来创建区域:
# firewall-cmd --permanent --new-zone-from-file=file --name=onitroad
其中,“file”是包含分区定义的文件的路径。请注意,在创建或者删除区域时,--permanent
选项是必需的:如果未提供该选项,将引发错误。
区域操纵
如前所述,在使用“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
基于区域的防火墙
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:
该命令返回区域状态的摘要(在本例中是默认的“public”)。除此之外,您可以清楚地看到哪些网络接口与此区域相关(本例中为ens5f5),以及其中允许哪些服务(ssh、mdns、dhcpv6客户端)。如果要检索有关特定非默认区域的信息,应将区域名称作为参数传递给“---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:
将区域与接口关联
创建区域只是第一步:我们现在必须将其与网络接口相关联。假设我们想使用新创建的区域,将其与ens5f5以太网接口相关联:下面是让我们完成任务的命令:
# firewall-cmd --permanent --zone=onitroad --add-interface=ens5f5
如果我们查询分配给它的接口区域,我们应该看到:
# firewall-cmd --zone=onitroad --list-interfaces ens5f5
从区域中删除接口同样简单:
# firewall-cmd --remove-interface=ens5f5 --zone=onitroad