Filewalld概述
Filewalld(动态防火墙)是redhat7系统中变更对于netfilter内核模块的管理工具,以分配对一个网络及其相关链接和界面一定程度的信任。它具备对 IP v4 和 IP v6 防火墙设置的支持。它支持以太网桥 , 并有分离运行时间和永久性配置选择。它还具备一个通向服务或者应用程序以直接增加防火墙规则的接口。
相较于传统的防火墙管理配置工具,firewalld支持动态更新技术并加入了区域(zone)的概念。
简单来说,区域就是firewalld预先准备了几套防火墙策略集合(策略模板),用户可以根据生产场景的不同而选择合适的策略集合。
两层结构
- 核心层 处理配置和后端,如iptables、ip6tables、ebtables、ipset和模块加载器
- 顶层D-Bus 更改和创建防火墙配置的主要方式。所有firewalld都使用该接口提供在线工具
firewalld的9个zone
默认情况下,有以下的区域(zone)可用:
drop – 丢弃所有传入的网络数据包并且无回应,只有传出网络连接可用。
block — 拒绝所有传入网络数据包并回应一条主机禁止的 ICMP 消息,只有传出网络连接可用。
public — 只接受被选择的传入网络连接,用于公共区域。
external — 用于启用了地址伪装的外部网络,只接受选定的传入网络连接。
dmz — DMZ 隔离区,外部受限地访问内部网络,只接受选定的传入网络连接。
work — 非军事区,对于处在你工作区域内的计算机,只接受被选择的传入网络连接。
home — 对于处在你家庭区域内的计算机,只接受被选择的传入网络连接。
internal — 对于处在你内部网络的计算机,只接受被选择的传入网络连接。
trusted — 允许所有的数据包。
不同的区域之间的差异是其对待数据包的默认行为不同,firewalld的默认区域为public
对于一个接受到的请求具体使用哪个zone,firewalld是通过三种方法来判断的:
1、source,也就是源地址 优先级最高
2、interface,接收请求的网卡 优先级第二
3、firewalld.conf中配置的默认zone 优先级最低
这三个的优先级按顺序依次降低,也就是说如果按照source可以找到就不会再按interface去查找,如果前两个都找不到才会使用第三个。
![](/qrcode.jpg)
Firewalld与iptables对比
- firewalld 是 iptables 的前端控制器
- iptables 静态防火墙 任一策略变更需要reload所有策略,丢失现有链接
- firewalld 动态防火墙 任一策略变更不需要reload所有策略 将变更部分保存到iptables,不丢失现有链接
- firewalld 提供一个daemon和service 底层使用iptables
- firewalld自身并不具备防火墙的功能,而是和iptables一样需要通过内核的netfilter来实现
即firewalld和iptables一样,他们的作用都是用于维护规则,而真正使用规则干活的是内核的netfilter,只不过firewalld和iptables的结构以及使用方法不一样罢了。
firewalld的配置模式
firewalld的配置文件以xml格式为主(主配置文件firewalld.conf例外),他们有两个存储位置
1、/etc/firewalld/ 用户配置文件
2、/usr/lib/firewalld/ 系统配置文件,预置文件
管理配置firewalld的三种方法:
(1)图像化的配置工具 firewall-config ;
(2) 命令行工具 firewall-cmd;
(3)直接编辑firewalld的配置文件--xml文件;
命令行配置firewalld
临时配置与永久配置
Firewalld 有两个配置集:“runtime”和“permanent”。
runtime:在系统重新启动或重新启动 Firewalld时,不会保留运行时的配置更改;
permanent: 持久配置集的更改不会应用于正在运行的系统。(重新加载配置可以生效)
默认情况下,firewall--cmd 命令适用于运行时配置,但使用 --permanent 标志将保存到持久配置中。
firewall-cmd --zone=public --add-service=http 运行时配置,重启服务后失效
firewall-cmd --permanent --zone=public --add-service=http 永久配置,不影响当前连接,重启后生效firewall-cmd --permanent --zone=public --remove-service=http 永久删除http服务,重启后生效
firewall-cmd --state ##查看防火墙的状态,有running和not running两种
firewall-cmd --get-zones ##查看所有zone
firewall-cmd --get-default-zone ##查看系统默认zone
firewall-cmd --set-default-zone=work ##设置默认zone为work
firewall-cmd --get-active-zones ##查看当前生效的zone ,即网卡所在的zone
[root@shareserver firewalld]# firewall-cmd --zone=public --list-all ##查看public的域的信息
public (default, active) ##表示该域是默认域,且该域当前处于活跃状态
interfaces: eth0 ##表示该域关联的接口是eth0
sources: ##列出该域的源,此时没有,若存在,格式应为xxx.xxx.xxx.xxx/xx
services: dhcpv6-client ftp http https ##列出允许通过该火墙的服务
ports: 8080/tcp 6666/tcp ##列出允许通过该火墙的目标端口,即对外开放的端口
masquerade: no ##表示这个区域是否允许ip地址伪装,该值yes时该计算机将充当路由器的功能
forward-ports: ##列出转发的端口
icmp-blocks: ##列出阻塞icmp流量的黑名单
rich rules: ##表示在该区域中优先处理的高级配置
firewall-cmd --get-services ##列出系统中用名称表示的服务
firewall-cmd --get-zone-of-interface=eth0 ##查看指定网卡所在zone
firewall-cmd --change-interface=eth0 --zone=trusted ##改变eth0的域
firewall-cmd --remove-interface=eth0 --zone=trusted ##移除网卡eth0
firewall-cmd --add-source=172.25.254.200/24 ##临时添加一个ip源172.25.254.200/24,重启服务后失效
firewall-cmd --permanent --add-source=172.25.254.200/24 ##永久添加一个ip源172.25.254.200/24,重启服务后生效
firewall-cmd --permanent --remove-source=172.25.254.200/24 ##永久移除ip源172.25.254.200/24,重启服务后生效
firewall-cmd --add-port=8080/tcp --zone=public ##临时添加一个端口8080/tcp
实验1:
在防火墙没有允许http服务的前提下,命令设置所有主机可以访问该服务
实验环境:ip为172.25.254.100的服务端
[root@shareserver firewalld]# systemctl start httpd
[root@shareserver firewalld]# firewall-cmd --set-default-zone=trusted ##设置默认zone为trusted
测试环境:ip为172.25.254.200的客户端
此时,服务端的防火墙不用添加允许http的服务,在客户端浏览器上也可以输入看到httpd服务的默认发布文件的内容
实验2:
在防火墙没有允许http服务的前提下,命令设置部分主机可以访问该服务
实验环境:ip为172.25.254.100的服务端
[root@shareserver firewalld]# firewall-cmd --set-default-zone=public
[root@shareserver firewalld]# firewall-cmd --add-source=172.25.254.200 --zone=trusted
测试环境:在ip为172.25.254.200的客户端浏览器上和ip为172.25.254.81的客户端浏览器上分别进行测试,可以看出,除了172.25.254.81的主机之外都无法访问172.25.254.100
实验3:
reload和complete-reload的区别
reload刷新之后不会中端连接,complete-reload刷新之后会中断连接。
利用ssh服务进行实验体现两者的区别
实验环境:
服务端:ip为172.25.254.100的主机,服务端火墙允许ssh服务
客户端:ip为172.25.254.81的主机,使用ssh连上ip为172.25.254.100的主机
服务端设置:
[root@shareserver firewalld]# firewall-cmd --remove-service=ssh --permanent
[root@shareserver firewalld]# firewall-cmd --reload
客户端测试:
之前链接到服务端的shell还可以继续使用
在客户端另外打开一个shell用ssh链接服务端,将被拒绝
在服务端用--complete-reload重启服务时:
[root@shareserver firewalld]# firewall-cmd --complete-reload
重新在客户端测试:
之前链接的也将不能工作,会卡住,不能执行命令
在客户端另外打开一个shell用ssh链接服务端,将被拒绝
reload改变之后的操作不影响之前的操作
complete-reload改变所有操作包括正在运行的(永久性)
实验4:
修改配置文件方式设置防火墙允许服务
[root@shareserver ~]# cd /etc/firewalld/zones/
[root@shareserver zones]# vim public.xml ##编辑配置文件
6 <service name="ssh"/> ##永久添加服务
[root@shareserver zones]# systemctl restart firewalld ##重启服务
实验5:
drop与block的区别
服务端:ip为172.25.254.100的主机
客户端:ip为172.25.254.81的主机
服务端设置:
[root@shareserver zones]# firewall-cmd --zone=block --add-source=172.25.254.81
客户端测试:
[kiosk@foundation81 ~]$ ping 172.25.254.100
block域会拒绝进入的网络连接,返回icmp-host-prohibited(ICMP-主机-禁止),只有服务器已经建立的连接会被通过即只允许由该系统初始化的网络连接。block动作会返回一个拒绝数据包,明确的拒绝对方的连接动作。
服务端设置:
[root@shareserver zones]# firewall-cmd --zone=drop --add-source=172.25.254.81
客户端测试:
[kiosk@foundation81 ~]$ ping 172.25.254.100
drop域中任何接收的网络数据包都被丢弃,没有任何回复。DROP动作只是简单的直接丢弃数据,并不反馈任何回应
特定的规则 direct rules
在linux中想要保证主机的绝对安全以上的策略是远远不够的,还需要一些设定更为复杂、更加具体、更加安全的设定,即特定规则。通过firewall-cmd工具,可以使用--direct选项增加或移除链。直接端口模式适用于服务或者程序,以便在运行时间内增加特定的防火墙规则,直接端口模式添加的规则优先应用。
firewall优先级先去direct规则里查找,如果有则按direct规则运行,如果没有则按默认list-all里的执行(默认允许就可以,没有就不行)
[root@shareserver ~]# firewall-cmd --direct --add-rule ipv4 filter INPUT 1 -p tcp --dport 80 -s 172.25.254.81 -j ACCEPT ##只允许172.25.254.81访问
解释:filter:表 INPUT:列 1:第几行 (先是表再是列) -p:正在使用的协议 --dport:目的地端口 -s:数据来源 -j: 动作 (有3种状态:REJECT 拒绝 ACCEPT 接受 DROP 丢弃)
[root@shareserver ~]# firewall-cmd --direct --get-all-rule ##查看所有规则
[root@shareserver ~]# firewall-cmd --direct --remove-rule ipv4 filter INPUT 1 -p tcp --dport 80 -s 172.25.254.81 -j ACCEPT ##删除该条规则
动作drop和reject的区别:
drop动作相当于是客户端对服务器发送访问请求,服务端产生回应,并拒绝当前的客户端进行访问;而drop动作是客户端对服务器发送请求,但是服务器是不会给予回应的,相当于丢弃;
服务端设置:
[root@shareserver ~]# firewall-cmd --direct --remove-rule ipv4 filter INPUT 1 -p tcp --dport 22 -s 172.25.254.81 -j DROP
客户端测试:
[root@shareserver ~]# firewall-cmd --direct --add-rule ipv4 filter INPUT 1 -p tcp --dport 22 -s 172.25.254.81 -j REJECT
客户端测试:
地址伪装
实验环境:
服务端主机:配置双网卡,ip地址分别为172.25.254.100与1.1.1.100
客户端:ip为1.1.1.200的主机
设置该主机的网关为1.1.1.100
服务端设置:
[root@shareserver network-scripts]# firewall-cmd --add-masquerade --permanent
[root@shareserver network-scripts]# firewall-cmd --reload
客户端测试:
[root@client Desktop]# ping 172.25.254.81 ##可以ping通
[root@client Desktop]# ssh [email protected] ##可以连接到不同网段的主机
利用w -i 查询真正登陆172.25.254.81主机的ip,可以看出实际上是172.25.254.100登陆172.25.254.81,而不是1.1.1.200登陆172.25.254.81;这里也就完成了地址伪装。
端口转发
服务端设置:
[root@shareserver network-scripts]# firewall-cmd --permanent --add-forward port=port=22:proto=tcp:toport=22:toaddr=172.25.254.81 ##ssh 的端口是 22;当ssh链接到172.25.254.100将会跳转到IP为172.25.254.81的主机
[root@shareserver network-scripts]# firewall-cmd --reload
客户端测试:(ip为1.1.1.200)
在该主机上利用ssh服务连接172.25.254.100这台主机,会发现这台主机将会自动跳转到172.25.254.81,输入的密码也是跳转到的主机的密码。效果如图所示: