Rocky Linux 9防火墙配置教程:使用firewalld轻松设置安全防护
引言
firewalld是许多Linux发行版上可用的防火墙管理软件,作为Linux基于内核的nftables或iptables数据包过滤系统的前端工具。
在本指南中,您将了解如何为您的Rocky Linux 9服务器设置firewalld防火墙,并涵盖使用firewall-cmd管理工具管理防火墙的基本知识。
先决条件
完成本教程,您需要运行Rocky Linux 9的服务器。您应该以非root、启用sudo的用户身份登录到该服务器上。要进行此设置,请参考我们的Rocky Linux 9初始服务器设置指南。
步骤1 – 复习firewalld中的核心概念
在实际使用firewall-cmd工具来管理防火墙配置之前,您应该熟悉该工具引入的一些概念。
区域
firewalld 守护程序通过称为区域的实体来管理规则组。区域是一组规则,根据您对网络的信任级别决定了应允许哪些流量。将网络接口分配给区域以决定防火墙应该允许的行为。
对于可能频繁在网络之间移动的计算机(如笔记本电脑),这种灵活性提供了一种根据您的环境更改规则的好方法。当连接到公共WiFi网络时,您可能会施加严格的规则,禁止大部分流量,而在连接到家庭网络时则允许更放松的限制。对于服务器来说,这些区域通常并不那么重要,因为网络环境极少甚至从不发生变化。
无论您的网络环境如何动态,熟悉firewalld预定义区域的总体概念仍然是有用的。firewalld中的预定义区域按从最不可信任到最可信任的顺序为:
- drop:最低信任级别。所有传入连接都被丢弃且不回复,只有传出连接是可能的。
- block:与上述类似,但不是丢弃连接,而是使用icmp-host-prohibited或icmp6-adm-prohibited消息拒绝传入请求。
- public:代表公共的、不受信任的网络。您不信任其他计算机,但可能允许有选择地允许某些传入连接。
- external:当您使用防火墙作为网关时的外部网络。它被配置为NAT伪装,以便您的内部网络保持私有但可访问。
- internal:外部区域的另一面,用于网关的内部部分。计算机相当可信,一些额外的服务可用。
- dmz:用于位于DMZ中的计算机(隔离的计算机,无法访问您网络的其余部分)。只允许某些传入连接。
- work:用于工作机器。信任网络中的大多数计算机。可能允许更多的服务。
- home:家庭环境。通常意味着您信任大多数其他计算机,并且将接受更多的服务。
- trusted:信任网络中的所有机器。可用选项中最开放的,应谨慎使用。
您可以使用防火墙来创建规则和更改区域属性,然后将网络接口分配给最合适的区域。
规则的永恒性
在firewalld中,规则可以应用于当前的实时规则集,也可以永久生效。当规则被添加或修改时,默认情况下只会修改当前运行的防火墙。在下次重新启动或重新加载firewalld服务之后,只有永久规则会保留下来。
大多数firewall-cmd操作可以使用–permanent标志来表示更改应该应用于永久配置。此外,当前运行的防火墙可以使用firewall-cmd –runtime-to-permanent命令保存到永久配置中。
运行时与永久配置的分离意味着您可以在活动防火墙中安全地测试规则,如果出现问题,可以重新加载以重新开始。
第二步-安装并启用firewalld
Rocky Linux 默认在一些 Linux 发行版上预装了 firewalld,包括许多部署。然而,您可能需要自己安装 firewalld。您可以使用 Rocky 的 dnf 包管理器来完成这个操作。
sudo dnf install firewalld -y
安装firewalld后,您需要使用systemctl启用该服务。请记住,启用firewalld将导致该服务在启动时启动。最好在仍在通过SSH登录时创建防火墙规则并测试它们,以避免潜在的问题。
sudo systemctl enable firewalld
sudo systemctl start firewalld
您可以通过键入来验证服务是否正在运行并可达:
sudo firewall-cmd --state
running
这表示您的防火墙正在以默认配置运行。在进行进一步修改之前,您应该熟悉firewalld提供的默认环境和规则。
探索默认设置
您可以通过运行firewall-cmd –get-default-zone来查看当前选定的默认区域。
firewall-cmd --get-default-zone
public
由于您没有给firewalld发送任何命令以使其与默认区域不同,并且您的任何接口都没有配置为绑定到其他区域,所以该区域也将是唯一的活动区域(控制我们接口流量的区域)。您可以通过运行firewall-cmd –get-active-zones来验证。
firewall-cmd --get-active-zones
public
interfaces: eth0 eth1
这是文章《如何在Rocky Linux 9上使用firewalld设置防火墙》的第2部分(共8部分)。
公共接口:eth0 eth1
在这里,您可以看到您的示例服务器有两个由防火墙控制的网络接口(eth0和eth1)。它们目前都按照为公共区域定义的规则进行管理。
您可以使用 firewall-cmd --list-all
打印出与默认区域配置相关联的规则。
- sudo firewall-cmd –list-all
public (active) target: default icmp-block-inversion: no interfaces: eth0 eth1 sources: services: cockpit dhcpv6-client ssh ports: protocols: forward: yes masquerade: no forward-ports: source-ports: icmp-blocks: rich rules:
你可以从输出中看出,这个区域既是默认区域又是活动区域,并且eth0和eth1接口与该区域相关联。从服务行中,你还可以看到该区域允许DHCP客户端(用于IP地址分配)、SSH(用于远程管理)和Cockpit(基于Web的控制台)的流量。
探索其他区域
你也可以找到其他区域的信息。
要获取可用区域的列表,请运行 firewall-cmd --get-zones
。
- firewall-cmd –get-zones
block dmz drop external home internal nm-shared public trusted work
在您的--list-all
命令中包含--zone=
参数,您可以查看与某个区域关联的具体配置。
- sudo firewall-cmd –zone=home –list-all
home target: default icmp-block-inversion: no interfaces: sources: services: cockpit dhcpv6-client mdns samba-client ssh ports: protocols: forward: yes masquerade: no forward-ports: source-ports: icmp-blocks: rich rules:
您可以使用--list-all-zones
参数输出所有的区域定义。接下来,您将学习如何将区域分配给网络接口。
步骤3 — 选择接口的区域
除非你已经对你的网络接口进行了其他配置,否则每个接口在防火墙启动时都会被放置在默认区域。
改变接口的区域
在会话期间,您可以通过使用--zone=
参数与--change-interface=
参数相结合将接口移动到不同的区域。与所有修改防火墙的命令一样,您需要使用sudo。
例如,您可以将您的eth0接口移动到家庭区域。
- sudo firewall-cmd –zone=home –change-interface=eth0
success
注意:每当您将接口移动到新的区域时,请注意您正在修改哪些服务将运行。在这种情况下,您将移动到具有SSH可用性的家庭区域。这意味着您的连接不应该中断。其他一些区域默认情况下没有启用SSH,并且切换到其中一个区域可能会导致您的连接中断,无法重新登录到服务器。你可以通过再次检查活动区域来确认这一操作是否成功。
- firewall-cmd –get-active-zones
home interfaces: eth0 public interfaces: eth1
调整默认区域设置
如果您所有的接口都可以由一个预定义的区域很好地处理,那么您应该将该区域指定为默认区域。您可以使用--set-default-zone=
参数来更改默认区域。这将立即更改使用默认区域的任何接口。
- sudo firewall-cmd –set-default-zone=home
success
第四步——为您的应用程序设置规则
让我们来一起了解定义防火墙例外的几种方式。
给你的区域添加一个服务
最直接的方法是将您需要的服务或端口添加到您正在使用的区域。您可以使用firewall-cmd命令的--get-services
选项获取可用的服务定义列表。
- firewall-cmd –get-services
RH-Satellite-6 RH-Satellite-6-capsule 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 collectd condor-collector ctdb dhcp dhcpv6 dhcpv6-client distcc dns dns-over-tls docker-registry docker-swarm dropbox-lansync elasticsearch etcd-client etcd-server finger foreman foreman-proxy freeipa-4 freeipa-ldap freeipa-ldaps freeipa-replication freeipa-trust ftp galera 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 kube-api kube-apiserver kube-control-plane kube-controller-manager kube-scheduler kubelet-worker ldap ldaps libvirt libvirt-tls lightning-network llmnr managesieve matrix mdns memcache minidlna mongodb mosh mountd mqtt mqtt-tls ms-wbt mssql murmur mysql nbd netbios-ns 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 rquotad 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 tile38 tinc tor-socks transmission-client upnp-client vdsm vnc-server wbem-http wbem-https wireguard wsman wsmans xdmcp xmpp-bosh xmpp-client xmpp-local xmpp-server zabbix-agent zabbix-server
注意:
您可以通过查看/usr/lib/firewalld/services目录中与其关联的.xml文件来了解有关每个服务的更多详细信息。例如,SSH服务的定义如下:
/usr/lib/firewalld/services/ssh.xml
<?xml version=”1.0″ encoding=”utf-8″?>
<service>
<short>SSH</short>
<description>安全外壳(SSH)是一种用于登录和在远程机器上执行命令的协议。它提供安全的加密通信。如果您打算通过防火墙接口远程访问您的机器,启用此选项。为了使此选项有用,您需要安装openssh-server软件包。</description>
<port protocol=”tcp” port=”22″/>
</service>
您可以使用–add-service参数启用某个区域的服务。该操作将针对默认区域进行,或者针对–zone参数指定的区域进行。默认情况下,这将仅调整当前防火墙会话,并且不会在服务重新启动或重启后保持。您可以通过包含–permanent标志来调整永久的防火墙配置。
举个例子,假设你在运行一个为传统的HTTP流量提供服务的网络服务器,你可以暂时允许公共区域接口通过该流量。
- sudo firewall-cmd –zone=public –add-service=http
您可以省略”–zone=”标志来修改默认区域。您可以使用”–list-all”或”–list-services”操作验证操作是否成功。
- sudo firewall-cmd –zone=public –list-services
cockpit dhcpv6-client http ssh
一旦您测试确认一切正常运行,您可以修改永久防火墙规则,以便在重新启动后仍然可以使用您的服务。您可以通过添加”–permanent”标志使先前的命令变为永久设置。
- sudo firewall-cmd –zone=public –add-service=http –permanent
success
另外,您可以使用–runtime-to-permanent标志将当前运行的防火墙配置保存到永久配置中。
- sudo firewall-cmd –runtime-to-permanent
小心使用此选项,因为对运行中的防火墙所做的所有更改都将永久生效。
无论您选择的方法是什么,在执行–list-services操作时,您可以通过添加–permanent标志来验证其是否成功。对于任何–permanent操作,您需要使用sudo。
- sudo firewall-cmd –zone=public –list-services –permanent
控制面板 dhcpv6客户端 http ssh
现在,您的公共区域将允许通过端口80传输HTTP网页流量。如果您的网络服务器配置了SSL/TLS,您还需要添加https服务。您可以通过键入以下命令将其添加到当前会话和永久规则集中:
- sudo firewall-cmd –zone=public –add-service=https
- sudo firewall-cmd –zone=public –add-service=https –permanent
虽然防火墙预装了许多常见应用程序的服务,但在某些情况下,这些服务可能无法满足您的特定需求。
在这种情况下,您有两个选择:
为您的区域开启端口
为特定应用程序添加支持的最直接方法是在适当的区域中打开其使用的端口。这可以通过指定端口或端口范围以及相关协议(TCP或UDP)来实现。
例如,如果您的应用程序运行在5000端口并使用TCP协议,您可以使用–add-port参数将其临时添加到公共区域。协议可以被指定为tcp或udp。
- sudo firewall-cmd –zone=public –add-port=5000/tcp
success
您可以通过使用–list-ports操作来验证这一操作是否成功。
- sudo firewall-cmd –zone=public –list-ports
5000/tcp
您还可以通过使用短横线分隔起始端口和结束端口来指定连续的端口范围。例如,如果您的应用程序使用UDP端口4990到4999,您可以通过输入以下命令在公共区域上打开这些端口:
- sudo firewall-cmd –zone=public –add-port=4990-4999/udp
在测试完毕后,您可以将这些规则添加到永久防火墙配置中。使用sudo firewall-cmd --runtime-to-permanent
命令,或者重新运行命令并添加–permanent标志。
- 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目录(firewalld在此目录中查找自定义服务定义)来开始配置。
例如,您可以通过以下方式将SSH服务定义复制为您的示例服务定义。在防火墙服务列表中,服务名称将是此文件的名称,去掉”.xml”后缀。
- sudo cp /usr/lib/firewalld/services/ssh.xml /etc/firewalld/services/example.xml
使用vi或您喜欢的文本编辑器打开文件:
- sudo vi /etc/firewalld/services/example.xml
初始状态下,文件将包含您复制的SSH服务定义。
<?xml version="1.0" encoding="utf-8"?>
<service>
<short>SSH</short>
<description>安全外壳协议(SSH)是一种用于登录远程计算机并执行命令的协议。它提供安全的加密通信。如果您计划通过防火墙接口远程访问您的机器,请启用此选项。要使此选项有用,您需要安装openssh-server软件包。</description>
<port protocol="tcp" port="22"/>
</service>
此定义的大部分内容实际上是元数据。您应该在<short>标签内更改服务的简称,这是您服务的可读名称。同时,您还应该添加描述,以便在需要审核服务时提供更多信息。实际影响服务功能的配置主要是端口定义,您需要指定端口号和协议类型。可以指定多个<port>标签。
对于您的示例服务,假设您需要为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 RH-Satellite-6-capsule 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 collectd 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 foreman foreman-proxy freeipa-4 freeipa-ldap freeipa-ldaps freeipa-replication freeipa-trust ftp galera 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 kube-api kube-apiserver kube-control-plane kube-controller-manager kube-scheduler kubelet-worker ldap ldaps libvirt libvirt-tls lightning-network llmnr managesieve matrix mdns memcache minidlna mongodb mosh mountd mqtt mqtt-tls ms-wbt mssql murmur mysql nbd netbios-ns 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 rquotad 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 tile38 tinc tor-socks transmission-client upnp-client vdsm vnc-server wbem-http wbem-https wireguard wsman wsmans xdmcp xmpp-bosh xmpp-client xmpp-local xmpp-server zabbix-agent zabbix-server
您可以像平常一样在您的区域使用这项服务。
第五步 – 创建您自己的区域
虽然预定义的区域对大多数用户来说应该有效,但为其功能更具描述性地定义自己的区域可能会有所帮助。
例如,您可能需要为您的网络服务器创建一个名为publicweb的区域。然而,您可能需要为您在私有网络上提供的DNS服务配置另一个区域。您可以创建一个名为privateDNS的其他区域来实现这一点。
在添加区域时,你必须将其添加到永久的防火墙配置中。然后可以重新加载以将配置带入你当前的会话。例如,你可以使用firewall-cmd –new-zone创建这两个区域。
- 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 nm-shared privateDNS public publicweb trusted work
重新加载防火墙以将这些新区域导入活动运行配置。
- sudo firewall-cmd –reload
- firewall-cmd –get-zones
block dmz drop external home internal nm-shared privateDNS public publicweb trusted work
现在,您可以开始将适当的服务和端口分配给您的区域。通常,在测试后,调整运行时防火墙并将这些更改保存到永久配置是一个好主意。例如,对于publicweb区域,您可以添加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: http https ssh ports: protocols: forward: no masquerade: no forward-ports: source-ports: icmp-blocks: rich rules:
然后您可以将DNS服务添加到您的privateDNS区域中。
- sudo firewall-cmd –zone=privateDNS –add-service=dns
- sudo firewall-cmd –zone=privateDNS –list-all
privateDNS target: default icmp-block-inversion: no interfaces: sources: services: dns ports: protocols: forward: no masquerade: no forward-ports: source-ports: icmp-blocks: rich rules:
你可以将我们的网络接口切换到这些新区域进行测试。
- sudo firewall-cmd –zone=publicweb –change-interface=eth0
- sudo firewall-cmd –zone=privateDNS –change-interface=eth1
在这一点上,你有机会测试你的配置。如果这些值对你有效,你应该将这些规则添加到永久配置中。你可以通过再次运行所有命令并附加–permanent标志来实现这一点,但在这种情况下,你将使用–runtime-to-permanent标志将整个运行时配置永久保存下来。
- sudo firewall-cmd –runtime-to-permanent
永久应用这些规则后,重新加载防火墙以测试更改是否保留:
- sudo firewall-cmd –reload
验证正确的区域已经分配。
- 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
你已经成功设置了自己的区域!要将其中一个区域设置为其他网络接口的默认区域,请记得使用 –set-default-zone= 参数配置该行为。
- sudo firewall-cmd –set-default-zone=publicweb
结论
你现在应该对如何管理Rocky Linux系统上的firewalld服务有了相当全面的了解,以供日常使用。
防火墙服务允许您配置可维护的规则和规则集,考虑到您的网络环境。通过使用区域,它使您能够无缝切换不同的防火墙策略。了解并掌握这个系统,将使您能够充分利用这个工具提供的灵活性和强大性。
有关firewalld的更多信息,请查看官方firewalld文档。