介绍
Firewalld是一个完整的防火墙解决方案,默认情况下在CentOS 7服务器上可用。 在本指南中,我们将介绍如何设置为您的服务器的防火墙,并显示你与管理防火墙的基本知识firewall-cmd
管理工具(如果你想用iptables
使用CentOS的,请按照本指南 )。
Firewalld中的基本概念
我们开始谈论如何实际使用之前, firewall-cmd
工具来管理您的防火墙配置,我们应该熟悉该工具介绍一些基本的概念。
区域
该firewalld
守护程序管理使用实体被称为“区”的规则组。 区域基本上是根据您在计算机连接的网络中具有的信任级别来规定应允许什么流量的规则集。 网络接口被分配一个区域以指示防火墙应该允许的行为。
对于可能频繁在网络之间移动的计算机(如笔记本电脑),这种灵活性提供了一种根据您的环境更改规则的好方法。 您可以制定严格的规则,禁止在公共WiFi网络上运行时大多数流量,而在连接到家庭网络时允许更宽松的限制。 对于服务器,这些区域不是那么直接重要,因为网络环境很少(如果曾经)改变。
不管如何dymaic您的网络环境而定,它仍然是有用的熟悉每一个的预定义区背后的总体思路firewalld
。 为了从最信任 最值得信赖的 ,在预先定义的区域firewalld
有:
- 掉落 :信托的最低水平。 所有传入的连接都将被丢弃而无应答,并且只有传出连接是可能的。
- 块 :与上述类似的,但不是简单地丢弃连接,传入的请求与一个拒绝
icmp-host-prohibited
或icmp6-adm-prohibited
消息。 - 市民 :市民代表,不受信任的网络。 您不信任其他计算机,但可以根据具体情况允许所选的传入连接。
- 外部 :在您正在使用防火墙作为网关事件外网。 它配置为NAT伪装,以便您的内部网络保持私有,但可访问。
- 内部 :外部区的另一侧,用于网关的内部部分。 电脑是相当可信的,一些额外的服务可用。
- DMZ:用于位于DMZ(将无法访问您的网络的其余部分隔离的计算机)的计算机。 只允许某些传入连接。
- 工作 :用于工作机器。 信任网络中的大多数计算机。 可能还允许其他一些服务。
- 家庭 :家庭环境。 它通常意味着您信任大多数其他计算机,并且将接受更多的服务。
- 受信任 :信任所有机器的网络。 最开放的可用选项,应谨慎使用。
要使用防火墙,我们可以创建规则并更改区域的属性,然后将我们的网络接口分配到最合适的区域。
规则永久性
在firewalld中,规则可以被指定为永久或立即。 如果添加或修改规则,默认情况下,将修改当前运行的防火墙的行为。 在下次启动时,旧规则将还原。
大多数firewall-cmd
操作可以采取--permanent
标志以指示该非临时防火墙应定位。 这将影响在引导时重新加载的规则集。 这种分离意味着您可以在活动防火墙实例中测试规则,然后如果有问题,则重新加载。 您也可以使用--permanent
标志过,将一次全部时发出reload命令适用的时间打造出一整套的规则的。
打开防火墙
在我们开始创建我们的防火墙规则之前,我们需要实际打开守护进程。 该systemd
单元文件名为firewalld.service
。 我们可以通过键入以下内容来启动此会话的守护程序:
sudo systemctl start firewalld.service
我们可以通过键入以下内容来验证服务是否正在运行和可访问:
firewall-cmd --state
outputrunning
这表明我们的防火墙已启动并使用默认配置运行。
在这一点上,我们不会enable
该服务。 启用服务将导致防火墙在引导时启动。 我们应该等到我们创建了防火墙规则,并有机会在配置此行为之前测试它们。 这可以帮助我们避免被锁定的机器如果出了问题。
熟悉当前防火墙规则
在我们开始修改之前,我们应该熟悉守护进程提供的默认环境和规则。
探索默认值
我们可以通过键入以下内容查看当前选择哪个区域作为默认区域:
firewall-cmd --get-default-zone
outputpublic
因为我们还没有给firewalld
任何命令,从默认区域偏离,没有我们的接口都配置为绑定到另一个区域,该区域也将是唯一的“活性”区(即控制了交通区我们接口)。 我们可以通过键入以下内容来验证:
firewall-cmd --get-active-zones
outputpublic
interfaces: eth0 eth1
在这里,我们可以看到,我们有两个网络接口被防火墙(控制eth0
和eth1
)。 它们目前都按照为公共区域定义的规则进行管理。
我们怎么知道什么规则与公共区域相关联? 我们可以通过键入以下内容打印默认区域的配置:
firewall-cmd --list-all
outputpublic (default, active)
interfaces: eth0 eth1
sources:
services: dhcpv6-client ssh
ports:
masquerade: no
forward-ports:
icmp-blocks:
rich rules:
我们可以从输出,这个区域既是默认的和积极的,并告诉了eth0
和eth1
接口与该区域相关联(我们已经知道从我们以前的查询这一切)。 但是,我们还可以看到,此区域允许与DHCP客户端(用于IP地址分配)和SSH(用于远程管理)相关联的正常操作。
探索替代区域
现在我们有一个好的默认和活动区域的配置。 我们也可以找到关于其他区域的信息。
要获取可用区域的列表,请键入:
firewall-cmd --get-zones
outputblock dmz drop external home internal public trusted work
我们可以通过包括查看与区域相关联的具体配置--zone=
参数我们--list-all
命令:
firewall-cmd --zone=home --list-all
outputhome
interfaces:
sources:
services: dhcpv6-client ipp-client mdns samba-client ssh
ports:
masquerade: no
forward-ports:
icmp-blocks:
rich rules:
您可以输出所有使用区域定义的--list-all-zones
选项。 您可能希望将输出传递到一个寻呼机,以方便查看:
firewall-cmd --list-all-zones | less
为接口选择区域
除非您已经配置了网络接口否则,当防火墙启动时,每个接口将被置于默认区域。
更改当前会话的接口的区域
您可以通过使用一个会话过程中的过渡区之间的接口--zone=
与组合参数--change-interface=
参数。 由于与修改防火墙的所有命令,你将需要使用sudo
。
例如,我们可以转换我们eth0
通过键入该接口与“家”的区域:
sudo firewall-cmd --zone=home --change-interface=eth0
outputsuccess
我们可以通过再次请求活动区域来验证这是否成功:
firewall-cmd --get-active-zones
outputhome
interfaces: eth0
public
interfaces: eth1
如果防火墙已完全重新启动,则界面将恢复为默认区域:
sudo systemctl restart firewalld.service
firewall-cmd --get-active-zones
outputpublic
interfaces: eth0 eth1
永久更改您的接口的区域
如果接口在其配置中没有定义替代区域,则它们将始终恢复到默认区域。 在CentOS,这些配置都在中定义/etc/sysconfig/network-scripts
目录中的格式文件ifcfg- interface
。
要为接口定义区域,请打开与要修改的接口相关联的文件。 我们将演示永久性更改:
sudo nano /etc/sysconfig/network-scripts/ifcfg-eth0
在文件的底部,设置ZONE=
变量要与该接口相关联的区域。 在我们的例子中,这将是“home”接口:
. . .
DNS1=2001:4860:4860::8844
DNS2=2001:4860:4860::8888
DNS3=8.8.8.8
ZONE=home
保存并关闭文件。
要实现您的更改,您必须重新启动网络服务,然后是防火墙服务:
sudo systemctl restart network.service
sudo systemctl restart firewalld.service
防火墙重新启动后,你可以看到你eth0
接口将自动放置在“家”的区域:
firewall-cmd --get-active-zones
outputhome
interfaces: eth0
public
interfaces: eth1
如果这不是您要用于此界面的实际区域,请务必还原这些更改。
调整默认区域
如果所有接口最好由单个区域处理,则可能更容易选择最佳默认区域,然后将其用于您的配置。
您可以使用更改默认的区域--set-default-zone=
参数。 这将立即将任何已恢复默认的接口更改为新区域:
sudo firewall-cmd --set-default-zone=home
outputhome
interfaces: eth0 eth1
设置应用程序的规则
为您希望提供的服务定义防火墙例外的基本方法很容易。 我们将在这里介绍基本的想法。
向您的区域添加服务
最简单的方法是将所需的服务或端口添加到您正在使用的区域。 同样,你可以得到的可用服务的列表--get-services
选项:
firewall-cmd --get-services
outputRH-Satellite-6 amanda-client bacula bacula-client dhcp dhcpv6 dhcpv6-client dns ftp high-availability http https imaps ipp ipp-client ipsec kerberos kpasswd ldap ldaps libvirt libvirt-tls mdns mountd ms-wbt mysql nfs ntp openvpn pmcd pmproxy pmwebapi pmwebapis pop3s postgresql proxy-dhcp radius rpc-bind samba samba-client smtp ssh telnet tftp tftp-client transmission-client vnc-server wbem-https
您可以通过查看其相关的获取有关这些服务的详细信息.xml
的文件中的/usr/lib/firewalld/services
目录。 例如,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>
您可以使用启用区域服务--add-service=
参数。 该操作将目标锁定在默认区域或其他区域被指定--zone=
参数。 默认情况下,这只会调整当前的防火墙会话。 您可以通过包括调整永久性防火墙配置--permanent
标志。
例如,如果我们正在运行一个服务于常规HTTP流量的Web服务器,我们可以通过键入以下内容在此会话的“公共”区域中允许此流量:
sudo firewall-cmd --zone=public --add-service=http
你可以离开了--zone=
如果你想修改默认的区域。 我们可以验证操作成功使用--list-all
或--list-services
操作:
firewall-cmd --zone=public --list-services
outputdhcpv6-client http ssh
一旦你测试了一切正常工作,你可能想修改永久防火墙规则,以便你的服务在重新启动后仍然可用。 我们可以通过键入以下内容使我们的“公共”区域永久更改:
sudo firewall-cmd --zone=public --permanent --add-service=http
您可以验证这是通过添加成功--permanent
标志的--list-services
操作。 您需要使用sudo
任何--permanent
操作:
sudo firewall-cmd --zone=public --permanent --list-services
outputdhcpv6-client http ssh
您的“公共”区现在将允许HTTP Web流量的端口80如果Web服务器配置为使用SSL / TLS,你也想添加https
服务。 我们可以通过键入以下内容将其添加到当前会话和永久规则集:
sudo firewall-cmd --zone=public --add-service=https
sudo firewall-cmd --zone=public --permanent --add-service=https
如果没有适当的服务,该怎么办?
firewalld安装中包含的防火墙服务代表了您可能希望允许访问的应用程序的许多最常见的要求。 但是,可能会出现这些服务不符合您的要求的情况。
在这种情况下,您有两个选项。
打开您的区域的端口
为特定应用程序添加支持的最简单方法是打开其在相应区域中使用的端口。 这很容易指定端口或端口范围,以及需要打开的端口的关联协议。
举例来说,如果我们的应用程序在端口5000上运行,并使用TCP,我们就可以使用添加这对“公共”区域为本届会议--add-port=
参数。 协议可以是tcp
或udp
:
sudo firewall-cmd --zone=public --add-port=5000/tcp
我们可以验证这是成功使用--list-ports
操作:
firewall-cmd --list-ports
output5000/tcp
还可以通过用破折号分隔范围中的开始和结束端口来指定端口的顺序范围。 例如,如果我们的应用程序使用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
outputsuccess
success
4990-4999/udp 5000/tcp
定义服务
为您的区域打开端口很容易,但可能很难跟踪每个是什么。 如果您在服务器上停止服务,您可能很难记住仍然需要打开哪些端口。 为了避免这种情况,可以定义服务。
服务只是具有相关名称和描述的端口集合。 使用服务比端口更容易管理,但需要一些前期工作。 开始最简单的方法是将现有的脚本(见于复制/usr/lib/firewalld/services
)将/etc/firewalld/services
目录所在的防火墙寻找非标准定义。
例如,我们可以复制SSH服务定义以用于我们的“example”服务定义。 文件名减去.xml
Stapling将决定防火墙服务列表中的服务的名称:
sudo cp /usr/lib/firewalld/services/service.xml /etc/firewalld/services/example.xml
现在,您可以调整在您复制的文件中找到的定义:
sudo nano /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>
这个定义的大部分实际上是元数据。 你将要为中的服务更改简称<short>
标记。 这是一个人类可读的名称为您的服务。 您还应添加描述,以便在需要审核服务时提供更多信息。 您需要做的唯一配置实际上影响服务的功能可能是端口定义,其中您标识您想要打开的端口号和协议。 这可以多次指定。
对于我们的“示例”服务,想象我们需要打开端口7777为TCP和8888为UDP。 我们可以修改现有的定义,像这样:
<?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
outputRH-Satellite-6 amanda-client bacula bacula-client dhcp dhcpv6 dhcpv6-client dns example ftp high-availability http https imaps ipp ipp-client ipsec kerberos kpasswd ldap ldaps libvirt libvirt-tls mdns mountd ms-wbt mysql nfs ntp openvpn pmcd pmproxy pmwebapi pmwebapis pop3s postgresql proxy-dhcp radius rpc-bind samba samba-client smtp ssh telnet tftp tftp-client transmission-client vnc-server wbem-https
您现在可以按照通常的方式在您的区域中使用此服务。
创建自己的区域
虽然预定义的区域对于大多数用户可能是足够的,但是定义自己的更具描述其功能的区域可能是有帮助的。
例如,您可能需要为Web服务器创建一个名为“publicweb”的区域。 但是,您可能需要为您在专用网络上提供的DNS服务配置另一个区域。 您可能需要一个名为“privateDNS”的区域。
添加区域时,必须将其添加到永久防火墙配置。 然后,您可以重新加载以将配置置于正在运行的会话中。 例如,我们可以通过键入以下内容创建我们上面讨论的两个区域:
sudo firewall-cmd --permanent --new-zone=publicweb
sudo firewall-cmd --permanent --new-zone=privateDNS
您可以通过键入以下内容来验证这些配置是否存在于永久配置中:
sudo firewall-cmd --permanent --get-zones
outputblock dmz drop external home internal privateDNS public publicweb trusted work
如前所述,这些在当前防火墙实例中将不可用:
firewall-cmd --get-zones
outputblock dmz drop external home internal public trusted work
重新加载防火墙以使这些新区域进入活动配置:
sudo firewall-cmd --reload
firewall-cmd --get-zones
outputblock dmz drop external home internal 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
firewall-cmd --zone=publicweb --list-all
outputpublicweb
interfaces:
sources:
services: http https ssh
ports:
masquerade: no
forward-ports:
icmp-blocks:
rich rules:
同样,我们可以将DNS服务添加到我们的“privateDNS”区域:
sudo firewall-cmd --zone=privateDNS --add-service=dns
firewall-cmd --zone=privateDNS --list-all
outputprivateDNS
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
此时,您有机会测试您的配置。 如果这些值适用于您,您将需要向永久配置添加相同的规则。 为此,您可以通过重新申请的规则--permanent
标志:
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
然后可以修改网络接口以自动选择正确的区域。
我们可以将相关联eth0
与“publicweb”区段接口:
sudo nano /etc/sysconfig/network-scripts/ifcfg-eth0
[label /etc/sysconfig/network-scripts/ifcfg-eth0
. . .
IPV6_AUTOCONF=no
DNS1=2001:4860:4860::8844
DNS2=2001:4860:4860::8888
DNS3=8.8.8.8
ZONE=publicweb
我们可以协理eth1
以“privateDNS”界面:
sudo nano /etc/sysconfig/network-scripts/ifcfg-eth1
. . .
NETMASK=255.255.0.0
DEFROUTE='no'
NM_CONTROLLED='yes'
ZONE=privateDNS
之后,您可以重新启动网络和防火墙服务:
sudo systemctl restart network
sudo systemctl restart firewalld
验证是否已分配正确的区域:
firewall-cmd --get-active-zones
outputprivateDNS
interfaces: eth1
publicweb
interfaces: eth0
并验证适当的服务可用于两个区域:
firewall-cmd --zone=publicweb --list-services
outputhttp htpps ssh
firewall-cmd --zone=privateDNS --list-services
outputdns
您已成功设置自己的区域。 如果你想使这些区域中的一个,其他接口的默认值,记得要配置与该行为--set-default-zone=
参数:
sudo firewall-cmd --set-default-zone=publicweb
启用防火墙在引导时启动
在指南的开头,我们开始了我们的firewalld服务,但是我们没有启用它。 如果您对当前配置感到满意,并且在重新启动服务时测试了它的功能,则可以安全地启用该服务。
要将防火墙配置为在引导时启动,请键入:
sudo systemctl enable firewalld
当服务器重新启动时,您的防火墙应该启动,您的网络接口应该放入您配置的区域(或回退到配置的默认区域),并且与区域关联的规则将应用于关联接口。
结论
您现在应该对如何管理Centos系统上的firewalld服务进行日常使用有相当好的了解。
firewalld服务允许您配置可维护的规则和规则集,并考虑您的网络环境。 它允许您通过使用区域在不同的防火墙策略之间无缝地转换,并使管理员能够将端口管理抽象为更友好的服务定义。 获得该系统的工作知识将允许您利用该工具提供的灵活性和强大的优势。