FirewallD 是一种防火墙管理解决方案,可用于许多 Linux 发行版,它充当 Linux 内核提供的 iptables 数据包过滤系统的前端。RHEL及其衍生发行版,自版本7起即使用FirewallD替代iptables。
防火墙中的基本概念
在我们开始讨论如何实际使用该实用程序来管理防火墙配置之前,我们应该熟悉该工具引入的一些基本概念。
Zones
守护程序使用称为“zones”的实体管理规则组。区域基本上是一组规则,根据计算机所连接的网络中的信任级别,规定应允许哪些流量。为网络接口分配一个区域,以指示防火墙应允许的行为。
对于可能经常在网络之间移动的计算机(如便携式计算机),这种灵活性提供了一种根据您的环境更改规则的好方法。您可能制定了严格的规则,禁止在公共WiFi网络上操作时大多数流量,同时在连接到家庭网络时允许更宽松的限制。对于服务器来说,这些区域并不那么重要,因为网络环境很少(如果有的话)发生变化。
无论您的网络环境有多动态,熟悉 的每个预定义区域背后的一般概念仍然很有用。按从最低信任到最受信任的顺序,其中的预定义区域为:
- drop:最低信任级别。所有传入连接都将被丢弃而不回复,并且只能使用传出连接。
- block:与上述类似,但不是简单地断开连接,而是通过 or 消息拒绝传入请求。
icmp-host-prohibited
icmp6-adm-prohibited
- public:表示不受信任的公共网络。您不信任其他计算机,但可能会根据具体情况允许选定的传入连接。
- external:使用防火墙作为网关时的外部网络。它配置为 NAT 伪装,以便您的内部网络保持私有但可访问。
- internal:外部区域的另一侧,用于网关的内部部分。这些计算机相当值得信赖,并提供一些附加服务。
- dmz:用于位于 DMZ 中的计算机(无法访问网络其余部分的隔离计算机)。仅允许某些传入连接。
- work:用于工作机器。信任网络中的大多数计算机。可能允许更多服务。
- home:家庭环境。这通常意味着您信任大多数其他计算机,并且将接受更多服务。
- trusted:信任网络中的所有计算机。最开放的可用选项,应谨慎使用。
下文我们使用“区域”来表示zone。
要使用防火墙,我们可以创建规则并更改区域的属性,然后将网络接口分配给最合适的区域。
规则持久性
在 firewalld 中,可以将规则指定为永久规则或即时规则。如果添加或修改规则,默认情况下,将修改当前正在运行的防火墙的行为。在下次启动时,修改将被抛出,旧规则将被应用。
大多数操作都可以采用该标志来指示应以非临时防火墙为目标。这将影响引导时重新加载的规则集。这种分离意味着您可以在活动防火墙实例中测试规则,然后在出现问题时重新加载。您还可以使用该标志随着时间的推移构建一整套规则,这些规则将在发出 reload 命令时立即应用。
安装并启用防火墙以在启动时启动
firewalld
默认安装在一些 Linux 发行版上,包括许多 CentOS 7/8 的映像。但是,您可能需要自己安装防火墙:
sudo yum install firewalld
安装 后,您可以启用该服务并重新启动服务器。请记住,启用 firewalld 将导致服务在启动时启动。最佳做法是创建防火墙规则,并借此机会在配置此行为之前对其进行测试,以避免潜在问题。
sudo systemctl enable firewalld
sudo reboot
当服务器重新启动时,应启动防火墙,将网络接口放入配置的区域(或回退到配置的默认区域),并且与区域关联的任何规则都将应用于关联的接口。
我们可以通过键入以下内容来验证服务是否正在运行且可访问:
sudo firewall-cmd --state
running
这表明我们的防火墙已启动并使用默认配置运行。
熟悉当前的防火墙规则
在开始修改之前,我们应该熟悉守护程序提供的默认环境和规则。
探索默认值
我们可以通过键入以下内容查看当前选择哪个区域为默认值:
firewall-cmd --get-default-zone
public
由于我们没有给出任何偏离默认区域的命令,并且我们的接口都没有配置为绑定到另一个区域,因此该区域也将是唯一的“活动”区域(控制接口流量的区域)。我们可以通过键入以下内容来验证这一点:
firewall-cmd --get-active-zones
public
interfaces: eth0 eth1
在这里,我们可以看到我们的示例服务器有两个由防火墙(和)控制的网络接口。它们目前都根据为公共区域定义的规则进行管理。
但是,我们如何知道哪些规则与公共区域相关联?我们可以通过键入以下内容打印出默认区域的配置:
sudo firewall-cmd --list-all
public (default, active)
target: default
icmp-block-inversion: no
interfaces: eth0 eth1
sources:
services: ssh dhcpv6-client
ports:
protocols:
masquerade: no
forward-ports:
source-ports:
icmp-blocks:
rich rules:
我们可以从输出中看出,这个zone既是默认的又是活动的,并且 and 接口与此区域相关联(我们已经从之前的查询中知道了所有这些)。但是,我们还可以看到,该区域允许与DHCP客户端(用于IP地址分配)和SSH(用于远程管理)关联的正常操作。
探索替代Zones
现在我们对默认和活动区域的配置有了很好的了解。我们也可以找到有关其他区域的信息。
若要获取可用区域的列表,请键入:
firewall-cmd --get-zones
block dmz drop external home internal public trusted work
我们可以通过在命令中包含参数来查看与区域关联的特定配置:
sudo firewall-cmd --zone=home --list-all
home
target: default
icmp-block-inversion: no
interfaces:
sources:
services: dhcpv6-client mdns samba-client ssh
ports:
protocols:
masquerade: no
forward-ports:
source-ports:
icmp-blocks:
rich rules:
可以使用该选项输出所有区域定义。您可能希望将输出通过管道传输到寻呼机中以便于查看:
sudo firewall-cmd --list-all-zones | less
为接口选择区域
除非您另有配置网络接口,否则在引导防火墙时,每个接口都将置于默认区域中。
更改接口的区域
您可以在会话期间通过将参数与参数结合使用来在区域之间转换接口。与修改防火墙的所有命令一样,您需要使用 。
例如,我们可以通过键入以下内容将界面转换为“home”区域:
sudo firewall-cmd --zone=home --change-interface=eth0
success
注意:每当将接口转换到新区域时,请注意,您可能正在修改将可运行的服务。例如,这里我们将移动到“主”区域,该区域具有可用的SSH。这意味着我们的连接不应该断开。其他一些区域默认情况下未启用 SSH,如果在使用这些区域之一时连接断开,您可能会发现自己无法重新登录。
我们可以通过再次请求活动区域来验证这是否成功:
firewall-cmd --get-active-zones
home
interfaces: eth0
public
interfaces: eth1
调整默认区域
如果所有接口都可以由单个区域最好地处理,则选择最佳默认区域并将其用于配置可能更容易。
您可以使用参数更改默认区域。这将立即将任何已回退到默认值的接口更改为新区域:
sudo firewall-cmd --set-default-zone=home
success
为应用程序设置规则
为要提供的服务定义防火墙例外的基本方法相当简单。我们将在这里介绍基本思想。
将服务添加到您的区域
最简单的方法是将所需的服务或端口添加到正在使用的区域中。同样,您可以使用以下选项获取可用服务的列表:--get-services
firewall-cmd --get-services
RH-Satellite-6 amanda-client amanda-k5-client bacula bacula-client bitcoin bitcoin-rpc bitcoin-testnet bitcoin-testnet-rpc ceph ceph-mon cfengine condor-collector ctdb dhcp dhcpv6 dhcpv6-client dns docker-registry dropbox-lansync elasticsearch freeipa-ldap freeipa-ldaps freeipa-replication freeipa-trust ftp ganglia-client ganglia-master high-availability http https imap imaps ipp ipp-client ipsec iscsi-target kadmin kerberos kibana klogin kpasswd kshell ldap ldaps libvirt libvirt-tls managesieve mdns mosh mountd ms-wbt mssql mysql nfs nrpe ntp openvpn ovirt-imageio ovirt-storageconsole ovirt-vmconsole pmcd pmproxy pmwebapi pmwebapis pop3 pop3s postgresql privoxy proxy-dhcp ptp pulseaudio puppetmaster quassel radius rpc-bind rsh rsyncd samba samba-client sane sip sips smtp smtp-submission smtps snmp snmptrap spideroak-lansync squid ssh synergy syslog syslog-tls telnet tftp tftp-client tinc tor-socks transmission-client vdsm vnc-server wbem-https xmpp-bosh xmpp-client xmpp-local xmpp-server
注意:您可以通过在目录中查看其关联文件来获取有关每个服务的更多详细信息。例如,SSH 服务定义如下:/usr/lib/firewalld/services
<?xml version="1.0" encoding="utf-8"?>
<service>
<short>SSH</short>
<description>Secure Shell (SSH) is a protocol for logging into and executing commands on remote machines. It provides secure encrypted communications. If you plan on accessing your machine remotely via SSH over a firewalled interface, enable this option. You need the openssh-server package installed for this option to be useful.</description>
<port protocol="tcp" port="22"/>
</service>
您可以使用该参数为区域启用服务。该操作将面向默认区域或参数指定的任何区域。默认情况下,这只会调整当前防火墙会话。您可以通过包含标志来调整永久防火墙配置。--add-service=
--zone=
--permanent
例如,如果我们正在运行一个为常规 HTTP 流量提供服务的 Web 服务器,我们可以通过键入以下内容来允许此会话的“公共”区域中的接口使用此流量:
sudo firewall-cmd --zone=public --add-service=http
如果要修改默认区域,可以省略 。我们可以通过使用 or 操作来验证操作是否成功:
sudo firewall-cmd --zone=public --list-services
dhcpv6-client http ssh
测试一切正常后,您可能需要修改永久防火墙规则,以便在重新启动后服务仍然可用。我们可以通过键入以下内容来永久更改“公共”区域:
sudo firewall-cmd --zone=public --permanent --add-service=http
success
您可以通过向操作添加标志来验证此操作是否成功。您需要用于任何操作:
sudo firewall-cmd --zone=public --permanent --list-services
dhcpv6-client http ssh
您的“公共”区域现在将允许端口 80 上的 HTTP Web 流量。如果您的 Web 服务器配置为使用 SSL/TLS,则还需要添加该服务。我们可以通过键入以下内容将其添加到当前会话和永久规则集:
sudo firewall-cmd --zone=public --add-service=https
sudo firewall-cmd --zone=public --permanent --add-service=https
如果没有合适的服务怎么办?
firewalld 安装附带的防火墙服务代表了您可能希望允许访问的应用程序的许多最常见要求。但是,在某些情况下,这些服务可能不符合你的要求。
在这种情况下,您有两种选择。
为您的区域打开端口
添加对特定应用程序的支持的一种方法是打开它在相应区域中使用的端口。这是通过指定端口或端口范围以及需要打开的端口的关联协议来完成的。
例如,如果我们的应用程序在端口 5000 上运行并使用 TCP,则可以使用该参数将其添加到此会话的“公共”区域。协议可以是tcp或udp
sudo firewall-cmd --zone=public --add-port=5000/tcp
我们可以使用以下操作验证此操作是否成功:
sudo firewall-cmd --zone=public --list-ports
还可以通过在用短划线分隔范围内的开始端口和结束端口来指定端口的顺序范围。例如,如果我们的应用程序使用 UDP 端口 4990 到 4999,我们可以通过键入以下内容在“公共”上打开这些端口:
sudo firewall-cmd --zone=public --add-port=4990-4999/udp
测试后,我们可能希望将这些添加到永久防火墙中。您可以通过键入以下内容来执行此操作:
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
success
success
5000/tcp 4990-4999/udp
定义服务
为您的区域打开端口很容易,但可能很难跟踪每个端口的用途。如果您曾经停用服务器上的服务,您可能很难记住哪些已打开的端口仍然需要。为了避免这种情况,可以定义服务。
服务是具有关联名称和说明的端口集合。使用服务比端口更易于管理,但需要一些前期工作。一个好的开始方法是将现有脚本(位于 )复制到防火墙查找非标准定义的目录。/usr/lib/firewalld/services
/etc/firewalld/services
例如,我们可以复制 SSH 服务定义以用于我们的“示例”服务定义,如下所示。文件名减去后缀将指示防火墙服务列表中的服务名称:
sudo cp /usr/lib/firewalld/services/ssh.xml /etc/firewalld/services/example.xml
现在,您可以调整在复制的文件中找到的定义:
sudo vi /etc/firewalld/services/example.xml
首先,该文件将包含您复制的 SSH 定义:
<?xml version="1.0" encoding="utf-8"?>
<service>
<short>SSH</short>
<description>Secure Shell (SSH) is a protocol for logging into and executing commands on remote machines. It provides secure encrypted communications. If you plan on accessing your machine remotely via SSH over a firewalled interface, enable this option. You need the openssh-server package installed for this option to be useful.</description>
<port protocol="tcp" port="22"/>
</service>
这个定义的大部分实际上是元数据。您需要在标记中更改服务的短名称。这是服务的人类可读名称。还应添加说明,以便在需要审核服务时获得更多信息。您需要进行的唯一实际影响服务功能的配置可能是端口定义,您可以在其中标识要打开的端口号和协议。这可以多次指定。
对于我们的“示例”服务,假设我们需要为 TCP 打开端口 7777,为 UDP 打开端口 8888。
<?xml version="1.0" encoding="utf-8"?>
<service>
<short>Example Service</short>
<description>This is just an example service. It probably shouldn't be used on a real system.</description>
<port protocol="tcp" port="7777"/>
<port protocol="udp" port="8888"/>
</service>
并关闭文件。
重新加载防火墙以访问新服务:
sudo firewall-cmd --reload
您可以看到它现在在可用服务列表中:
firewall-cmd --get-services
RH-Satellite-6 amanda-client amanda-k5-client bacula bacula-client bitcoin bitcoin-rpc bitcoin-testnet bitcoin-testnet-rpc ceph ceph-mon cfengine condor-collector ctdb dhcp dhcpv6 dhcpv6-client dns docker-registry dropbox-lansync elasticsearch example freeipa-ldap freeipa-ldaps freeipa-replication freeipa-trust ftp ganglia-client ganglia-master high-availability http https imap imaps ipp ipp-client ipsec iscsi-target kadmin kerberos kibana klogin kpasswd kshell ldap ldaps libvirt libvirt-tls managesieve mdns mosh mountd ms-wbt mssql mysql nfs nrpe ntp openvpn ovirt-imageio ovirt-storageconsole ovirt-vmconsole pmcd pmproxy pmwebapi pmwebapis pop3 pop3s postgresql privoxy proxy-dhcp ptp pulseaudio puppetmaster quassel radius rpc-bind rsh rsyncd samba samba-client sane sip sips smtp smtp-submission smtps snmp snmptrap spideroak-lansync squid ssh synergy syslog syslog-tls telnet tftp tftp-client tinc tor-socks transmission-client vdsm vnc-server wbem-https xmpp-bosh xmpp-client xmpp-local xmpp-server
您现在可以像往常一样在您的区域中使用此服务。
创建您自己的区域
虽然预定义的区域对于大多数用户来说可能绰绰有余,但定义您自己的区域会很有帮助,这些区域更能描述其功能。
例如,您可能希望为 Web 服务器创建一个区域,称为“publicweb”。但是,您可能希望为在专用网络上提供的 DNS 服务配置另一个区域。为此,您可能需要一个名为“privateDNS”的区域。
添加区域时,必须将其添加到永久防火墙配置中。然后,您可以重新加载以将配置引入正在运行的会话。例如,我们可以通过键入以下内容来创建上面讨论的两个区域:
sudo firewall-cmd --permanent --new-zone=publicweb
sudo firewall-cmd --permanent --new-zone=privateDNS
您可以通过键入以下内容来验证永久配置中是否存在这些内容:
sudo firewall-cmd --permanent --get-zones
block dmz drop external home internal privateDNS public publicweb trusted work
如前所述,这些在当前防火墙实例中尚不可用:
firewall-cmd --get-zones
block dmz drop external home internal public trusted work
重新加载防火墙以将这些新区域引入活动配置:
sudo firewall-cmd --reload
firewall-cmd --get-zones
block dmz drop external home internal privateDNS public publicweb trusted work
现在,您可以开始为区域分配适当的服务和端口。通常,最好调整活动实例,然后在测试后将这些更改转移到永久配置。例如,对于“公共网站”区域,您可能希望添加 SSH、HTTP 和 HTTPS 服务:
sudo firewall-cmd --zone=publicweb --add-service=ssh
sudo firewall-cmd --zone=publicweb --add-service=http
sudo firewall-cmd --zone=publicweb --add-service=https
sudo firewall-cmd --zone=publicweb --list-all
publicweb
target: default
icmp-block-inversion: no
interfaces:
sources:
services: ssh http https
ports:
protocols:
masquerade: no
forward-ports:
source-ports:
icmp-blocks:
rich rules:
同样,我们可以将 DNS 服务添加到我们的“私有 DNS”区域:
sudo firewall-cmd --zone=privateDNS --add-service=dns
sudo firewall-cmd --zone=privateDNS --list-all
privateDNS
interfaces:
sources:
services: dns
ports:
masquerade: no
forward-ports:
icmp-blocks:
rich rules:
然后,我们可以将接口更改为这些新区域以测试它们:
sudo firewall-cmd --zone=publicweb --change-interface=eth0
sudo firewall-cmd --zone=privateDNS --change-interface=eth1
此时,您有机会测试您的配置。如果这些值适合您,则需要将相同的规则添加到永久配置中。您可以通过重新应用带有标志的规则来执行此操作:
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
永久应用这些规则后,您可以重新启动网络并重新加载防火墙服务:
sudo systemctl restart network
sudo systemctl reload firewalld
验证是否分配了正确的区域:
firewall-cmd --get-active-zones
privateDNS
interfaces: eth1
publicweb
interfaces: eth0
并验证相应的服务是否可用于这两个区域:
sudo firewall-cmd --zone=publicweb --list-services
http https ssh
sudo firewall-cmd --zone=privateDNS --list-services
dns
您已成功设置自己的区域!如果要使其中一个区域成为其他接口的默认区域,请记住使用以下参数配置该行为:
sudo firewall-cmd --set-default-zone=publicweb
结论
你现在应该对如何管理 CentOS 系统上的防火墙服务有相当的了解,以供日常使用。
标签:sudo,zone,CentOS,--,cmd,FirewallD,防火墙,firewall,区域 From: https://blog.51cto.com/datoudatou/7800819