myfreax

如何在CentOS 7配置防火墙firewalld

正确配置的防火墙是整个系统安全的最重要方面之一。FirewallD是一个完整的防火墙解决方案,可以管理系统的iptables规则

12 min read
By myfreax
如何在CentOS 7配置防火墙firewalld

正确配置的防火墙是整个系统安全的最重要方面之一。FirewallD是一个完整的防火墙解决方案,可以管理系统的iptables规则并提供D-Bus接口以对其进行操作。

从CentOS 7开始,FirewallD取代iptables作为默认的防火墙管理工具。默认情况下,CentOS 7禁用防火墙服务。

在开始本教程之前,请确保您以root或者具有sudo权限的用户登录。最佳实践是以sudo用户而不是root用户运行管理命令。

如果您的CentOS系统上没有sudo用户,请阅读我们教程如何在CentOS创建sudo用户

FirewallD使用区域和服务的概念,而不是iptables链和规则。根据您将要配置的区域和服务,您可以控制系统允许或禁止的连接。

FirewallD可以使用firewall-cmd命令进行配置和管理。Firewalld默认安装在CentOS 7上,但是如果您的系统上未安装Firewalld。

则可以通过yum命令sudo yum install firewalld来安装Firewalld。您可以使用以下firewall-cmd命令检查防火墙状态。

如果您刚刚安装或从未激活过,sudo firewall-cmd --state命令将显示not running,否则将显示running

要启动FirewallD服务并在计算机启动时自动启动FirewallD服务,请运行systemctl命令sudo systemctl start firewalld && sudo systemctl enable firewalld

防火墙使用两个单独的配置集,运行时和永久配置。运行时配置是实际的运行配置,并且在重新启动后消失。

当防火墙服务启动时,它将加载永久配置,该永久配置将成为运行时配置。

默认情况下,当使用firewall-cmd命令对Firewalld配置进行更改时,所做的更改将应用​​于运行时配置,要使更改永久生效,您需要使用--permanent选项运行firewall-cmd命令。

防火墙区域与服务

区域是预定义的规则集,基于计算机信任级别来指定允许的网络连接。您可以将接口和源分配给区域。一个区域必须关联一个网络接口。

以下是FirewallD划分的区域,根据区域的信任级别从不信任到受信任而排序:

drop区域删除所有传入连接,而无任何通知。仅允许传出连接。

block区域对于IPv6/IPv4icmp6-adm-prohibited/IPv6n,所有传入连接均被拒绝,并带有icmp-host-prohibited消息。仅允许传出连接。

public区域用于不受信任的区域。即您的计算机在一个不可信的计算机网络上,但你可以指定那些连接允许传入。

external区域对于用在内部网络。当你的系统充当网关或者路由时,在网络上的计算机通常是可信的,仅已允许的连接可以传入。

internal区域对于在内部网络上。当计算机充当网关或路由器时。网络上的其它计算机通常是受信任的。仅已允许的连接可以传入。

dmz区域对于计算机位于可缓冲区,区域内计算机访问网络时将会被限制。仅已允许的连接可以传入。

work区域用于工作机。网络上的其他计算机通常是受信任的。仅已允许的连接可以传入。

home区域用于家庭计算机。网络上的其他计算机通常是受信任的。仅已允许的连接可以传入。

trusted区域接受所有网络连接。信任在网络中的所有计算机。

防火墙服务是预定义的规则集,关联在区域内,并定义必要的设置以允许指定服务的传入连接。

防火墙区域

首次启用FirewallD服务后,public区域被设置为默认区域。你可通过命令sudo firewall-cmd --get-default-zone获得默认区域的名称。

如需要获取所有可用区域的列表,请运行命令sudo firewall-cmd --get-zones。将会列出所有区域block dmz drop external home internal public trusted work。

默认情况下,所有网络接口/网卡都分配有默认区域。要检查您的网络接口关联了那区域,你可以运行命令sudo firewall-cmd --get-active-zones

从输出中,我们可以看到eth0eth1接口都使用了public区域

sudo firewall-cmd --list-all命令将会列出区域关联的服务。如果未指定区域,firewall-cmd将会查询默认区域。

由于我们没有改变默认区域因此时public区域。还允许与DHCP客户端服务和SSH的连接。

如果要列出指定区域的配置信息和关联服务的信息,你使用--zone选项指定区域。--list-all-zones可以列出所有区域的配置与关联服务。

sudo firewall-cmd --list-all #列出默认区域
sudo firewall-cmd --zone=external --list-all #指定区域
sudo firewall-cmd --zone=external ---list-all-zones #所有

现在已经知道如何获得防火墙的区域信息,接下来看看如何修改防护墙区域关联的接口和默认的的区域。

要修改接口的关联的防火墙区域,可通过结合使用--zone选项和--change-interface选项,修改接口的区域。

sudo firewall-cmd --zone=work --change-interface=eth1命令将会修改eth1接口关联防火墙区域work。你可运行sudo firewall-cmd --get-active-zones命令验证eth1关联的区域。

更改默认的区域,可以使用--set-default-zone选项,后跟要设为默认区域的名称。

sudo firewall-cmd --set-default-zone=home命令要将默认区域更改为home。可以通过运行命令sudo firewall-cmd --get-default-zone获取防火墙默认区域验证更改。

防火墙服务

使用FirewallD,您可以根据称为服务的预定义规则允许指定端口的连接。你可以通过运行命令sudo firewall-cmd --get-services要获取所有可用服务的列表,

你可在/usr/lib/firewalld/services目录找到服务中firewalld服务的配置文件,它为firewalld提供连接入口的信息。配置文件中最重要的配置选项是端口、模块和目标地址。

要在当前会话允许http服务,即运行时配置。也就是允许在public区域传入HTTP 80端口的连接。

你可运行命令sudo firewall-cmd --zone=public --add-service=http。要验证是否已成功添加服务,请运行命令sudo firewall-cmd --zone=public --list-services进行验证。

如果要在重启后保持端口80的打开状态,则需要再次输入相同的命令。如果使用--permanent选项修改,重启后继续使用规则。

--permanent选项的修改需要使用--list-services--permanent选项来验证您的更改。我们建议你经常直接--permanent选项添加和删除firewalld服务。

删除服务的语法与添加服务时的语法相同。只需使用--remove-service而不是--add-service选项。

sudo firewall-cmd --permanent --zone=public --add-service=http #添加http服务
sudo firewall-cmd --permanent --zone=public --list-services #列出服务
sudo firewall-cmd --zone=public --remove-service=http --permanent #删除服务

打开端口

上面说明都是通过服务的配置文件打开端口,但是有时候不是所有服务都带有配置文件。在这种情况下,您有两种选择。您可以打开指定的端口,也可以定义新的FirewallD服务。

例如,Plex服务器监听TCP协议32400端口,可使用--add-port=选项在当前会话的public区域中打开32400端口。

协议可以是tcpudp。要验证是否已成功添加32400端口,请使用--list-ports选项列出已打开的端口。

要在重新启动后使端口32400保持打开状态,请使用--permanent选项运行相同的命令,将规则添加到配置文件中。

删除端口规则的语法与添加端口时的语法相同。只需使用--remove-port选项即可。

sudo firewall-cmd --zone=public --add-port=32400/tcp #打开端口
sudo firewall-cmd --zone=public --list-ports #列出
sudo firewall-cmd --zone=public --remove-port=32400/tcp #

创建FirewallD服务

应用程序默认的服务配置文件存储在目录/usr/lib/firewalld/services。创建FirewallD服务的最简单方法是基于将现有服务文件创建一个副本。命名为你服务名称。

例如,要为Plex媒体服务器创建服务配置文件,我们可以使用SSH服务的配置文件作为模板。

运行以下cp命令sudo cp /usr/lib/firewalld/services/ssh.xml /etc/firewalld/services/plexmediaserver.xml创建Plex的firewalld服务的模板。

使用你喜欢的文件编辑器,打开文件plexmediaserver.xml。在本教程我们将使用vim命令打开文件

并在<short><description>标签内更改firewalld服务的简称和描述。您需要更改的最重要的标签是port标签,port标签定义了您要打开的端口号和协议。

在示例中,我们打开UDP协议1900端口和TCP协议32400端口。

sudo vim /etc/firewalld/services/plexmediaserver.xml

#以下是文件内容
<?xml version="1.0" encoding="utf-8"?>
<service version="1.0">
<short>plexmediaserver</short>
<description>Plex is a streaming media server that brings all your video, music and photo collections together and stream them to your devices at anytime and from anywhere.</description>
<port protocol="udp" port="1900"/>
<port protocol="tcp" port="32400"/>
</service>
/etc/firewalld/services/plexmediaserver.xml

保存文件并退出vim编辑器,然后运行sudo firewall-cmd --reload命令重新加载FirewallD服务。

您现在可以在所有区域中通过命令sudo firewall-cmd --permanent --zone=public --add-service=plexmediaserver添加firewalld的plexmediaserver服务。注意这里命令指定public区域

端口转发

要将流量从一个端口转发到另一个端口或地址,请首先使用--add-masquerade选项在指定的区域启用伪装。

sudo firewall-cmd --zone=external --add-masquerade命令将在firewalld的public区域启用伪装。

firewalld防火墙可以创建三种不同的端口转发方式。分别在计算机内的端口转发,不同计算机相同端口转发,不同计算机端口转发。

在设置firewalld防火墙端口转发时,你需要使用--add-forward-port选项表示添加端口转发。

还有port选项指定要转发的端口,proto选项指定协议,toport选项指定目标主机的端口。toaddr选项指定目标地址。

在同一计算机内可以省略toaddr选项。如果转发的端口和目标端口相同可以省略目标选项。

sudo firewall-cmd --zone=external --add-forward-port=port=80:proto=tcp:toport=8080命令将流量从端口80转发到同计算机内的8080端口。在同一计算机内可以省略toaddr选项。

sudo firewall-cmd --zone=external  --add-forward-port=port=80:proto=tcp:toaddr=10.10.10.2命令将流量从端口80转发到IP地址是10.10.10.2计算机80端口。转发到相同端口可以省略toport选项。

sudo firewall-cmd --zone=external  --add-forward-port=port=80:proto=tcp:toport=8080:toaddr=10.10.10.2命令将流量从端口80转发到IP地址是10.10.10.2计算机的8080端口。

如果要使规则永久生效,请添加--permanent选项。

sudo firewall-cmd --zone=external  --add-forward-port=port=80:proto=tcp:toport=8080

sudo firewall-cmd --zone=external  --add-forward-port=port=80:proto=tcp:toaddr=10.10.10.2

sudo firewall-cmd --zone=external  --add-forward-port=port=80:proto=tcp:toport=8080:toaddr=10.10.10.2

允许SSH/HTTPS/HTTP连接

在以下示例中,如果您正在运行Web服务器,并且您只想允许SSH,HTTP和HTTPS端口传入的流量。我们将展示向你如何配置FirewallD防火墙。

你可以很简单的使用命令将常见的服务添加接口关联的区域即可,如果你没有更改过默认的区域,那么就是public区域。

如果你已经更改接口关联的区域,运行命令sudo firewall-cmd --get-active-zones获取接口关联的区域。然后使用--zone指定接口关联的区域。

完成firewalld防火墙的更改后运行命令sudo firewall-cmd --reload重新加载防火墙立即生效。

最后运行命令sudo firewall-cmd --zone=public --list-all。验证firewalld服务是否添加到public区域。

在列出的信息中services:字段中将会包含ssh,http,https服务。

sudo firewall-cmd --permanent --zone=public --add-service=http
sudo firewall-cmd --permanent --zone=public --add-service=https
sudo firewall-cmd --permanent --zone=public --add-service=ssh
sudo firewall-cmd --reload
sudo firewall-cmd --zone=public --list-all

禁用防火墙

sudo systemctl stop firewalld
sudo systemctl disable firewalld #永久禁用

您已了解如何在CentOS系统上配置和管理FirewallD服务。在限制所有不必要的连接的同时,请确保允许系统正常运行所必需的传入连接。如果您有任何疑问,请在下面发表评论。