如何在 CentOS 8 上使用 firewalld 设置防火墙

介绍

firewalld是许多Linux发行版可用的防火墙管理软件,它作为Linux内核(https://netfilter.org/projects/nftables/index.html)或IPtables(https://netfilter.org/projects/iptables/index.html)的包过滤系统的前端。

在本指南中,我们将向您展示如何为您的 CentOS 8 服务器设置防火墙,并涵盖使用防火墙-cmd管理工具管理防火墙的基本知识。

前提条件

要完成本教程,您将需要运行 CentOS 8 的服务器。我们将假定您已登录该服务器为非root、具有sudo功能的用户。

Firewalld 中的基本概念

在我们开始谈论如何实际使用防火墙-cmd实用程序来管理您的防火墙配置之前,我们应该熟悉该工具引入的一些概念。

区域

防火墙示威者使用称为 zones 的实体来管理规则组。 区域是规则集,根据您在网络中所信任的水平来决定应该允许哪些流量。

对于可能经常在网络之间移动的计算机(如笔记本电脑),这种灵活性提供了根据环境而改变规则的良好方法. 您可能有严格的规则,禁止在公共WiFi网络上运行的大多数流量,同时允许连接到家庭网络时更宽松的限制。

无论您的网络环境有多么动态,仍然有用熟悉防火墙的每个预定义区域背后的一般想法。

  • ** 投放**:信任程度最低。 所有接入的连接都会在无回复的情况下被丢弃,并且只能输出连接. () ( )* ** block**:与上述内容相类似,但收到的请求不是简单地放弃连接,而是以icmp-host-project'或icmp6-adm-project'消息拒绝。 () ( )* ** 公众**:代表公共的、不信任的网络。 您不信任其他计算机, 但可能允许在个案基础上选择连接 。 (_) ( )* ** 外部**:如果您使用防火墙作为网关,则使用外部网络。 它被配置为 NAT 装配, 以便您的内部网络保持私有但可达到 。 ( ) ( )* ** 内部**:外部区域的另一侧,用于网关的内部部分。 计算机是相当可靠的,还提供了一些额外服务。 () ( )* dmz:用于位于DMZ的计算机(无法访问您网络其余部分的同位化计算机). 只允许某些进入的连接 。
  • 工作:用于工作机器。 信任网络中的大部分计算机. 可能允许更多的服务。
  • ** 家庭**:家庭环境。 它一般意味着您信任大多数其他计算机,并且还会接受一些更多的服务.
  • ** 受托**:信任网络中的所有机器。 现有选项中最开放的,应谨慎使用。 (_) (英语)

为了使用防火墙,我们可以创建规则,改变我们区域的属性,然后将我们的网络接口分配到最合适的区域。

永久性规则

在 firewalld 中,规则可以应用到当前的 runtime 规则集,或变为 permanent. 当一个规则被添加或修改时, 默认情况下,只有当前正在运行的防火墙才会被更改

大多数firewall-cmd操作可以使用--permanent标志来表示更改应应用于永久配置,此外,目前正在运行的防火墙可以通过firewall-cmd -runtime-to-permanent命令保存到永久配置。

这种运行时间与永久配置的分离意味着您可以在积极的防火墙中安全地测试规则,然后在出现问题时重新加载。

安装和启用Firewalld

「firewalld」默认安装在一些Linux发行版上,包括许多CentOS 8的图像。

1sudo dnf install firewalld

安裝「firewalld」後,您可以啟用該服務並重新啟動您的伺服器。 請記住,啟用 firewalld 會導致該服務在啟動時啟動。 最好的做法是建立您的防火牆規則,並在設定此行為之前採取測試的機會,以避免潛在的問題。

1sudo systemctl enable firewalld
2sudo systemctl start firewalld

当服务器重新启动时,你的防火墙应该被带上,你的网络接口应该被放入你配置的区域(或回到配置的默认区域),并且与区域(s)相关的任何规则都将应用到相关的接口。

我们可以通过键入来验证服务是否正在运行和可访问:

1sudo firewall-cmd --state
1[secondary_label Output]
2running

这表明我们的防火墙已启动并运行默认配置。

熟悉当前的防火墙规则

在我们开始进行更改之前,我们应该熟悉 firewalld 提供的默认环境和规则。

探索缺陷

我们可以通过键入查看当前选择的区域为默认值:

1firewall-cmd --get-default-zone
1[secondary_label Output]
2public

由于我们没有向防火墙提供任何偏离默认区域的命令,而且我们的界面没有被配置为连接到另一个区域,该区域也将是唯一的 活跃区域(控制我们界面流量的区域)。

1firewall-cmd --get-active-zones
1[secondary_label Output]
2public
3  interfaces: eth0 eth1

在这里,我们可以看到,我们的示例服务器有两个网络接口由防火墙控制(‘eth0’和‘eth1’)。

但是,我们如何知道哪些规则与公共区域有关?我们可以通过键入打印默认区域的配置:

1sudo firewall-cmd --list-all
 1[secondary_label Output]
 2public (active)
 3  target: default
 4  icmp-block-inversion: no
 5  interfaces: eth0 eth1
 6  sources:
 7  services: cockpit dhcpv6-client ssh
 8  ports:
 9  protocols:
10  masquerade: no
11  forward-ports:
12  source-ports:
13  icmp-blocks:
14  rich rules:

我们可以从输出中说,这个区域既是默认的,也是活跃的,而且eth0eth1接口与这个区域相关联(我们从以前的查询中已经知道这一切)。

探索替代区

现在我们对默认和活跃区域的配置有了很好的想法,我们也可以找到其他区域的信息。

要获取可用的区域列表,键入:

1firewall-cmd --get-zones
1[secondary_label Output]
2block dmz drop external home internal public trusted work

我们可以通过将 --zone= 参数纳入我们的 --list-all 命令来查看与一个区域相关的特定配置:

1sudo firewall-cmd --zone=home --list-all
 1[secondary_label Output]
 2home
 3  target: default
 4  icmp-block-inversion: no
 5  interfaces:
 6  sources:
 7  services: cockpit dhcpv6-client mdns samba-client ssh
 8  ports:
 9  protocols:
10  masquerade: no
11  forward-ports:
12  source-ports:
13  icmp-blocks:
14  rich rules:

您可以使用 --list-all-zones 选项输出所有区域定义,您可能希望将输出输入到一个页面,以便更容易查看:

1sudo firewall-cmd --list-all-zones | less

接下来,我们将学习如何分配区域到网络接口。

选择您的界面区域

除非您配置了不同的网络接口,否则在启动防火墙时,每个接口都将放入默认区域。

更改一个接口的区域

您可以在会话期间通过使用 --zone= 参数与 --change-interface= 参数相结合移动区域之间的界面。

例如,我们可以将我们的eth0界面移动到 home区域,键入以下内容:

1sudo firewall-cmd --zone=home --change-interface=eth0
1[secondary_label Output]
2success

<$>[note] ** 注意:** 每当您将接口移动到一个新的区域时,请注意,您可能正在修改哪些服务将运行。 例如,在这里我们正在移动到 home 区域,其中有 SSH 可用。 这意味着我们的连接不应该下降。 一些其他区域没有默认启用 SSH,而切换到其中一个区域可能会导致您的连接下降,阻止您重新登录到您的服务器。

我们可以通过再次询问活跃区域来验证这是成功的:

1firewall-cmd --get-active-zones
1[secondary_label Output]
2home
3  interfaces: eth0
4public
5  interfaces: eth1

调整默认区域

如果您的所有接口都可以由一个单一的区域处理,那么简单地指定最佳的区域是默认的,然后为您的配置使用。

您可以使用 --set-default-zone= 参数更改默认区域,从而立即更改使用默认区域的任何界面:

1sudo firewall-cmd --set-default-zone=home
1[secondary_label Output]
2success

为您的应用程序设置规则

让我们通过定义您想要提供的服务的防火墙例外的基本方法来运行。

将服务添加到您的区域

最简单的方法是将您需要的服务或端口添加到您正在使用的区域中,您可以通过--get-services选项获取可用的服务定义列表:

1firewall-cmd --get-services
1[secondary_label Output]
2RH-Satellite-6 amanda-client amanda-k5-client amqp amqps apcupsd audit bacula bacula-client bb bgp bitcoin bitcoin-rpc bitcoin-testnet bitcoin-testnet-rpc bittorrent-lsd ceph ceph-mon cfengine cockpit condor-collector ctdb dhcp dhcpv6 dhcpv6-client distcc dns dns-over-tls docker-registry docker-swarm dropbox-lansync elasticsearch etcd-client etcd-server finger freeipa-4 freeipa-ldap freeipa-ldaps freeipa-replication freeipa-trust ftp ganglia-client ganglia-master git grafana gre high-availability http https imap imaps ipp ipp-client ipsec irc ircs iscsi-target isns jenkins kadmin kdeconnect kerberos kibana klogin kpasswd kprop kshell ldap ldaps libvirt libvirt-tls lightning-network llmnr managesieve matrix mdns memcache minidlna mongodb mosh mountd mqtt mqtt-tls ms-wbt mssql murmur mysql nfs nfs3 nmea-0183 nrpe ntp nut openvpn ovirt-imageio ovirt-storageconsole ovirt-vmconsole plex pmcd pmproxy pmwebapi pmwebapis pop3 pop3s postgresql privoxy prometheus proxy-dhcp ptp pulseaudio puppetmaster quassel radius rdp redis redis-sentinel rpc-bind rsh rsyncd rtsp salt-master samba samba-client samba-dc sane sip sips slp smtp smtp-submission smtps snmp snmptrap spideroak-lansync spotify-sync squid ssdp ssh steam-streaming svdrp svn syncthing syncthing-gui synergy syslog syslog-tls telnet tentacle tftp tftp-client tile38 tinc tor-socks transmission-client upnp-client vdsm vnc-server wbem-http wbem-https wsman wsmans xdmcp xmpp-bosh xmpp-client xmpp-local xmpp-server zabbix-agent zabbix-server

<$>[注] **注:**您可以通过在 /usr/lib/firewalld/services 目录中查看其相关的 .xml` 文件来获取有关每个服务的更多细节。

1[label /usr/lib/firewalld/services/ssh.xml]
2<?xml version="1.0" encoding="utf-8"?>
3<service>
4  <short>SSH</short>
5  <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>
6  <port protocol="tcp" port="22"/>
7</service>

美元

您可以使用 --add-service= 参数启用一个区域的服务。该操作将针对默认区域或任何由 --zone= 参数指定的区域。 默认情况下,这只会调整当前的防火墙会话。

例如,如果我们运行的是提供传统 HTTP 流量的 Web 服务器,我们可以通过键入:

1sudo firewall-cmd --zone=public --add-service=http

如果您想要更改默认区域,您可以放弃--zone=标志,我们可以通过使用--list-all--list-services操作来验证操作的成功:

1sudo firewall-cmd --zone=public --list-services
1[secondary_label Output]
2cockpit dhcpv6-client http ssh

一旦你测试了一切正常工作,你可能会想要修改永久性防火墙规则,以便你的服务在重新启动后仍然可用。

1sudo firewall-cmd --zone=public --add-service=http --permanent
1[secondary_label Output]
2success

或者,您可以使用 - runtime-to-permanent旗帜将当前正在运行的防火墙配置保存到永久配置中:

1sudo firewall-cmd --runtime-to-permanent

对此要小心,因为对正在运行的防火墙所做的所有更改都将永久执行。

无论您选择哪种方法,您可以通过在--list-services操作中添加--permanent标志来验证它是否成功,您需要在任何--permanent操作中使用sudo:

1sudo firewall-cmd --zone=public --list-services --permanent
1[secondary_label Output]
2cockpit dhcpv6-client http ssh

如果您的 Web 服务器配置使用 SSL/TLS,您还需要添加https服务,我们可以通过键入以下方式将此服务添加到当前会话和永久规则设置中:

1sudo firewall-cmd --zone=public --add-service=https
2sudo firewall-cmd --zone=public --add-service=https --permanent

如果没有适当的服务可用怎么办?

防火墙安装中包含的服务代表了您可能希望允许访问的许多最常见的应用程序,但可能会出现情况,这些服务不符合您的需求。

在这种情况下,你有两个选择。

为您的区域打开一个港口

添加对特定应用程序的支持的最简单方法是打开该应用程序在相应的区域(s)中使用的端口,通过指定端口或端口范围和关联协议(TCP 或 UDP)来完成此操作。

例如,如果我们的应用程序运行在端口5000上,并使用TCP,我们可以暂时将其添加到 public区域,使用 --add-port= 参数。

1sudo firewall-cmd --zone=public --add-port=5000/tcp
1[secondary_label Output]
2success

我们可以通过--list-ports操作来验证这是成功的:

1sudo firewall-cmd --zone=public --list-ports
1[secondary_label Output]
25000/tcp

例如,如果我们的应用程序使用 UDP 端口 4990 到 4999,我们可以通过键入在 public 上打开这些端口:

1sudo firewall-cmd --zone=public --add-port=4990-4999/udp

测试后,我们可能会想将这些添加到永久性防火墙中。 使用sudo firewall-cmd --runtime-to-permanent来做到这一点,或者用--permanent标志重新启动命令:

1sudo firewall-cmd --zone=public --permanent --add-port=5000/tcp
2sudo firewall-cmd --zone=public --permanent --add-port=4990-4999/udp
3sudo firewall-cmd --zone=public --permanent --list-ports
1[secondary_label Output]
2success
3success
45000/tcp 4990-4999/udp

定义一个服务

为您的区域打开端口是一个简单的解决方案,但很难跟踪每个端口的用途. 如果您在您的服务器上终止服务,您可能很难记住哪些已打开的端口仍然需要。

服务是具有相关名称和描述的端口集合。使用服务比使用端口更容易管理,但需要一些前瞻性工作。开始最简单的方法是将现有的脚本(在 /usr/lib/firewalld/services 中找到)复制到 /etc/firewalld/services 目录中,其中防火墙寻找非标准定义。

例如,我们可以复制 SSH 服务定义,以便使用我们的 example 服务定义,如下。

1sudo cp /usr/lib/firewalld/services/ssh.xml /etc/firewalld/services/example.xml

现在,你可以调整你复制的文件中发现的定义. 首先在你最喜欢的文本编辑器中打开它. 我们在这里使用‘vi’:

1sudo vi /etc/firewalld/services/example.xml

首先,该文件将包含您复制的 SSH 定义:

1[label /etc/firewalld/services/example.xml]
2<?xml version="1.0" encoding="utf-8"?>
3<service>
4  <short>SSH</short>
5  <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>
6  <port protocol="tcp" port="22"/>
7</service>

这个定义的绝大多数实际上是元数据. 您将希望在<short>标签中更改服务的简称。 这是您的服务的可人读的名称。 您还应该添加一个描述,以便您有更多的信息,如果您需要对服务进行审计。 您需要做的唯一的配置,这实际上会影响服务的功能,可能是您识别想要打开的端口号和协议的端口定义。 可以指定多个<port/>标签。

对于我们的 ** 示例** 服务,想象一下,我们需要为 TCP 打开端口 7777 和 UDP 打开端口 8888。

1[label /etc/firewalld/services/example.xml]
2<?xml version="1.0" encoding="utf-8"?>
3<service>
4  <short>Example Service</short>
5  <description>This is just an example service. It probably shouldn't be used on a real system.</description>
6  <port protocol="tcp" port="7777"/>
7  <port protocol="udp" port="8888"/>
8</service>

保存并关闭文件。

重新加载您的防火墙以访问您的新服务:

1sudo firewall-cmd --reload

您可以看到它现在在可用的服务列表中:

1firewall-cmd --get-services
1[secondary_label Output]
2RH-Satellite-6 amanda-client amanda-k5-client amqp amqps apcupsd audit bacula bacula-client bb bgp bitcoin bitcoin-rpc bitcoin-testnet bitcoin-testnet-rpc bittorrent-lsd ceph ceph-mon cfengine cockpit condor-collector ctdb dhcp dhcpv6 dhcpv6-client distcc dns dns-over-tls docker-registry docker-swarm dropbox-lansync elasticsearch etcd-client etcd-server example finger freeipa-4 freeipa-ldap freeipa-ldaps freeipa-replication freeipa-trust ftp ganglia-client ganglia-master git grafana gre high-availability http https imap imaps ipp ipp-client ipsec irc ircs iscsi-target isns jenkins kadmin kdeconnect kerberos kibana klogin kpasswd kprop kshell ldap ldaps libvirt libvirt-tls lightning-network llmnr managesieve matrix mdns memcache minidlna mongodb mosh mountd mqtt mqtt-tls ms-wbt mssql murmur mysql nfs nfs3 nmea-0183 nrpe ntp nut openvpn ovirt-imageio ovirt-storageconsole ovirt-vmconsole plex pmcd pmproxy pmwebapi pmwebapis pop3 pop3s postgresql privoxy prometheus proxy-dhcp ptp pulseaudio puppetmaster quassel radius rdp redis redis-sentinel rpc-bind rsh rsyncd rtsp salt-master samba samba-client samba-dc sane sip sips slp smtp smtp-submission smtps snmp snmptrap spideroak-lansync spotify-sync squid ssdp ssh steam-streaming svdrp svn syncthing syncthing-gui synergy syslog syslog-tls telnet tentacle tftp tftp-client tile38 tinc tor-socks transmission-client upnp-client vdsm vnc-server wbem-http wbem-https wsman wsmans xdmcp xmpp-bosh xmpp-client xmpp-local xmpp-server zabbix-agent zabbix-server

您现在可以像通常一样在您的区域使用此服务。

创建自己的区域

虽然预定义的区域对大多数用户来说可能已经足够了,但可以有助于定义自己的区域,这些区域更能描述它们的功能。

例如,您可能想为您的 Web 服务器创建一个区域,称为 publicweb. 但是,您可能希望为您在私人网络上提供的 DNS 服务配置另一个区域。

当您添加一个区域时,您必须将其添加到永久性防火墙配置中,然后您可以重新加载以将配置带入您的运行会话中。

1sudo firewall-cmd --permanent --new-zone=publicweb
2sudo firewall-cmd --permanent --new-zone=privateDNS

您可以通过键入来验证它们是否存在于您的永久配置中:

1sudo firewall-cmd --permanent --get-zones
1[secondary_label Output]
2block dmz drop external home internal privateDNS public publicweb trusted work

如前所述,这些还不会在运行时防火墙中可用:

1firewall-cmd --get-zones
1[secondary_label Output]
2block dmz drop external home internal public trusted work

重新加载防火墙,将这些新区域带入活跃运行时间配置:

1sudo firewall-cmd --reload
2firewall-cmd --get-zones
1[secondary_label Output]
2block dmz drop external home internal privateDNS public publicweb trusted work

现在,您可以开始将相应的服务和端口分配给您的区域。 通常,调整运行时防火墙,然后在测试后将这些更改保存到永久配置。

1sudo firewall-cmd --zone=publicweb --add-service=ssh
2sudo firewall-cmd --zone=publicweb --add-service=http
3sudo firewall-cmd --zone=publicweb --add-service=https
4sudo firewall-cmd --zone=publicweb --list-all
 1[secondary_label Output]
 2publicweb
 3  target: default
 4  icmp-block-inversion: no
 5  interfaces: 
 6  sources: 
 7  services: http https ssh
 8  ports: 
 9  protocols: 
10  masquerade: no
11  forward-ports: 
12  source-ports: 
13  icmp-blocks: 
14  rich rules:

同样,我们可以将DNS服务添加到我们的 privateDNS区域:

1sudo firewall-cmd --zone=privateDNS --add-service=dns
2sudo firewall-cmd --zone=privateDNS --list-all
 1[secondary_label Output]
 2privateDNS
 3  target: default
 4  icmp-block-inversion: no
 5  interfaces:
 6  sources:
 7  services: dns
 8  ports:
 9  protocols:
10  masquerade: no
11  forward-ports:
12  source-ports:
13  icmp-blocks:
14  rich rules:

然后,我们可以更改我们的界面到这些新区域来测试它们:

1sudo firewall-cmd --zone=publicweb --change-interface=eth0
2sudo firewall-cmd --zone=privateDNS --change-interface=eth1

在此时,您有机会测试您的配置. 如果这些值为您工作,您将希望将这些规则添加到永久配置中。您可以通过重新运行所有命令,附带永久旗帜,但在这种情况下,我们将使用永久旗帜永久保存整个运行时间配置:

1sudo firewall-cmd --runtime-to-permanent

永久应用这些规则后,重新加载防火墙,以测试变化是否存在:

1sudo firewall-cmd --reload

验证已分配正确的区域:

1firewall-cmd --get-active-zones
1[secondary_label Output]
2privateDNS
3  interfaces: eth1
4publicweb
5  interfaces: eth0

并验证为两个区域提供适当的服务:

1sudo firewall-cmd --zone=publicweb --list-services
1[secondary_label Output]
2http https ssh
1sudo firewall-cmd --zone=privateDNS --list-services
1[secondary_label Output]
2dns

您已经成功设置了自己的区域! 如果您想将其中一个区域作为其他接口的默认设置,请记住使用 --set-default-zone= 参数配置该行为:

1sudo firewall-cmd --set-default-zone=publicweb

结论

您现在应该对如何在CentOS系统上管理防火墙服务进行日常使用有相当深入的了解。

防火墙服务允许您配置可维护的规则和规则集,以考虑您的网络环境. 它允许您通过使用区域无缝地在不同的防火墙政策之间过渡,并让管理员能够将端口管理抽象化为更友好的服务定义。

有关 firewalld 的更多信息,请参阅 官方 firewalld 文档

Published At
Categories with 技术
comments powered by Disqus