前言
firewalld 是新一 Linux 代防火墙工具,它提供了支持网络 / 防火墙区域 (zone) 定义网络链接以及接口安全等级的动态防火墙管理工具。它也支持允许服务或者应用程序直接添加防火墙规则的接口。在 Linux 历史上已经使用过的防火墙工具包括:ipfwadm、ipchains、iptables。本文介绍一下使用 firewalld 构建 Linux 动态防火墙的方法和使用技巧。Linux 发行版本是 RHEL 7.0。
firewalld 简介
firewalld 提供了支持网络 / 防火墙区域 (zone) 定义网络链接以及接口安全等级的动态防火墙管理工具。它支持 IPv4, IPv6 防火墙设置以及以太网桥接,并且拥有运行时配置和永久配置选项。它也支持允许服务或者应用程序直接添加防火墙规则的接口。以前的 iptables 防火墙是静态的,每次修改都要求防火墙完全重启。这个过程包括内核 netfilter 防火墙模块的卸载和新配置所需模块的装载等。而模块的卸载将会破坏状态防火墙和确立的连接。现在 firewalld 可以动态管理防火墙,firewalld 把 Netfilter 的过滤功能于一身见图 1。
图 1 内核中的防火墙 firewalld 守护进程
firewalld 主要功能
实现动态管理,对于规则的更改不再需要重新创建整个防火墙。
一个简单的系统托盘区图标来显示防火墙状态,方便开启和关闭防火墙。
提供 firewall-cmd 命令行界面进行管理及配置工作。
为 libvirt 提供接口及界面,会在必须的 PolicyKit 相关权限完成的情况下实现。
实现 firewall-config 图形化配置工具。
实现系统全局及用户进程的防火墙规则配置管理。
区域支持。
firewalld 防火墙堆栈示意图见图 2,iptables 服务在 /etc/sysconfig/iptables 中储存配置,而 firewalld 将配置储存在 /usr/lib/firewalld/ 和 /etc/firewalld/ 中的各种 XML 文件里,使用 iptables 的时候每一个单独更改意味着清除所有旧有的规则和从 /etc/sysconfig/iptables 里读取所有新的规则,使用 firewalld 却不会再创建任何新的规则;仅仅运行规则中的不同。因此 firewalld 可以在运行时改变设置而不丢失现行配置。图 5 是 firewalld 防火墙堆栈示意图。
图 2 firewalld 防火墙堆栈示意图
1、安装firewalld命令
# yum install firewalld firewall-config
2、启动服务
# systemctl enable firewalld.service
# systemctl start firewalld.service
3、查看防火墙状态
# systemctl status firewalld
一、区域管理
网络区域简介
通过将网络划分成不同的区域(通常情况下称为 zones),制定出不同区域之间的访问控制策略来控制不同任程度区域间传送的数据流。例如互联网是不可信任的区域,而内部网络是高度信任的区域。以避免安全策略中禁止的一些通信。它有控制信息基本的任务在不同信任的区域。典型信任的区域包括互联网 ( 一个没有信任的区域 ) 和一个内部网络 ( 一个高信任的区域 )。最终目标是提供受控连通性在不同水平的信任区域通过安全政策的运行和连通性模型之间根据最少特权原则。例如:公共 WIFI 网络连接应该不信任,而家庭有线网络连接就应该完全信任。网络安全模型可以在安装、初次启动和首次建立网络连接时选择初始化。该模型描述了主机所联的整个网络环境的可信级别,并定义了新连接的处理方式。在 /etc/firewalld/ 的区域设定是一系列可以被快速执行到网络接口的预设定。有几种不同的初始化区域:
drop(丢弃)
任何接收的网络数据包都被丢弃,没有任何回复。仅能有发送出去的网络连接。
block(限制)
任何接收的网络连接都被 IPv4 的 icmp-host-prohibited 信息和 IPv6 的 icmp6-adm-prohibited 信息所拒绝。
public(公共)
在公共区域内使用,不能相信网络内的其他计算机不会对您的计算机造成危害,只能接收经过选取的连接。
external(外部)
特别是为路由器启用了伪装功能的外部网。您不能信任来自网络的其他计算,不能相信它们不会对您的计算机造成危害,只能接收经过选择的连接。
dmz(非军事区)
用于您的非军事区内的电脑,此区域内可公开访问,可以有限地进入您的内部网络,仅仅接收经过选择的连接。
work(工作)
用于工作区。您可以基本相信网络内的其他电脑不会危害您的电脑。仅仅接收经过选择的连接。
home(家庭)
用于家庭网络。您可以基本信任网络内的其他计算机不会危害您的计算机。仅仅接收经过选择的连接。
internal(内部)
用于内部网络。您可以基本上信任网络内的其他计算机不会威胁您的计算机。仅仅接受经过选择的连接。
trusted(信任)
可接受所有的网络连接。
说明:firewalld 的缺省区域是 public。
显示支持的区域列表
# firewall-cmd –get-zones
block drop work internal external home dmz public trusted
设置家庭区域
# firewall-cmd –set-default-zone=home
设置当前区域
#firewall-cmd –get-active-zones
设置当前区域的接口
#firewall-cmd –get-zone-of-interface=enp03s
显示所有公共区域
# firewall-cmd –zone=public –list-all
临时修改网络接口 enp0s3 为 内部区域(internal)
# firewall-cmd –zone=internal –change-interface=enp03s
永久修改网络接口 enp0s3 为 内部区域(internal)
# firewall-cmd –permanent –zone=internal –change-interface=enp03s
二、服务管理
显示服务列表
amanda、ftp、samba、tftp等最重要的服务已被Firewalld提供相应的服务,可以使用命令查看:
# firewall-cmd –get-services
cluster-suite pop3s bacula-client smtp ipp radius
bacula ftp mdns samba dhcpv6-client https
openvpn imaps samba-client http dns telnet libvirt
ssh ipsec ipp-client amanda-client tftp-client nfs tftp libvirt-tls
允许ssh服务通过
#firewall -cmd –enable service=ssh
禁止ssh服务通过
#firewall -cmd –disable service=ssh
临时允许samba服务通过600秒
#firewall -cmd –enable service=samba –timeout=600
显示当前服务# firewall-cmd –list-services
dhcpv6-client ssh
添加http服务到内部区域(internal)
# firewall-cmd –permanent –zone=internal –add-service=http
# firewall-cmd – reload
将一个服务加入到分区,例如允许SMTP接入工作区:
# firewall-cmd –zone=work –add-service=smtp
# firewall-cmd –reload
从一个分区移除服务
要从分区移除服务,例如移除SMTP服务:
# firewall-cmd –zone=work –remove-service=smtp
# firewall-cmd –reload
三、端口管理及给防火墙规则配置富规则(Rich Language)
打开内部区域的端口443/tcp
# firewall-cmd –zone=internal –add-port=443/tcp
# firewall-cmd – reload
端口转发
# firewall-cmd –zone=external –add-masquerade
# firewall-cmd –zone=external –add-forward-port=port=22:proto=tcp:toport=3777
上面意思是首先启用伪装(masquerade),然后把外部区域(external)的22端口转发到3777.
直接接口设置firewalld有一个被称为“direct interface”直接接口,他可以直接通过iptables、ip6tables、ebtables的规则。他适用应用程序,而不是用户。firewalld保持对所增加项目的追踪,所以还能质询firewalld 和发现使用直接端口模式程序造成的更改。直接端口由增加 –direct 选项到firewall-cmd 命令来使用。直接端口模式使用于服务或者程序,以便在运行时间内增加特定的防火墙规则。这些规则不是永久性的,他每次需要通过D-BU S从firewall接到启动、重新启动和重新加载信息后的运用。例如添加端口 tcp 9999端口。
#firewall-cmd –direct –add-rule ipv4 filter INPUT 0 -p tcp –dport 9000 -j ACCEPT
#firewall-cmd – reload
给复杂防火墙规则配置富规则(Rich Language)
通过“rich language” 语法,可以用比直接接口方式更易理解的方式建立复杂防火墙规则。此外还能永久保留设置。这种语言可以用来配置分区,也仍然支持现行的配置方式。所有命令都必须以root 身份运行,增加一项规则的命令格式如下:
#firewall-cmd [–zone=zone] –add-rich-rule=’rule’ [–timeout 9=seconds]
移除一项规则:
firewall-cmd [–zone=zone] –remove-rich-rule=’rule’
检查一项规则是否存在:
firewall-cmd [–zone=zone] –query-rich-rule=’rule’
举个例子假如设一个ip(192.168.0.1)的服务器配置防火墙允许加入以下服务 http, https, vnc-server, PostgreSQL。
# firewall-cmd --add-rich-rule 'rule family="ipv4" source address="192.168.0.1/24" service name="http" accept' # firewall-cmd --add-rich-rule 'rule family="ipv4" source address="192.168.0.1/24" service name="http" accept' --permanent # firewall-cmd --add-rich-rule 'rule family="ipv4" source address="192.168.0.1/24" service name="https" accept' # firewall-cmd --add-rich-rule 'rule family="ipv4" source address="192.168.0.1/24" service name="https" accept' --permanent # firewall-cmd --add-rich-rule 'rule family="ipv4" source address="192.168.0.1/24" service name="vnc-server" accept' # firewall-cmd --add-rich-rule 'rule family="ipv4" source address="192.168.0.1/24" service name="vnc-server" accept' --permanent # firewall-cmd --add-rich-rule 'rule family="ipv4" source address="192.168.0.1/24" service name="postgresql" accept' # firewall-cmd --add-rich-rule 'rule family="ipv4" source address="192.168.0.1/24" service name="postgresql" accept' --permanent # firewall-cmd --reload
首先假如这里需要建立的服务是RTMP(Real Time Messaging Protocol)实时消息传输协议。该协议基于TCP端口1935.在/etc/firewalld/services/目录中,利用现有的配置文件如 nfs.xml 作为模板。
# cd /etc/firewalld/services/
说明:该目录中存放的是定义好的网络服务和端口参数 ,只用于参考,不能修改。这个目录中定义一部分通用网络服务。在该目录中没有定义的网络服务,也不必增加相关 cml定义,后续通过管理命令可以直接增加。
# cp /usr/lib/firewalld/services/nfs.xml /etc/firewalld/services/
说明:从上面目录中将需要使用的服务的 xml 文件拷贝这个目录中,如果端口有变化可以修改参数
# cd /etc/firewalld/services/
下面修改 nfs.xml 为 rtmp.xml
#mv nfs.xml rtmp.xml
下面使用 vi 编辑器修改 rtmp.xml 文件为如下内容
清单1.rtmp.xml 文件内容
<?xml version=”1.0″ encoding=”utf-8″?>
<service>
<short>rtmp services</short>
<description>RTMP Stream </description>
<port protocol=”tcp” port=”1935″/>
</service>
每一个服务定义都需要一个简短的名字、描述和端口网络用于指定需要使用的协议、端口和模块名。然后把此服务加入防火墙规则中。
# firewall-cmd –add-service=rtmp
# firewall-cmd –add-service=rtmp –permanent
# firewall-cmd – reload
关闭 firewalld 服务
您也可以关闭目前还不熟悉的 Firewalld 防火墙,使用老的 iptables,步骤如下:
#systemctl stop firewalld
# systemctl disable firewalld
# yum install iptables-services
# systemctl start iptables
# systemctl enable iptables