firewalld 的作用是为包过滤机制提供匹配规则(或称为策略),通过各种不同的规则,告诉 netfilter对来自指定源、前往指定目的或具有某些协议特征的数据包采取何种处理方式,并且拥有两种配置模式:运行时配置与永久配置
- 内核态:netfilter
- 用户态:iptables、firewalld
-
- firewalld 白身并不具备防火墙的功能,而是和 iptables 一样需要通过内核的 netfilter 来实现。也就是说 firewalld 和 iptables 一样,他们的作用都是用于维护规则,而真正使用规则干活的是内核的 netfilter,只不过 firewalld 和iptabes 的结构以及使用方法不一样
- 系统提供了图形化的配置工具 firewall-config、system-config-firewal,提供命令行客户端 firewall-cmd,用于配置 firewalld 永久性或非永久性运行时间的改变:它依次用 iptables工具与执行数据包筛选的内核中的 Netfilter通信
- firewalld与iptables service 的区别
- iptables service 在 /etc/sysconfig/iptables 中储存配置,而 firewalld 将配置储存在/usr/lib/firewalld! 和 /etc/firewalld! 中的各种 XML 文件里
- 使用iptables service每一个单独更改意味着清除所有旧有的规则和从/etc/sysconfig/iptables 里读取所有新的规则,然而使用 firewald 却不会再创建任何新的规则
一、Firewalld网络区域
- firewalld 将所有的网络数据流量划分为多个区域,从而简化防火墙管理,根据数据包的源 IP地址或传入网络接口等条件,将数据流量转入相应区域的防火墙规则,对于进入系统的数据包,首先检查的就是其源地址
- 若源地址关联到特定的区域,则执行该区域所制定的规则
- 若源地址未关联到特定的区域,则使用传入网络接口的区域并执行该区域所制定的规则
- 若网络接口未关联到特定的区域,则使用默认区域并执行该区域所制定的规则
- 默认区域不是单独的区域,而是指向系统上定义的某个其他区域,默认区域是 public,但是系统管理员可以更改默认区域
区域 |
说明 |
trusted(信任区域) |
可接收所有的网络连接 |
public(公共区域) |
除非与传出流量相关,或与ssh 或 dhcpv6-client 预定义服务匹配,否则拒绝流量传入,在公共区域内,不能相信网络内的其他计算机不会对计算机造成危害,只能接收经过选择的连接。并且,该区域是新添加网络接口的默认区域 |
work(工作区域) |
除非与传出流量相关,或与 ssh、ipp-client、dhcpv6-client 预定义服务匹配,否则拒绝流量传入,用于工作区。相信网络内的其他计算机不会危害计算机,仅接收经过选择的连接 |
home(家庭区域) |
除非与传出流量相关,或与ssh、ipp-client、mdns、samba-client、dhcpv6-client 预定义服务匹配,否则拒绝流量传入,用于家庭网络。信任网络内的其他计算机不会危害计算机,仅接收经过选择的连接 |
internal(内部区域) |
除非与传出流量相关,或与ssh、ipp-client、mdns、samba-client、dhcpv6-client 预定义服务匹配,否则拒绝流量传入,用于内部网络。信任网络内的其他计算机不会危害计算机,仅接收经过选择的连接 |
external(外部区域) |
除非与传出流量相关,或与ssh预定义服务匹配,否则拒绝流量传入。通过此区域转发的IPv4 传出流量将进行地址伪装,可用于为路由器启用了伪装功能的外部网络 |
dmz(隔离区域也称为非军事区域) |
除非与传出的流量相关,或与ssh预定义服务匹配,否则拒绝流量传入 |
block(限制区域) |
除非与传出流量相关,否则拒绝所有传入流量 |
drop(丢弃区域) |
除非与传出流量相关,否则丢弃所有传入流量,并且不产生包含ICMP(InternetControl Message Protocol,互联网控制报文协议)的错误响应 |
二、Firewalld防火墙的配置方法
- 在 CentOS7 系统中,可以使用三种方式配置 firewalld 防火墙:
- firewall-config 图形工具
- 运行时:添加的策略立即生效,不用重载或重启防火墙,策略临时存在
- 永久时:策略需要重载或重启后才能生效,策略永久存在
- firewall-cmd 命令行工具
- /etc/firewalld/中的配置文件
- firewall-config 图形工具
1:firewall-config 图形工具(区域)
firewall-config 图形化配置工具支持防火墙所有的特性,系统管理员可以通过它来改变系统或用户策略,可以实现配置防火墙允许通过的服务、端口、伪装、端口转发、ICMP 过滤器等功能,在 CentOS7 系统中单击“应用程序”中的“杂项”,选择“防火墙"即可
- “区域”选项卡是一个主要设置的界面。“区域”选项卡下面还包含服务、端口、协议、源端口、伪装等一系列子选项卡
- firewall-config 工作界面主要分为三个部分,上面是主菜单,中间是配置选项,下面是区域、服务、IPsets、ICMP 类型、直接配置、锁定白名单设置选项卡
- 其中,ICMP 类型直接配置和锁定白名单选项卡只在从“査看"下拉菜单中选择之后才能看见
- 最底部是状态栏从左到右显示了四个信息,依次是连接状态、默认区域、锁定状态、应急模式
- firewall-config 主菜单包括四个菜单项:文件、选项、查看、帮助。其中,“选项”菜单是最重要的
- 重新加载防火墙:重新加载防火墙规则,当前的永久配置将变成新的运行时配置。例如,所有的当前运行的配置规则如果没有在永久配置中操作,系统重新加载后就会丢失。更改连接区域:更改网络连接的所属区域和接口
- 改变默认区域:更改网络连接的默认区域
- 应急模式:表示丢弃所有的数据包
- 锁定:可以对防火墙的配置进行加锁,只允许白名单上的应用程序进行修改
- firewall-config 主菜单包括四个菜单项:文件、选项、查看、帮助。其中,“选项”菜单是最重要的
(1):“服务”子选项卡
“服务”子选项卡可以定义区域中哪些服务是可信的,可信的服务可以被绑定到该区域的任意连接、接口和源地址访问
(2):“端口”子选项卡
用于设置允许访问的主机或网络访问的端口范围
(3):“协议”子选项卡
用于添加所有主机或网络均可访问的协议
(4):“源端口"子选项卡
添加额外的源端口或范围,连接到这台主机的所有主机或网络均可访问,设置源端口时,可以设置某一个端口号或者是端口范围,同时还需要选择对应的 TCP 或 UDP 协议
(5):“伪装"子选项卡
用于把私有网络地址映射到公有的IP地址,该功能目前只适用于IPv4
(6):“端口转发"子选项卡
将指定端口映射到另一个端口或其他主机的指定端口,在设置端口转发时同样需要选择协议类型,且该功能也仅支持IPv4
(7):“ICMP"子选项卡
ICMP 主要用于在联网的计算机间发送出错信息,但也发送类似 ping 请求以及回应等信息。在“ICMP 过滤器”子选项卡中可以选择应该被拒绝的ICMP 类型,其他所有的ICMP 类型则被允许通过防火墙;默认设置是没有限制
2:firewall-config 图形工具(服务)
服务是端口、协议、模块和目标地址的组合,并且“服务"选项卡只能在“永久”配置视图中修改,“运行时”配置中的服务是不可以修改的,与“区域”选项卡不同,“服务”选项卡仅包含五个子选项卡。其中,“端口”“协议"“源端口”这些子选项卡的作用及配置方法与“区域”选项卡中的相同
(1):“模块”子选项卡
用于网络过滤的辅助模块
(2):“目标地址”子选项卡
如果某服务指定了目标地址,服务项目仅限于目标地址和类型如果 IPv4 与 IPv6 均为空,则没有限制
3:修改默认分区
要设定一个将要被分配新接口的分区作为默认值,则启动firewall-config,从菜单栏选择选项卡,由下拉菜单中选择修改默认区域
Firewalld防火墙(二)
一、Firewalld中理解直接规则
将 iptables 的规则插入到 firewalld 的管理区域中,这种方式写的规则叫直接规则
//举例:
//首先自定义一个叫 blacklist 的链,然后将所有来自 192.168.10.0/24 的数据包都指向了这个链,最后定义了这个链的规则:
首先进行记录,然后drop,记录的方法是使用“blacklisted:"前缀并且限制 1分钟记录一次
(1)创建一个黑名单,并为这个黑名单创建一个链,链名为 blacklist
[root@localhost ~]# firewall-cmd --direct --permanent --add-chain ipv4 raw blacklist
(2)将来自 192.168.10.0/24 的数据包指向这个链
[root@localhost ~]# firewall-cmd --direct --permanent --add-rule ipv4 raw PREROUTING 0 -s 192.168.10.0/24 -j blacklist
(3)每分钟记录一次日志(-m limit --limit 1/min 每分钟记录一次日志)
[root@localhost ~]# firewall-cmd --direct --permanent --add-rule ipv4 raw blacklist 0 -m limit --limit 1/min -jLoG --log-prefix "blacklisted"
(4)设置这个链的规则为 DROP
[root@localhost ~]# firewall-cmd --direct --permanent --add-rule ipv4 raw blacklist 1 -j DROP
(5)重启 firewalld(重启或重载后生效)
[root@localhost ~]# systemctl restart firewalld
(6)查看直接规则
[root@localhost ~]# cat /etc/firewalld/direct.xml
<?xml version="1.0" encoding="utf-8"?>
<direct>
<chain table="raw" ipv="ipv4" chain="blacklist"/>
<rule priority="0" table="raw" ipv="ipv4"chain="PREROUTING">-S 192.168.10.0/24 -j
blacklist</rule>
<rule priority="1" table="raw" ipv="ipv4" chain="blacklist">-j DROP</rule>
</direct>
备注:用其他主机 ping 它,然后査看 messages 日志文件,会看到相关的日志条目
清空直接规则:/etc/firewalld/direct.xml
- Ipv4:这个属性非常简单,表示ip 的版本
- table:chain 和 rule 节点中的 table 属性就是 iptables/ip6tables 中的 table
- chain:chain 中的 chain 属性用于指定一个自定义链的名字,注意,不可与己有链重名;rule 中的 chain 属性既可以是内建的(也就是 iptables/ip6tables 中的五条链),也可以是在 direct中自定义的 chain
- priority:优先级,用于设置不同rule 的优先级,就像iptables 中规则的前后顺序,数字越小优先级越高
- args: rule 和 passthrough 中的 args 就是 iptables/ip6tables 中的一条具体的规则,不过他们可以使用我们自定义的 chain
二、使用富语言
不需要使用 iptables 语法,而是使用高级语言配置防火墙规则的机制成为富语言
//举例:
(1)为认证报头协议 AH 使用新的 IPv4 和 IPv6 连接
[root@localhost ~]# firewall-cmd --add-rich-rule='rule protocol value=ah accept'
(2)允许新的IPv4和IPv6 连接 http,并使用审核每分钟记录一次
[root@locahost ~l# firewall-cmd --add-rich-rule='rule service name=http log prefix=httpaccess limit value=1/m audit accept'
//开启日志记录后:[root@localhost ~]# cat /var/log/messages
(3)允许来自 192.168.0.0/24 地址的 TFTP 协议的IPv4 连接,并且使用系统日志每分钟记录一次
[root@locahost ~]# firewall-cmd --add-rich='rule family="ipv4" source address="192.168.0.0/24'service name="tftp" log prefix="tftp" level="info" limit value="1/m" accept'
(4)为 RADIUS 协议拒绝所有来自 1:2:3:4:6::的新的IPv6 连接,日志前缀为“dns”,级别为info,并每分钟最多记录3次。接受来自其他发起段新的IPv6 连接
[root@locahost ~]# firewall-cmd --add-rich-rule='rule family="ipv6" source address="1:2:3:6::service name="raduis" log prefix="dns" level="info" limit value="3/m" reject'
(5)将源 192.168.2.2地址加入白名单,以允许来自这个源地址的所有连接
[]oot@localhost~]#firewall-cmd --add-rich-rule='rule family="ipv4" sourceaddress="192.168.2.2" accept'
(6)拒绝(删除)来自 public 区域中 IP 地址为 192.168.0.11 的所有流量
root@localhost ~# firewall-cmd --zone=public --add-rich-rule='rule family=ipv4 sourceaddress=192.168.10.202/32 reject'
root@localhost ~# firewall-cmd --zone=public --remove-rich-rule='rule family=ipv4 sourceaddress=192.168.10.202/32 reject'
(7)丢弃来自默认区域中任何位置的所有传入的ipsecesp 协议包
[root@localhost ~]# firewall-cmd --add-rich-rule='rule protocol value="esp" drop'
(8)在 192.168.1.0/24 子网的 dmz 区域中,接收端口 7900--1905 的所有 TCP 包
[root@localhost ~]#firewall-cmd --zone=dmz -add-rich-rule='rule family=ipv4 sourceaddress=192.168.1.0/24 port port=7900-1905 protocol=tcp accept'
(9)接受从 work 区域到 ssh 的新连接,以 notice 级别且每分钟最多三条信息的方式将新连接记录到 syslog
[root@localhost ~# firewall-cmd --zone=work --add-rich-rule='rule service name=ssh logprefix="ssh" level="notice" limit value="3/m" accept'
(10)在接下来的 5min 内,拒绝从默认区域中的子网 192.168.2.0/24 到 DNS 的新连接,并且拒绝的连接将记录到 audit 系统,且每小时最多一条消息
[root@localhost ~]# firewall-cmd --add-rich-rule='rule family=ipv4 sourceaddress=192.168.2.0/24 service name=dns audit limit value="1/h" reject' --timeout=300