紧急模式(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
Linux firewalld 和 firewall-cmd

基于区域的防火墙

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
日期:2020-07-07 20:56:46 来源:oir作者:oir