电子说
防火墙概述
Firewalld是一种提供了支持网络/防火墙区域(zone)定义网络链接以及接口安全等级的动态防火墙管理工具,它自身并不具备防火墙的功能,而是和iptables一样需要通过内核的netfilter来实现。
也就是说firewalld和iptables一样,他们的作用都是用于维护规则,而真正使用规则干活的是内核的netfilter,只不过firewalld和iptables的结构以及使用方法不一样罢了。
从逻辑上可分为:主机防火墙和网络防火墙
从物理上可分为:硬件防火墙和软件防火墙
防火墙主要通过Netfilter与TCP Wrappers两个机制来管理的。
Netfilter:数据包过滤机制
TCP Wrappers:程序管理机制
在RHEL7系列中,默认使用firewalld作为防火墙。在RHEL7版本已经默认没有iptables服务了,当然iptables 命令还是可以用的。
Firewalld原理架构

1) Firewalld区域管理
通过将网络划分成不同的区域,制定出不同区域之间的访问控制策略来控制不同程序区域间传送的数据流。
互联网是不可信任的区域,而内部网络是高度信任的区域,网络安全模型可以在安装、初次启动和首次建立网络连接时选择初始化。
该模型描述了主机所连接的整个网络环境的可信级别,并定义了新连接的处理方式。
2) Firewalld域
| 网络区名称 | 默认配置 |
|---|---|
| trusted(信任) | 可接受所有的网络连接 |
| home(家庭) | 用于家庭网络,仅接受ssh,mdns,gp-client,samba-client,dhcpv6-client连接 |
| internal( 内部) | 用于内部网络,仅接受ssh,mdns,gp-client,samba-client,dhcpv6-client连接 |
| work(工作) | 用于工作区,仅接受sshjpp-client,dhcpv6-client服务连接 |
| public(工作) | 用于工作区,仅接受ssh,ipp-client,dhcpv6-client服务连接,在公共区域内使用,仅接受ssh或dhcpv6-client服务连接,是firewalld的默认区域 |
| external( 外部) | 出去的ipv4网络连接通过此区域为伪装或转发,仅接受ssh服务的连接 |
| dmz(非军事区) | 仅接受ssh服务的连接 |
| block(限制) | 拒绝所有网络的连接 |
| drop (丢弃) | 任何接收的网络数据包都被丢弃,没有任何回复 |
firewalld的默认区域是public
3) Firewalld配置文件
firewalld默认提供了九个zone配置文件:block.xml、dmz.xml、drop.xml、external.xml、 home.xml、internal.xml、public.xml、trusted.xml、work.xml,都保存在/usr/lib/firewalld/zones/目录下。
Firewalld 和 Iptables 的异同
1) 相同点
firewalld与iptables都是linux中防火墙的管理程序,但其实其角色主要为对于防火墙策略的管理,真正的防火墙执行者是位于内核中的netfilter。
2) 不同点
iptables 仅能通过命令行进行配置;而 firewalld 提供了图形接口,类似windows防火墙的操作方式;
iptables 每一个单独更改意味着清除所有旧的规则,并从 /etc/sysconfig/iptables 中读取所有新的规;则;而 firewalld 在有规则变动后,可以仅仅运行规则中的不同之处,即在 firewalld 运行时间内,改变设置时可以不丢失现行链接;
iptables 的配置文件在 /etc/sysconfig/iptables 中;而 firewalld 的配置文件在 /usr/lib/firewalld/ 和 /etc/firewalld/ 中的各种 XML 文件中;
iptables 没有守护进程,并不能算是真正意义上的服务;而 firewalld 有守护进程;
iptables 通过控制端口来控制服务,而 firewalld 则是通过控制协议来控制端口;
【firewalld】默认是拒绝;而【iptables】默认是允许。
service说明:在/usr/lib/firewalld/services/目录中,还保存了另外一类配置文件,每个文件对应一项具体的网络服务,如 ssh 服务等。这个目录下的服务配置默认是放通的,不受firewalld-cmd 规则控制,除非把这个目录下的服务配置文件删掉,就恢复了默认了(默认拒绝),当然也可以添加一些服务配置文件。
验证默认拒绝规则
# 这里用到nc工具去监听端口 # 安装nc yum install -y nc # 监听端口 nc -l 8888 # 查询端口 ss -tnlp|grep :8888

用另外一台机器telnet端口 telnet 192.168.182.149 8888

Firewalld实战操作
只有firewalld服务启动了,才能使用相关工具:firewall-config(图形界面), firewall-cmd,这里主要介绍命令行方式的。
1)Firewalld有规则两种状态
运行时(runtime):修改规则马上生效,但是临时生效
持久配置(permanent):修改后需要重载才会生效
firewall-cmd --permanent [RULE] firewall-cmd --reload
一旦使用了--permanent会将配置写入到/etc/firewalld/{services,zones}/*.xml对应的文件中,配置完成后一定要reload,否则只能待防火墙重启后这些配置才能生效。
2)Firewalld配置文件
/etc/firewalld/{services,zones}/*.xml 优先级最高,permanent模式生效的策略会放到这里
/lib/firewalld/{services,zones}/*.xml 优先级要低些,是一些默认配置,可以当做模板使用
以下options是可以组合使用的,具体见man firewall-cmd或者firewall-cmd --help,里面有详细的说明,此处只列出一些常用的option。
firewall-cmd --permanent --配置写入到配置文件,否则临时马上生效 --reload --重载配置文件,永久生效 --zone= --指定区域 --get-default-zones --获取默认区域 --set-default-zone= --设置默认区域 --get-zones --获取所有可用的区域 --get-active-zones --获取当前激活(活跃)的区域 --add-source= --添加地址,可以是主机或网段,遵循当前区域的target --remove-source --移除地址,可以是主机或网段,遵循当前区域的target --add-service= --添加服务,遵循当前区域的target --remove-service= --移除服务,遵循当前区域的target --list-services --显示指定区域内允许访问的所有服务 --add-port= --添加端口,遵循当前区域的target --remove-port= --移除端口,遵循当前区域的target --list-ports 显示指定区域内允许访问的所有端口号 --add-interface= --zone= --添加网卡到指定区域 --change-interface= --new-zone-name --改变网卡到指定区域 --list-all --列出激活使用的区域的配置 --list-all-zones --列出所有区域的配置 --get-zone-of-interface= --获取指定接口所在的区域 --list-icmp-blocks --显示指定区域内拒绝访问的所有ICMP类型 --add-icmp-block= --为指定区域设置拒绝访问的某项ICMP类型 --remove-icmp-block= --移除指定区域内拒绝访问某项的ICMP类型 #常用的ICMP类型有: #echo-request:类型0,icmp请求报文 #echo-reply:类型8,icmp响应回复报文 --list-protocols --列出在指定区域中允许通过的协议 --add-protocol= --在指定区域中添加允许通过的协议 --remove-protocol= --移除在指定区域中的某项协议 --get-target --获取区域中的默认target --set-target= --设置区域的target
3)增删改查操作
1、【查】看一个区域的配置信息
(py3) [root@jumpserver-168-182-149 nginx]# firewall-cmd --list-all public (active) # 活动的区域 target: default # 默认启动的区域 icmp-block-inversion: no # ICMP协议类型黑白名单开关(yes/no) interfaces: ens33 # 关联的网卡接口 sources: 192.168.182.147 # 来源,可以是IP地址,也可以是mac地址 services: dhcpv6-client ssh # 列出允许通过这个防火墙的服务 ports: 2181/tcp 8888/tcp 80/tcp # 列出允许通过这个防火墙的目标端口。(即 需要对外开放的端口) protocols: # 协议值可以是一个协议 ID 数字,或者一个协议名 masquerade: no # 表示这个区域是否允许 IP 伪装。如果允许,它将允许 IP 转发,它可以让你的计算机作为一个路由器 forward-ports: # 列出转发的端口 source-ports: # 允许的来源端口 icmp-blocks: # 可添加ICMP类型,当icmp-block-inversion为no时,这些ICMP类型被拒绝;当icmp-block-inversion为yes时,这些ICMP类型被允许 rich rules: # 富规则,即更细致、更详细的防火墙规则策略,它的优先级在所有的防火墙策略中也是最高的 rule family="ipv4" source address="192.168.250.0/24" accept
常用的查看命令
# 查询默认区域配置信息 firewall-cmd --list-all # 查看区域配置信息 firewall-cmd --list-all --zone=work # 查询所有端口 firewall-cmd --list-ports # 查询指定端口 firewall-cmd --zone=public --query-port=22/tcp # 查询放通IP段 firewall-cmd --list-sources # 查看默认区域 firewall-cmd --get-default-zone # 查看所有可以使用的区域 firewall-cmd --get-zones # 查看活跃的区域 firewall-cmd --get-active-zones # 查看网卡绑定在了哪个区域 firewall-cmd --get-zone-of-interface=[IFACE] # 查看所有服务 firewall-cmd --get-services
2、【增】加规则
1、语法格式(端口):
firewall-cmd --zone=作用域 --add-port=端口数字/通讯协议 --永久生效
示例:
firewall-cmd --zone=public --add-port=2181/tcp --permanent ##打开2181端口,开放当前端口,他会用TCP协议,需要重新加载/重启才永久生效 firewall-cmd --reload

##打开2888端口,使用默认zone,他会用UDP协议,立马生效,只是临时的,重启服务/重启机器将失效 firewall-cmd --add-port=2888/udp # 查看 firewall-cmd --list-ports

2、语法格式(源IP):
firewall-cmd --zone=作用域 --add-source=端口数字/通讯协议 --永久生效
示例:
# 放通ip地址 firewall-cmd --add-source=192.168.182.0/24 --zone=public # 查看 firewall-cmd --list-sources # 放通某个ip/ip段的某个端口 firewall-cmd --zone=public --add-source=192.168.182.147 --permanent firewall-cmd --zone=public --add-port=8888/tcp --permanent firewall-cmd --reload

3、【删】除规则
1、语法格式(端口):
firewall-cmd --zone=作用域 --remove-port=端口数字/通讯协议
示例:
firewall-cmd --zone=public --remove-port=2181/tcp

2、语法格式(源IP):
firewall-cmd --zone=作用域 --remove-source=端口数字/通讯协议
示例:
firewall-cmd --zone=public --remove-source=192.168.182.0/24

4、【改】正规则
1、修改当前的默认区为work
firewall-cmd --set-default-zone=work # 查看 firewall-cmd --get-default-zone=work

直接规则
Direct Options
--direct --指定将要使用直接规则
--get-all-chains --获取所有的链
--get-chains {ipv4|ipv6|eb}