一、firewalld简介
firewalld防火墙是Linux系统上的一种动态防火墙管理工具,它是Red Hat公司开发的,并在许多Linux发行版中被采用。相对于传统的静态防火墙规则,firewalld使用动态的方式来管理防火墙规则,可以更加灵活地适应不同的网络环境和应用场景。
firewalld防火墙是Centos7系统默认自带的防火墙管理工具,取代了之前的iptables防火墙工具,它工作在网络层,主要功能是管理网络连接和防止未经授权的访问。它可以对入站和出站流量进行管理,可以控制端口、服务和网络协议的访问权限,也支持NAT和端口转发等高级功能,属于包过滤防火墙。
firewalld防火墙采用了D-Bus接口来与网络管理器和其他应用程序进行通信,这使得它可以更加灵活地适应不同的网络环境和应用场景。例如,当一个新的网络接口被添加到系统中时,firewalld可以接收到相关的通知,并自动更新防火墙规则以适应新的网络环境。
firewalld防火墙还提供了支持网络区域所定义的网络连接以及接口安全等级的动态防火墙管理工具。它支持IPv4、IPv6防火墙设置以及以太网桥(在某些高级服务可能会用到,比如云计算〉,并且拥有两种配置模式:运行时配置与永久配置。
二、firewalld与iptables之间的关系
firewalld和liptables都是用来管理防火墙的工具(属于用户态),它们都可以用来定义防火墙的各种规则功能,内部结构都指向netfiter网络过滤子系统(属于内核态),从而实现包过滤防火墙功能。
(一)两者基于方式不同
1、iptables主要是基于接口来设置规则,从而实现网络的安全性。
2、firewalld是基于区域,根据不同的区域来设置不同的规则,从而保证网络的安全。与硬件防火墙的设置相类似。
(二)配置文件不同
1、iptables 将配置存储在/etc/sysconfig/iptables ;
2、firewalld将配置储存在/etc/firewalld,优先加载该配置文件,同时/usr/lib/firewalld中的各种xml文件是默认的配置文件。
(三)对防火墙规则修改不同
1、iptables对于规则的修改需要全部刷新策略,每一个单独更改意味着清除所有旧有的规则和从/etc/sysconfig/iptables里读取所有新的规则。
2、firewalld对于规则的修改无需全部刷新策略,因为它不会再创建任何新的规则,仅仅运行规则中的不同之处。因此firewalld可以在运行时间内,改变设置而不丢失现行连接。
(四)防火墙类型不同
1、iptables防火墙类型为静态防火墙。可以理解为iptables的规则就是一张表,对表进行增删改查操作。
2、firewalld防火墙类型为动态防火墙。可以理解为firewalld的规则是一块区域,可以更换不同的区域进行增删改查操作。
(五)firewalld相对于iptables优势
1、firewalld可以动态修改单条规则,而iptables在修改了规则后必须得全部刷新才可以生效。
2、firewalld在使用上要比iptables更加人性化了,即使对于不明白防火墙的"四表五链",对于TCP/IP协议也不熟悉的情况下,也可以实现大部分管理功能。
三、firewalld常见概念
(一)firewalld区域概念
firewalld防火墙为了简化方便管理,将所有网络流量分为多个区域(zone)。然后根据数据包的源IP地址或传入的网络接口等条件将流量传入相应区域。每个区域都定义了自己打开或者关闭的端口和服务列表。
(二)firewalld预定义区域概念
1、区域如同进入主机的安全门,每个区域都具有不同限制程度的规则,只会允许符合规则的流量传入。
2、可以根据网络规模,使用一个或多个区域,但是任何一个活跃区域至少需要关联源地址或接口。
3、默认情况下,public区域是默认区域,包含所有接口(网卡)。
最终一个区域的安全程度是取决于管理员在此区域中设置的规则。
值得注意: 如果数据包的源地址与区域绑定,则此数据包不管从那个网卡传入都使用改区域的规则过滤数据包。如果数据包的源地址未与区域绑定,则此数据从哪个网卡传入则使用该网卡绑定的区域规则过滤数据包。
(三)常见区域及含义
**1、信任区域trusted:**允许所有的流量传人;
**2、公共区域public:**默认允许与ssh或dhcpv6-client预定义服务匹配的传入流量,其余均拒绝,是新添加网络接口的默认区域。
**3、外部区域external:**默认允许与ssh预定义服务匹配的传入流量,其余均拒绝。默认将通过此区域转发的IPv4传出流量将进行地址伪装(MASQUERADE),可用于为路由器启用了伪装功能的外部网络。
**4、家庭区域home:**默认允许与ssh、mdns、samba-client或dhcpv6-client预定义服务匹配的传入流量,其余均拒绝。
**5、内部区域internal:**默认值时与home区域功能相同。
**6、工作区域work:**允许与 ssh、dhcpv6-client预定义服务匹配的传入流量,其余均拒绝。
**7、隔离区域dmz也称为非军事区域:**默认允许与ssh预定义服务匹配的传入流量,其余均拒绝。
**8、限制区域block:**拒绝所有传入流量。
**9、丢弃区域drop:**丢弃所有传入流量,并且不产生包含ICMP的错误响应。
值得注意: 默认情况下的默认区域为public(默认与所有网卡绑定),要激活某个区域,就需要将区域与源地址网卡绑定。
四、firewalld数据包处理过程
(一)firewalld数据处理流程
firewalld对于进入系统的数据包,会根据数据包的源I地址或传入的网络接口等条件,将数据流量转入相应区域的防火靖规则。对于进入系统的数据包,首先捡查的就是其源地址。
(二)firewalld检查数据包的源地址的规则
1、若源地址关联到特定的区域(即源地址或接口绑定的区域有冲突),则执行该区域所制定的规则。
2、若源地址未关联到特定的区域(即源地址或接口绑定的区域没有冲突〉,则使用传入网络接口的区域并执行该区域所制定的规则。
3、若网络接口也未关联到特定的区域(即源地址或接口都没有绑定特定的某个区域),则使用默认区域并执行该区域所制定的规则。
针对以上数据包处理流程总结为:先检查传入数据包的源地址,若源地址与特定区域绑定,则使用该区域的规则过滤数据包。若源地址与特定区域没有绑定,且数据包传入网卡与特定区域绑定,则使用绑定网卡的区域的规则过滤数据包。若也没有区域绑定网卡,则使用默认区域的规则过滤数据包。
五、firewalld防火墙安装及其语法
firewalld在centos7中已经自带安装了,所以不需要我们再另外安装。至于其它发行版本的Linux系统,大家可以自行去了解相关Linux版本自带firewalld的情况,这里不展开,以下相关操作均在centos7下进行。
1、centos7下可以通过yum方式安装firewalld
yum install firewalld firewall-config
2、启动firewalld服务
systemctl start firewalld
3、关闭firewalld服务
systemctl stop firewalld
4、将firewalld设置为开机自启动
systemctl enable firewalld
5、将firewalld禁用开机自启动
systemctl disable firewalld
6、查看firewalld工作状
systemctl status firewalld
或
firewall-cmd --state
(一)firewalld命令格式
1、命令格式
firewall-cmd [选项参数 ... ]
(1)选项参数
1)常见通用选项参数
-h, --help # 显示帮助信息;-V, --version # 显示版本信息. (这个选项不能与其他选项组合);-q, --quiet # 不打印状态消息;
2)常见状态选项参数
--state # 显示firewalld的状态;--reload # 不中断服务的重新加载;--complete-reload # 中断所有连接的重新加载;--runtime-to-permanent # 将当前防火墙的规则永久保存;--check-config # 检查配置正确性;
3)日志选项参数
--get-log-denied # 获取记录被拒绝的日志;--set-log-denied=<value> # 设置记录被拒绝的日志,只能为 'all','unicast','broadcast','multicast','off' 其中的一个;
(二)firewalld命令常见选项参数
可以通过firewall-cmd --help查看firewalld具体参数用法,以下罗列常见参数:
**1、-h,--help:**显示帮助信息;
**2、-V,--version:**显示版本信息;
**3、-q,--quiet:**不打印状态信息;
**4、--state:**显示firewalld的状态;
**5、--reload:**不中断服务的重新加载;
**6、--complete-reload:**中断所有连接的重新加载;
**7、--runtime-to-permanent:**将当前防火墙的规则永久保存;
8、--check-config: 检查配置正确性;
**9、--get-default-zone:**显示当前默认区域;
10、--set-default-zone=<zone> **:**设置默认区域;
**11、--get-active-zones:**显示当前正在使用的区域及其对应的网卡接口
**12、--get-zones :**显示所有可用的区域;
**13、--get-zone-of-interface=<interface>:**显示指定接口绑定的区域;
**14、--zone=<zone> --add-interface=<interface>:**为指定接口绑定区域;
**15、--zone=<zone> --change-interface=<interface>:**为指定的区域更改绑定的网络接口;
**16、--zone=<zone> --remove-interface=<interface>:**为指定的区域删除绑定的网络接口;
**17、--list-all-zones :**显示所有区域及其规则;
**18、[--zone=<zone>] --list-all :**显示所有指定区域的所有规则,省略--zone=<zone>时表示仅对默认区域操作;
**19、[--zone=<zone>] --list-services :**显示指定区域内允许访问的所有服务;
**20、[--zone=<zone>] --add-service=<service> :**为指定区域设置允许访问的某项服务;
**21、[--zone=<zone>] --remove-service=<service> :**删除指定区域已设置的允许访问的某项服务;
**22、[--zone=<zone>] --list-ports :**显示指定区域内允许访问的所有端口号;
23、为指定区域设置允许访问的某个/某段端口号(包括协议名);
[--zone=<zone>] --add-port=<portid>[-<portid>]/<protocol>
24、删除指定区域已设置的允许访问的端口号(包括协议名);
[--zone=<zone>] --remove-port=<portid>[-<portid>]/<protocol>
25、[--zone=<zone>] --list-icmp-blocks:显示指定区域内拒绝访问的所有 ICMP 类型;
**26、[--zone=<zone>] --add-icmp-block=<icmptype> :**为指定区域设置拒绝访问的某项 ICMP 类型;
**27、[--zone=<zone>] --remove-icmp-block=<icmptype> :**删除指定区域已设置的拒绝访问的某项ICMP类型;
**28、 --get-icmptypes :**显示所有 ICMP 类型;
六、firewalld配置常用命令列举
以下罗列出平时运维工作常用的一些规则添加命令,方便大家参考学习。这里需要注意点;
firewalld可以通过两种方式控制端口的开放,一种是通过指定端口号,另一种是指定服务名。例如开放mysql服务就是开放了对应3306端口,但是不能通过端口号来关闭,也就是说通过指定服务名开放的就要通过指定服务名关闭;通过指定端口号开放的就要通过指定端口号关闭。还有一个要注意的就是指定端口的时候一定要指定是什么协议,tcp还是udp。
1、查看firewalld版本号信息
firewall-cmd --version
2、查看firewalld命令使用帮助信息
firewall-cmd --help
3、查看firewalld工作状态
firewall-cmd --state
4、查看firewalld区域信息
firewall-cmd --get-active-zones
5、查看指定接口所属区域
firewall-cmd --get-zone-of-interface=ens33
6、拒绝所有包
firewall-cmd --panic-on
7、查看是否拒绝
firewall-cmd --query-panic
8、取消拒绝状态
firewall-cmd --panic-off
9、将接口添加到区域,默认接口都在public
firewall-cmd --zone=public --add-interface=ens33
10、加入一个端口到指定区域
firewall-cmd --zone=dmz --add-port=8080/tcp
11、更新防火墙规则
firewall-cmd --complete-reload
12、设置默认接口区域,立即生效无需重启
firewall-cmd --set-default-zone=public
13、设置为家庭区域
firewall-cmd --set-default-zone=home
14、查看所有打开的端口
firewall-cmd --zone=dmz --list-ports
15、显示支持的区域列表
firewall-cmd --get-zones
16、查看显示当前正在使用的区域及其对应的网卡接口
firewall-cmd --get-active-zones
17、设置当前区域的接口
firewall-cmd --get-zone-of-interface=ens33
18、显示所有公共区域(public)
firewall-cmd --zone=public --list-all
19、临时修改网络接口ens33为内部区域(internal);
firewall-cmd --zone=internal --change-interface=ens33
20、永久修改网络接口ens33为内部区域(internal)
firewall-cmd --permanent --zone=internal --change-interface=ens33
21、显示服务列表
firewall-cmd --get-services
22、禁止ssh服务通过
firewall-cmd --delete-service=ssh
23、开放ssh服务通过
firewall-cmd --new-service=ssh
24、查看显示当前服务
firewall-cmd --list-services
25、添加http服务到内部区域(internal)
firewall-cmd --permanent --zone=internal --add-service=http
26、打开tcp的8090端口
firewall-cmd --enable ports=8090/tcp
27、临时允许Samba服务通过300秒
firewall-cmd --enable service=samba --timeout=300
28、打开8090/TCP端口
firewall-cmd --add-port=8090/tcp
29、永久打开8090/TCP端口
firewall-cmd --permanent --add-port=8090/tcp
30、开放mysql服务对应的端口
firewall-cmd --add-service=mysql
31、阻止mysql服务对应的端口
firewall-cmd --remove-service=mysql
32、开放通过tcp访问3306端口
firewall-cmd --add-port=3306/tcp
33、开放通过udp访问234端口
firewall-cmd --add-port=234/udp
34、查看开放的端口
firewall-cmd --list-ports
35、阻止通过tcp访问3306端口
firewall-cmd --remove-port=3306/tcp
36、显示所有的icmp类型
firewall-cmd --get-icmptypes
37、为指定区域设置拒绝访问的某项icmp 类型
firewall-cmd --add-icmp-block=echo-request
38、显示指定区域内拒绝访问的所有 icmp 类型
firewall-cmd --list-icmp-blocks
39、为指定区域设置拒绝访问的某项 icmp 类型
firewall-cmd --add-icmp-block=destination-unreachable
40、删除指定区域已设置的拒绝访问的某项icmp类型
firewall-cmd --remove-icmp-block=destination-unreachable
41、检查是否允许伪装IP
firewall-cmd --query-masquerade
42、允许防火墙伪装IP
firewall-cmd --add-masquerade
43、禁止防火墙伪装IP
firewall-cmd --remove-masquerade
44、将8888端口的流量转发至80端口
firewall-cmd --add-forward-port=port=8888:proto=tcp:toport=80
45、将8888端口的流量转发至192.168.20.232的80端口
firewal-cmd --add-forward-port=port=8888: proto=tcp:toaddr=192.168.20.232:toport=80
46、将8888端口的流量转发至192.168.20.232
firewall-cmd --add-forward-port=port=8888:proto=tcp:toaddr=192.168.20.232
七、总结
大家都知道,防火墙规则众多并且繁杂,我们不可能罗列完它的每一条添加命令,更不可能死记硬背它的每一条规则。但是我们可以通过掌握其添加规则语法,用到时方便查阅添加即可。