RedhatEnterprise Linux7 已经默认使用firewalld 作为防火墙,其使用方式已经变化。基于 iptables 的防火墙被默认不启动,但仍然可以继续使用。
RHEL7 中有几种防火墙共存:firewalld、iptables、ebtables等,默认使用 firewalld 作为防火墙,管理工具是firewall-cmd。使用 firewalld 来管理netfilter,不过底层调用的命令仍然是 iptables等。
因为这几种 daemon 是冲突的,所以建议禁用其他几种服务。
查看防火墙几种服务的运行状态:
Systemctl status {firewalld,iptables,ip6tables,ebtables}
或
Systemctl is-active firewalld.service
Systemctl is-active iptables.service
Systemctl is-active ip6tables.service
Systemctl is-active ebtables.service
禁用iptables、ip6tables、ebtables防火墙,
Systemctl mask {iptables,ip6tables,ebtables}
RHEL7 虽然有 iptables 但是不建议使用了,使用新的 firewalld 服务。
查看 firewalld 软件包是否安装:
rpm -q firewalld
Firewalld 提供了支持网络/防火墙区域(zone)定义网络链接以及接口安全等级的防火墙管理工具。拥有运行时配置和永久配置选项。它也支持允许服务或者应用程序直接添加防火墙规则的接口。以前的 system-config-firewall 防火墙模型是静态的,每次修改都要求防火墙完全重启。这个过程包括内核 netfilter 防火墙模块的卸载和新配置所需模块的装载等。相反,firewalldaemon 动态管理防火墙,不需要重启整个防火墙便可应用更改。因而也就没有必要重载所有内核防火墙模块了。
什么是区域:网络区域定义了网络连接的可信等级。
数据包要进入到内核必须要通过这些zone中的一个,而不同的zone里定义的规则不一样(即信任度不一样,过滤的强度也不一样)。可以根据网卡所连接的网络的安全性来判断,这张网卡的流量到底使用哪个 zone,比如上图来自 eth0 的流量全部使用 zone1 的过滤规则,eth1的流量使用 zone2。一张网卡同时只能绑定到一个 zone
预定义的服务:服务是端口和/或协议入口的组合。
端口和协议:定义了 tcp 或 udp 端口,端口可以是一个端口或者端口范围。
ICMP 阻塞:可以选择 Internet 控制报文协议的报文。这些报文可以是信息请求亦可是对信息请求或错误条件创建的响应。
伪装:私有网络地址可以被映射到公开的 IP 地址。这是一次正规的地址转换。
端口转发:端口可以映射到另一个端口以及/或者其他主机。
在进行 firewalld 配置之前,首先介绍一下区域(zones)这个概念。默认情况就有一些有效的区域。由 firewalld 提供的区域按照从不信任到信任的顺序排序。
•丢弃区域(Drop Zone):如果使用丢弃区域,任何进入的数据包将被丢弃。这个类似与我们之前使用iptables -j drop。使用丢弃规则意味着将不存在响应。
•阻塞区域(Block Zone):阻塞区域会拒绝进入的网络连接,返回icmp-host-prohibited,只有服务器已经建立的连接会被通过即只允许由该系统初始化的网络连接。
•公共区域(Public Zone):只接受那些被选中的连接,默认只允许 ssh 和 dhcpv6-client。这个 zone 是缺省 zone
•外部区域(External Zone):这个区域相当于路由器的启用伪装(masquerading)选项。只有指定的连接会被接受,即 ssh,而其它的连接将被丢弃或者不被接受。
•隔离区域(DMZ Zone):如果想要只允许给部分服务能被外部访问,可以在 DMZ 区域中定义。它也拥有只通过被选中连接的特性,即 ssh。
•工作区域(Work Zone):在这个区域,我们只能定义内部网络。比如私有网络通信才被允许,只允许ssh,ipp-client 和 dhcpv6-client。
•家庭区域(Home Zone):这个区域专门用于家庭环境。它同样只允许被选中的连接,即 ssh,ipp-client,mdns,samba-client和 dhcpv6-client。
•内部区域(Internal Zone):这个区域和工作区域(Work Zone)类似,只有通过被选中的连接,和 home 区域一样。
•信任区域(Trusted Zone):信任区域允许所有网络通信通过。记住:因为 trusted 是最被信任的,即使没有设置任何的服务,那么也是被允许的,因为trusted 是允许所有连接的
以上是系统定义的所有的 zone,但是这些 zone 并不是都在使用。只有活跃的 zone 才有实际操作意义。
Firewalld 的原则:
如果一个客户端访问服务器,服务器根据以下原则决定使用哪个 zone 的策略去匹配
1.如果一个客户端数据包的源 IP 地址匹配 zone 的 sources,那么该zone 的规则就适用这个客户端;一个源只能属于一个 zone,不能同时属于多个 zone。
2.如果一个客户端数据包进入服务器的某一个接口(如eth0)区配 zone 的interfaces,则么该 zone 的规则就适用这个客户端;一个接口只能属于一个 zone,不能同时属于多个zone。
3.如果上述两个原则都不满足,那么缺省的 zone 将被应用
你可以使用任何一种 firewalld 配置工具来配置或者增加区域,以及修改配置。工具有例如firewall-config这样的图形界面工具, firewall-cmd 这样的命令行工具,或者你也可以在配置文件目录中创建或者拷贝区域文件,/usr/lib/firewalld/zones 被用于默认和备用配置,/etc/firewalld/zones被用于用户创建和自定义配置文件。
命令行工具 firewall-cmd 支持全部防火墙特性,基本应用如下:
应用示例:
1、获取 firewalld 状态
firewall-cmd --state
2、在不改变状态的条件下重新加载防火墙:
firewall-cmd --reload
如果你使用--complete-reload,状态信息将会丢失。
3、获取支持的区域
firewall-cmd --get-zones
这条命令输出用空格分隔的列表
4、获取所有支持的服务
firewall-cmd --get-services
这条命令输出用空格分隔的列表。
服务是 firewalld 所使用的有关端口和选项的规则集合。被启动的服务会在firewalld 服务开启或者运行时自动加载。默认情况下,很多服务是有效的。使用下面命令可列出有效的服务。
想要列出默认有效的服务,也可以进入下面的目录也能够取得。
想要创建自己的服务,需要在下面的目录下定义它。比如,现在我想添加一个 rhmp 服务, 端口号 1935。首先,任选一个服务复制过来。
接下来打开并编辑文件的头部、描述、协议和端口号,以供 RTMP 服务使用,如下图所示。
重启 firewalld 服务或者重新加载设置,以激活这些设置。
# firewall-cmd --reload
为确认服务是否已经启动,运行下面的命令获取有效的服务列表。
# firewall-cmd --get-services
5、获取所有支持的 ICMP类型
firewall-cmd --get-icmptypes
这条命令输出用空格分隔的列表。
6、列出全部启用的区域的特性(即查询当前防火墙策略)
解释:特性可以是定义的防火墙策略,如:服务、端口和协议的组合、端口/数据报转发、伪装、ICMP 拦截或自定义规则等
上面的命令将会列出每种区域如 block、dmz、drop、external、home、internal、public、trusted
以及 work。如果区域还有其它详细规则(rich-rules)、启用的服务或者端口,这些区域信息也会分别被罗列出来
7、输出区域全部启用的特性。如果省略区域,将显示默认区域的信息。
firewall-cmd [--zone=] --list-all
输出指定区域启动的特性
8、查看默认区域
public 区域是默认区域。
在文件/etc/firewalld/firewalld.conf 中定义成 DefaultZone=public。
9、设置默认区域
firewall-cmd --set-default-zone=区域名
流入默认区域中配置的接口的新访问请求将被置入新的默认区域。当前活动的连接将不受影响。
10、获取活动的区域
11、根据接口获取区域即需要查看哪个区域和这个接口绑定即查看某个接口是属于哪个zone的:
firewall-cmd --get-zone-of-interface=接口名
12、将接口(网卡)增加到区域
firewall-cmd [--zone=] --add-interface=接口名
如果接口不属于区域,接口将被增加到区域。如果区域被省略了,将使用默认区域。接口在重新加载后将重新应用。
13、修改接口所属区域
firewall-cmd [--zone=] --change-interface=接口名
这个选项与 --add-interface 选项相似,但是当接口已经存在于另一个区域的时候,该接口将被添加到新的区域。
14、从区域中删除一个接口
firewall-cmd [--zone=] --remove-interface=接口名
注:如果某个接口不属于任何 Zone,那么这个接口的所有数据包使用默认的Zone 的规则
15、查询区域中是否包含某接口
firewall-cmd [--zone=] --query-interface=接口名
如果区域被省略了,将使用默认区域
16、列举区域中启用的服务
firewall-cmd [ --zone= ] --list-services
如果区域被省略了,将使用默认区域查看home 区域中启用服务
17、启用应急模式阻断所有网络连接,以防出现紧急状况
18、禁用应急模式、
Firewall-cmd –panic-off
19、查询应急模式
firewall-cmd --query-panic
其他相关的配置项可以查看firewall-cmd的手册页:#man firewall-cmd