Linux 防火墙 Firewalld
一、防火墙概述
防火墙是一种位于内部网络与外部网络之间的网络安全系统,依照特定的规则,允许或限制传输的数据通过,以此保障内部网络的安全。
(一)按表现形式划分
- 软件防火墙:集成在系统内部,无需额外的硬件设备。在 Linux 系统中,常见的软件防火墙有 iptables、firewalld、ufw;在 Windows 系统下,Windows Defender 就是一款自带的软件防火墙。
- 硬件防火墙:作为独立的硬件设备存在,具备更强的性能和更全面的防护功能。市面上主流的硬件防火墙品牌有华为、思科、奇安信、深信服等。
(二)按技术划分
- 包过滤防火墙:主要检查数据包的源 IP、目的 IP、源端口、目的端口以及 TCP 的 syn 控制位,根据预设规则决定数据包是否放行。它的优点是处理速度快,对系统资源占用少,但防护功能相对基础。
- 七层防火墙:除了具备包过滤防火墙的检查功能外,还能深入检查数据内容,例如识别特定的应用层协议(如 HTTP、FTP 等),并根据应用层数据的特征进行防护。不过,其处理速度相对较慢,对硬件性能要求较高。
(三)防火墙的作用
防火墙最核心的作用是阻止来自网络外部的攻击,同时对网络流量进行有效控制。比如,它可以拦截恶意的网络数据包,防止黑客入侵内部网络;还能限制内部网络对外部特定网站或服务的访问,合理分配网络带宽。
二、Linux 防火墙结构
Linux 防火墙的结构分为用户态和内核态,二者协同配合,共同实现防火墙的功能。
(一)用户态
用户态主要负责对防火墙规则进行管理和配置,不同的工具有着不同的特点:
- iptables:使用 iptables 命令管理防火墙规则,不过它要求使用者必须深度理解网络技术和四表五链(四表:raw、mangle、nat、filter;五链:input、output、forward、prerouting、postrouting),对于初学者或者网络技术储备不足的人员来说,操作难度较大,不够友好。
- firewalld:通过 firewall-cmd 命令对防火墙进行管理,采用区域划分的形式,使用者无需直接接触底层的四表五链,操作相对简单,对初学者比较友好。
- ufw:使用 ufw 命令管理防火墙,命令简单易懂,上手门槛较低,适合对防火墙功能需求不复杂的用户。
(二)内核态
内核态是防火墙规则的实际执行层面,其中的四表五链是关键组成部分:
- 四表:从内核到用户的顺序依次为 raw 表、mangle 表、nat 表、filter 表。raw 表主要用于处理不需要进行连接跟踪的数据包;mangle 表用于修改数据包的某些属性;nat 表用于实现网络地址转换;filter 表是默认的表,主要用于对数据包进行过滤。
- 五链:包括 input 链(处理进入本机的数据包)、output 链(处理从本机发出的数据包)、forward 链(处理经过本机转发的数据包)、prerouting 链(在数据包到达本机路由之前处理)、postrouting 链(在数据包离开本机路由之后处理)。
三、Firewalld 防火墙
Firewalld 的一大特色就是区域划分,通过将网络接口或源地址分配到不同的区域,实现不同级别的安全防护。
(一)九大区域及功能
Firewalld 包含九大区域,每个区域都有其特定的安全策略和应用场景:
- public(公共区域):默认区域,适用于公共网络环境。默认放行 dhcpv6-client 和 ssh 服务,其他服务和端口需要手动配置放行规则。
- home(家庭区域):适用于家庭网络环境,相比公共区域,放行的服务更多,包括 dhcpv6-client、mdns、samba-client 和 ssh 服务,能更好地满足家庭网络中设备之间的共享和通信需求。
- work(工作区域):适用于工作场所的网络,默认放行 dhcpv6-client 和 ssh 服务,满足工作中基本的网络连接和远程管理需求。
- trusted(完全信任区域):该区域的安全策略最为宽松,目标规则为 ACCEPT,即放行一切流量,适合将完全信任的设备或网络放入该区域。
- internal(内部区域):用于连接内部网络,默认放行 dhcpv6-client、mdns、samba-client 和 ssh 服务,为内部网络设备之间的通信提供安全保障。
- external(外部区域):用于连接外部网络(如互联网),默认放行 ssh 服务,并且默认开启 NAT 地址转换功能(masquerade: yes),可以隐藏内部网络的 IP 地址,保护内部网络安全。
- dmz(非军事化管理区域):通常用于放置内部的服务器(如 Web 服务器、邮件服务器等),默认只放行 ssh 服务,通过严格的规则限制外部网络对服务器的访问,同时也隔离了服务器与内部网络,降低服务器被攻击后对内部网络造成的影响。
- drop(丢弃区域):安全策略最为严格,会丢弃一切进入该区域的流量,且不给出任何回应,能有效阻挡恶意攻击和不必要的流量。
- block(阻塞区域):与 drop 区域类似,会拒绝任何进入该区域的流量,但会给出回应(如 ICMP 拒绝报文),让发送方知道流量被拒绝。
(二)firewall-cmd 命令用法
firewall-cmd 命令是管理 Firewalld 的主要工具,按照功能可分为查看、添加、修改、删除和保存规则等类别。
1. 查看命令
- 查看所有区域的详细信息:
[root@localhost ~]# firewall-cmd --list-all-zones
- 查看指定区域的详细信息:
[root@localhost ~]# firewall-cmd --list-all --zone=public
- 查看指定区域的放行服务:
[root@localhost ~]# firewall-cmd --list-services --zone=public
- 查看指定区域的放行端口:
[root@localhost ~]# firewall-cmd --list-ports --zone=public
- 查看指定区域包含的网络接口:
[root@localhost ~]# firewall-cmd --list-interfaces --zone=public
- 查看指定区域的放行协议:
[root@localhost ~]# firewall-cmd --list-protocols --zone=public
- 查看指定区域的 ICMP 阻塞类型:
[root@localhost ~]# firewall-cmd --list-icmp-blocks --zone=public
- 查看指定区域的放行源地址:
[root@localhost ~]# firewall-cmd --list-sources --zone=public
- 查看指定区域的源端口:
[root@localhost ~]# firewall-cmd --list-source-ports --zone=public
- 查看指定区域的富规则:
[root@localhost ~]# firewall-cmd --list-rich-rules --zone=public
- 查看指定区域的转发端口:
[root@localhost ~]# firewall-cmd --list-forward-ports --zone=public
- 查看 firewalld 支持的服务类型:
[root@localhost ~]# firewall-cmd --get-services
- 查看 firewalld 的默认区域:
[root@localhost ~]# firewall-cmd --get-default-zone
- 查看 firewalld 支持的 ICMP 的阻塞类型:
[root@localhost ~]# firewall-cmd --get-icmptypes
- 查看 firewalld 所有的活动区域:
[root@localhost ~]# firewall-cmd --get-active-zones
- 查看指定网络接口所属区域:
[root@localhost ~]# firewall-cmd --get-zone-of-interface=ens33
- 查看所有区域名称:
[root@localhost ~]# firewall-cmd --get-zones
2. 添加命令
- 添加指定服务到指定区域:
[root@localhost ~]# firewall-cmd --add-service=http --zone=public
,执行成功后会显示 “success”。 - 添加端口到指定区域:
[root@localhost ~]# firewall-cmd --add-port=80/tcp --zone=public
,成功后显示 “success”。 - 添加指定协议到指定区域:
[root@localhost ~]# firewall-cmd --add-protocol=ah --zone=public
,成功后显示 “success”。 - 添加 ICMP 阻塞类型到指定区域:
[root@localhost ~]# firewall-cmd --add-icmp-block=echo-request --zone=public
,成功后显示 “success”。添加该规则后,外部主机 ping 本机时会提示 “无法访问目标主机”。 - 添加指定网络接口到指定区域:
[root@localhost ~]# firewall-cmd --add-interface=ens33 --zone=work
,成功后显示 “success”。 - 添加指定区域的放行源地址:
[root@localhost ~]# firewall-cmd --add-source=192.168.1.0/24 --zone=work
,成功后显示 “success”。 - 添加指定区域的放行源端口:
[root@localhost ~]# firewall-cmd --add-source-port=999/tcp --zone=work
,成功后显示 “success”。 - 添加转发端口到指定区域:
[root@localhost ~]# firewall-cmd --add-forward-port=port=8080:proto=tcp:toport=80:toaddr=192.168.115.115 --zone=work
,成功后显示 “success”。 - 添加地址转换功能到指定区域:
[root@localhost ~]# firewall-cmd --add-masquerade --zone=work
,成功后显示 “success”。
3. 修改命令
- 修改默认区域:
[root@localhost ~]# firewall-cmd --set-default-zone=work
,成功后显示 “success”。 - 修改网络接口所属区域:
[root@localhost ~]# firewall-cmd --change-interface=ens33 --zone=internal
(或[root@localhost ~]# firewall-cmd --change-zone=ens33 --zone=external
),成功后显示 “success”。 - 追加指定区域的放行源地址:
[root@localhost ~]# firewall-cmd --change-source=192.168.2.0/24 --zone=work
,成功后显示 “success”。
4. 删除命令
- 删除指定服务到指定区域:
[root@localhost ~]# firewall-cmd --remove-service=http --zone=public
,成功后显示 “success”。 - 删除端口到指定区域:
[root@localhost ~]# firewall-cmd --remove-port=80/tcp --zone=public
,成功后显示 “success”。 - 删除指定协议到指定区域:
[root@localhost ~]# firewall-cmd --remove-protocol=ah --zone=public
,成功后显示 “success”。 - 删除 ICMP 阻塞类型到指定区域:
[root@localhost ~]# firewall-cmd --remove-icmp-block=echo-request --zone=public
,成功后显示 “success”。 - 删除指定网络接口到指定区域:
[root@localhost ~]# firewall-cmd --remove-interface=ens33 --zone=work
,成功后显示 “success”。 - 删除指定区域的放行源地址:
[root@localhost ~]# firewall-cmd --remove-source=192.168.1.0/24 --zone=work
,成功后显示 “success”。 - 删除指定区域的放行源端口:
[root@localhost ~]# firewall-cmd --remove-source-port=999/tcp --zone=work
,成功后显示 “success”。 - 删除转发端口到指定区域:
[root@localhost ~]# firewall-cmd --remove-forward-port=port=8080:proto=tcp:toport=80:toremover=192.168.115.115 --zone=work
,成功后显示 “success”。 - 删除地址转换功能到指定区域:
[root@localhost ~]# firewall-cmd --remove-masquerade --zone=work
,成功后显示 “success”。
5. 保存规则命令
- 逐行规则保存:
[root@localhost ~]# firewall-cmd --remove-masquerade --zone=work --permanent
(以删除地址转换功能并保存为例)。 - 一次性保存所有规则:
[root@localhost zones]# firewall-cmd --runtime-to-permanent
,成功后显示 “success”。 - 保存的规则存储路径:
/etc/firewalld/zones
。
案例
禁止外部主机ping本机
#本机IP:192.168.115.129 ens33 NAT
#外部IP:192.168.115.128
#防火墙配置
[root@localhost ~]# firewall-cmd --add-interface=ens33 --zone=work
success
[root@localhost ~]# firewall-cmd --add-icmp-block=echo-request --zone=work
success
#验证
[root@localhost ~]# ping -c 4 192.168.115.129
PING 192.168.115.129 (192.168.115.129) 56(84) bytes of data.
From 192.168.115.129 icmp_seq=1 Destination Host Prohibited
From 192.168.115.129 icmp_seq=2 Destination Host Prohibited
From 192.168.115.129 icmp_seq=3 Destination Host Prohibited
From 192.168.115.129 icmp_seq=4 Destination Host Prohibited
--- 192.168.115.129 ping statistics ---
4 packets transmitted, 0 received, +4 errors, 100% packet loss, time 3001ms
允许外部主机访问本机的http服务
#本机IP:192.168.80.128 ens34 vmnet3
#外部IP:192.168.80.129
#######环境配置 开始#########
##本机安装httpd服务
#改变SElinux的规则
[root@localhost ~]# setenforce 0
[root@localhost ~]# yum install -y httpd
##启动httpd服务
[root@localhost ~]# systemctl start httpd
##修改httpd服务的监听IP
[root@localhost ~]# vim /etc/httpd/conf/httpd.conf
Listen 192.168.80.128:80
##重启httpd服务
[root@localhost ~]# systemctl restart httpd
##验证服务监听状态
[root@localhost ~]# netstat -naptu | grep :80
tcp 0 0 192.168.80.128:80 0.0.0.0:* LISTEN
5884/httpd
#######环境配置 结束#########
#防火墙配置
[root@localhost ~]# firewall-cmd --change-interface=ens34 --zone=dmz
success
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
允许外部主机访问本机的某个端口号
##客户端验证访问##
[root@localhost ~]# curl 192.168.80.128
curl: (7) Failed connect to 192.168.80.128:80; 拒绝连接
##发现无法访问###
#服务端查看dmz区域信息
[root@localhost ~]# firewall-cmd --list-all --zone=dmz
dmz (active)
target: default
icmp-block-inversion: no
interfaces: ens34
sources:
services: ssh
ports:
protocols:
masquerade: no
forward-ports:
source-ports:
icmp-blocks:
rich rules:
#发现没有放心http服务
#配置dmz区域http服务放行策略
[root@localhost ~]# firewall-cmd --add-service=http --zone=dmz
success
dmz (active)
target: default
icmp-block-inversion: no
interfaces: ens34
sources:
services: http ssh
ports:
protocols:
masquerade: no
forward-ports:
source-ports:
icmp-blocks:
rich rules:
允许外部主机访问本机的某个端口号
#前置环境如上
#防火墙配置
[root@localhost ~]# firewall-cmd --add-port=801/tcp --zone=dmz
success
#放行服务的本质实际上是放行了该服务的默认端口号!!!
#假如服务改变了监听端口号,只需放行对应的端口号即可!!!
#客户端验证
[root@localhost ~]# curl 192.168.80.128:801