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 包含九大区域,每个区域都有其特定的安全策略和应用场景:

  1. public(公共区域):默认区域,适用于公共网络环境。默认放行 dhcpv6-client 和 ssh 服务,其他服务和端口需要手动配置放行规则。
  2. home(家庭区域):适用于家庭网络环境,相比公共区域,放行的服务更多,包括 dhcpv6-client、mdns、samba-client 和 ssh 服务,能更好地满足家庭网络中设备之间的共享和通信需求。
  3. work(工作区域):适用于工作场所的网络,默认放行 dhcpv6-client 和 ssh 服务,满足工作中基本的网络连接和远程管理需求。
  4. trusted(完全信任区域):该区域的安全策略最为宽松,目标规则为 ACCEPT,即放行一切流量,适合将完全信任的设备或网络放入该区域。
  5. internal(内部区域):用于连接内部网络,默认放行 dhcpv6-client、mdns、samba-client 和 ssh 服务,为内部网络设备之间的通信提供安全保障。
  6. external(外部区域):用于连接外部网络(如互联网),默认放行 ssh 服务,并且默认开启 NAT 地址转换功能(masquerade: yes),可以隐藏内部网络的 IP 地址,保护内部网络安全。
  7. dmz(非军事化管理区域):通常用于放置内部的服务器(如 Web 服务器、邮件服务器等),默认只放行 ssh 服务,通过严格的规则限制外部网络对服务器的访问,同时也隔离了服务器与内部网络,降低服务器被攻击后对内部网络造成的影响。
  8. drop(丢弃区域):安全策略最为严格,会丢弃一切进入该区域的流量,且不给出任何回应,能有效阻挡恶意攻击和不必要的流量。
  9. 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
相关推荐
陈希1233 分钟前
Linux 防火墙配置实战:firewalld、iptables 与云安全组
linux·运维·服务器
女神下凡37 分钟前
芯参谋(95):嵌入式文件系统_开发指南
linux·服务器·arm开发·驱动开发·设计规范
@兽血沸腾1 小时前
Windows系统安装Jenkins部署应用至远程Windows服务器操作指南
运维·服务器·jenkins
且从容.4 小时前
Ubuntu安装flume
linux·ubuntu·flume
承渊政道5 小时前
Linux网络学习【Reactor反应堆模式】
linux·网络·学习·ubuntu·reactor
讯捷蓝达6 小时前
戴尔R720xd服务器卡死在 “Configuring Memory...Done“,换了内存还是卡?问题根本不在内存
运维·服务器
且从容.7 小时前
ubuntu安装flink
linux·ubuntu·flink
数字新视界9 小时前
动环监控信创适配在智能机房管理中的应用价值与未来展望
大数据·服务器·数据库·动环监控系统·动力与环境监控系统
爱和冰阔落9 小时前
【Linux网络】TCP 服务器如何并发处理多个客户端?从 fork、僵尸进程到双重 fork
linux·运维·服务器·网络
程序员沉梦听雨9 小时前
WSL2的安装与使用
linux·wsl