正确配置的防火墙是整个系统安全的最重要方面之一。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
/IPv4
和icmp6-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
。
从输出中,我们可以看到eth0
和eth1
接口都使用了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端口。
协议可以是tcp
或udp
。要验证是否已成功添加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命令打开文件。
并在和
标签内更改firewalld服务的简称和描述。您需要更改的最重要的标签是
port
标签,port
标签定义了您要打开的端口号和协议。
在示例中,我们打开UDP协议1900
端口和TCP协议32400
端口。
sudo vim /etc/firewalld/services/plexmediaserver.xml
#以下是文件内容
plexmediaserver
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.
保存文件并退出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服务。在限制所有不必要的连接的同时,请确保允许系统正常运行所必需的传入连接。如果您有任何疑问,请在下面发表评论。