#import "labtemplate.typ": * #show: nudtlabpaper.with( title: "防火墙ACL配置", author: "程景愉", id: "202302723005", training_type: "无军籍", grade: "2023", major: "网络工程", department: "计算机学院", advisor: "张军", jobtitle: "工程师", lab: "306-707", date: "2025.09.28", header_str: "《网络工程》实验报告", ) #set page(header: [ #set par(spacing: 6pt) #align(center)[#text(size: 11pt)[《网络工程》实验报告]] #v(-0.3em) #line(length: 100%, stroke: (thickness: 1pt)) ]) #show heading: it => box(width: 100%)[ #v(0.50em) #set text(font: hei) #it.body ] #outline(title: "目录", depth: 3, indent: 1em) #pagebreak() #outline( title: [图目录], target: figure.where(kind: image), ) #show heading: it => box(width: 100%)[ #v(0.50em) #set text(font: hei) #counter(heading).display() // #h(0.5em) #it.body ] #set enum(indent: 0.5em, body-indent: 0.5em) #pagebreak() = 实验目的 #para[ 本实验旨在通过配置ACL,实现对网络流量的精确识别和控制,提高网络的安全性和稳定性。通过配置防火墙,实现对内外网络的访问控制,保护内部网络免受外部威胁。 ] = 实验原理 == ACL === ACL概述 #para[ 访问控制列表ACL(Access Control List)是由一条或多条规则组成的集合。所谓规则,是指描述报文匹配条件的判断语句,这些条件可以是报文的源地址、目的地址、端口号等。 ACL本质上是一种报文过滤器,规则是过滤器的滤芯。设备基于这些规则进行报文匹配,可以过滤出特定的报文,并根据应用ACL的业务模块的处理策略来允许或阻止该报文通过。 ] === ACL的作用 #para[ ACL作为一个过滤器,设备通过应用ACL来阻止和允许特定流量的流入和流出,如果没有它,任何流量都会自由流入和流出,使得网络容易受到攻击。 ] #para[ 如@figure1 所示,为保证财务数据安全,企业在路由设备上应用ACL可以阻止内网内部研发部门主机对财务服务器的访问,同时允许总裁办公室访问财务服务器。为了保护企业内网的安全,在路由设备上应用ACL可以封堵网络病毒常用的端口,防止Internet上的恶意流量入侵。 ] #figure( image("download1.png", fit: "stretch", width: 55%), caption: [ACL应用示例], ) === ACL的功能 #para[ 借助ACL,可以实现以下功能: ] - 提供安全访问:企业重要服务器资源被随意访问,企业机密信息容易泄露,造成安全隐患。使用ACL可以指定用户访问特定的服务器、网络与服务,从而避免随意访问的情况。 - 防止网络攻击:Internet病毒肆意侵略企业内网,内网环境的安全性堪忧。使用ACL可以封堵高危端口,从而达成为外网流量的阻塞。 - 提高网络带宽利用率:网络带宽被各类业务随意挤占,服务质量要求最高的语音、视频业务的带宽得不到保障,造成用户体验差。使用ACL实现对网络流量的精确识别和控制,限制部分网络流量从而保障主要业务的质量。 === ACL的组成 #para[ ACL的每一条规则都会允许或者阻止特定的流量,在定义一条合理的ACL规则之前,需要了解其基本组成。 ] - ACL标识:使用数字或者名称来标识ACL。 - 使用数字标识ACL:不同的类型的ACL使用不同的数字进行标识。关于每类ACL编号的详细介绍,请参见 ACL的分类。 - 使用名称标识ACL:可以使用字符来标识ACL,就像用域名代替IP地址一样,更加方便记忆。 - 规则:即描述匹配条件的判断语句。 - 规则编号:用于标识ACL规则,所有规则均按照规则编号从小到大进行排序。 - 动作:包括permit/deny两种动作,表示设备对所匹配的数据包接受或者丢弃。 - 匹配项:ACL定义了极其丰富的匹配项。包括生效时间段、IP协议( ICMP、TCP、UDP等)、源/目的地址以及相应的端口号(21、23、80等)。 === ACL的分类 #para[ 随着ACL技术的发展,其种类越来越丰富,根据其不同的规则和使用场景,常用的可分为以下几类: ] + 基本ACL:基本ACL规则只包含源IP地址,对设备的CPU消耗较少,可用于简单的部署,但是使用场景有限,不能提供强大的安全保障。 + 高级ACL:相较于基本ACL,高级ACL提供更高的扩展性,可以对流量进行更精细的匹配。通过配置高级ACL,可以阻止特定主机或者整个网段的源或者目标。除此之外,还可以使用协议信息(IP、 ICMP、TCP、UDP)去过滤相应的流量。 + 二层ACL:在公司的内部网络中,想对特定的终端进行访问权限控制,这时就需要二层ACL。使用二层ACL,可以根据源MAC地址、目的MAC地址、802.1p优先级、二层协议类型等二层信息对流量进行管控。 + 用户ACL:由于企业内部同部门的工作人员的终端不在同一个网段难以管理,需要将其纳入一个用户组,并对其用户组进行访问权限管理,这时候就需要用户ACL。用户ACL在高级ACL的基础上增加了用户组的配置项,可以实现对不同用户组的流量管控。 + 时间ACL:在某些特定的时间段内,对特定的流量进行管控,这时就需要时间ACL。时间ACL在高级ACL的基础上增加了时间段的配置项,可以实现对不同时间段的流量管控。 === ACL的使用步骤 #para[ ACL的使用分为两个步骤。 ] + 设置相应的ACL规则:为ACL设置相关规则的时候,需要了解入口流量与出口流量,如@figure2 所示:入口流量指的是进入设备(以路由器为例)接口的流量(无论来源是外部Internet还是内部网络),同理,出口流量指的是从设备接口流出的流量。#figure( image("download2.png", fit: "stretch", width: 60%), caption: [入口流量与出口流量], ) 当外部Internet访问内部网络时,通过路由器接口2的入口流量,其源IP地址为外部的公网IP;而当内部网络需要访问外部网络时,通过路由器的接口1的入口流量,其源IP地址则为内网的IP。 + 应用ACL规则:规则设置完成后,需要将ACL应用在设备的接口上才能正常工作。因为所有的路由和转发决策都是由设备的硬件做出的,所以ACL语句可以更快地执行。 === ACL的匹配机制 #para[ 设备使用ACL的匹配机制如@figure3 所示。 ] #figure( image("download3.png", fit: "stretch", width: 70%), caption: [ACL的匹配机制], ) #para[ ACL规则的匹配遵循”一旦命中即停止匹配”的机制。当ACL处理数据包时,一旦数据包与某条ACL规则匹配,就会停止匹配,设备根据该条匹配的语句内容决定允许或者拒绝该数据包。如果数据包内容与ACL语句不匹配,那么将依次使用ACL列表中的下一条语句去匹配数据包直到列表的末尾。一般在ACL的列表末尾会有一条隐式的拒绝所有的语句,所以数据包与所有的规则都不匹配的情况下会被直接拒绝。此时设备不会将此数据包流入或流出接口,而是直接将其丢弃。 ] === ACL的应用场景 #para[ ACL的应用场景包括以下几个方面: ] + 在NAT中使用ACL:通过NAT的端口映射可使得外网访问内部网络。考虑到内部的网络安全,不可能允许所有的外部用户访问内部网络,这时可以设置ACL规则并应用在企业路由器上,使得特定的外网用户可以访问内部网络。 #figure( image("download4.png", fit: "stretch", width: 60%), caption: [在NAT中使用ACL], )如@figure4 所示,当公网主机想建立与内网主机的通信时,其发向内部网络主机的流量经过 NAT 设备时,设备利用ACL对流量进行过滤,阻断了PC4对PC2的访问,同时允许PC3对PC1的访问。 + 在防火墙中使用ACL:防火墙用在内外网络边缘处,防止外部网络对内部网络的入侵,也可以用来保护网络内部大型服务器和重要的资源(如数据)。由于ACL直接在设备的转发硬件中配置,在防火墙中配置ACL在保护网络安全的同时不会影响服务器的性能。 #figure( image("download5.png", fit: "stretch", width: 60%), caption: [在防火墙中使用ACL], )如@figure5 所示,在防火墙上配置ACL只允许外部特定主机PC A访问内部网络中的数据中心,并禁止其他外部主机的访问。 + 在QoS中使用ACL限制用户互访:ACL应用在QoS的流策略中,可以实现不同网段用户之间访问权限的限制,从而避免用户之间随意访问形成安全隐患。 #figure( image("download6.png", fit: "stretch", width: 60%), caption: [使用ACL限制不同网段用户的互访], )如@figure6 所示,某公司为财务部和市场部规划了两个网段的IP地址。为了避免两个部门之间相互访问造成公司机密的泄露,可以在两个部门连接Router的接口的入方向上应用绑定了ACL的流策略,从而禁止两个部门的互访。 == 防火墙 === 防火墙基本原理 #para[ 防火墙是一种网络安全设备,用于监控和控制进出网络的流量,基于预定义的安全规则来允许或阻止数据包的传输。它通常部署在网络边界,用于保护内部网络免受外部威胁。 ] === 接口工作模式 #para[ 防火墙的接口可以工作在以下三种模式之一: ] + 路由模式:当防火墙位于内部网络和外部网络之间时,可同时为设备与内部网络、外部网络相连的接口分别配置不同网段的 IP 地址。报文在三层区域的接口间进行转发时,根据报文的 IP 地址来查找路由表。此时设备表现为一个路由器。 + 透明模式:接口无 IP 地址。在网络中像连接交换机一样连接防火墙。此时无需修改任何已有的 IP 配置,防火墙就像一个交换机一样工作,内部网络和外部网络必须处于同一个子网。报文在防火墙当中不仅进行二层的交换,还会对报文进行高层分析处理。 + 混合模式:如果防火墙既存在工作在路由模式的接口(有的接口具有 IP 地址),又存在工作在透明模式的接口(有的接口无 IP 地址),则防火墙工作在混合模式下。这种工作模式基本上是透明模式和路由模式的混合,目前只用于透明模式下提供双机热备的特殊应用中,别的环境下不建议使用。 === 安全区域 #para[ 安全区域(简称区域)是一个或多个接口的集合。区域是防火墙功能实现的基础,当数据报文在不同的区域之间传递时,将会触发安全策略进行检查。默认区域包括: ] + Untrust:外网,不安全网络,安全级别是 5。 + DMZ:停火区,安全级别是 50。 + Trust:内网,安全网络,安全级别是 85。 + Local:管理接口、运行动态路由协议,安全级别是 100。 安全级别越大,安全级别越高,不同安全域的级别不能相同。 === 安全策略 #para[ 安全策略是防火墙的核心功能,用于控制不同区域之间的流量通信。默认情况下,所有区域间不能通信。安全策略的匹配条件和动作包括: ] + 策略匹配条件:源安全域,目的安全域,源地址,目的地址,用户,服务,应用,时间段。 + 策略动作:允许,禁止。 + 内容安全(可选,策略动作为允许的时候执行):反病毒,攻击防御,URL 过滤,文件过滤,内容过滤,应用行为控制,邮件过滤。 #pagebreak() === 安全策略工作流程 #para[ 安全策略的工作流程如下: ] 1. 对收到的流量进行检测,检测出流量的属性,包括:源安全区域、目的安全区域、源地址/地区、目的地址/地区、用户、服务(源端口、目的端口、协议类型)、应用和时间段。 2. 如果所有条件(流量属性)都匹配,则此流量成功匹配安全策略。如果其中有一个条件不匹配,则继续匹配下一条安全策略。以此类推,如果所有安全策略都不匹配,则防火墙会执行缺省安全策略的动作(默认为禁止)。 3. 如果流量成功匹配一条安全策略,防火墙会执行此安全策略的动作。如果动作为禁止,则防火墙会阻断此流量。如果动作为允许,则防火墙会判断安全策略是否引用了安全配置文件。如果引用了安全配置文件,则继续进行步骤 4 的处理;如果没有引用安全配置文件,则允许此流量通过。 = 实验环境 == 实验背景 #para[ 本实验基于华为USG6303E-AC防火墙,通过配置ACL实现以下需求: ] + Trust 区域在工作时间(周一到周五 09:00-21:00)禁止访问 untrust 区域的娱乐类应用。 + 允许 trust 区域访问 untrust 区域的其余流量。 + 允许任意区域访问 DMZ 区域的 http、https、ftp 服务(使用服务组)。 #para[ 配置步骤包括: ] 1. 给接口设置 IP 地址。 2. 将接口加入区域。 3. 定义时间段对象、服务对象。 4. 设置安全策略。 == 实验设备 #align(center)[#table( columns: (auto, auto, auto), rows: (2em, 2em, 3em), inset: 10pt, align: horizon + center, table.header([*设备名称*], [*设备型号*], [*设备数量*]), "防火墙", "华为USG6303E-AC", "1", "PC", "联想启天M410 Windows 10", "3", )] #para[ 另有网线若干。 ] = 实验步骤及结果 == 实验拓扑 #para[ 按实验背景,绘制拓扑图如下: ] #figure(image("实验拓扑.png", format: "png", fit: "stretch", width: 80%), caption: "实验拓扑图") == 按照拓扑图接线 #para[ 按照拓扑图接线。 ] #figure(image("机柜正面连线.png", format: "jpg", fit: "stretch", width: 60%, height: 40%), caption: "机柜接线图") == 配置基本网络 === 配置PC - 配置PC1的IP地址为`192.168.1.1/24`,网关为`192.168.1.2`; #figure(image("trust区域电脑IP地址配置.jpg", format: "jpg", fit: "stretch", width: 60%), caption: "配置PC1的IP地址") - 配置PC2(Server)的IP地址为`172.130.80.1/24`,网关为`172.130.80.2`; #figure(image("PC2-IP.jpg", format: "jpg", fit: "stretch", width: 60%), caption: "配置PC2的IP地址") - 配置PC3的IP地址为`10.13.1.1/24`,网关为`10.13.1.2`; #figure(image("PC3-IP.jpg", format: "jpg", fit: "stretch", width: 60%), caption: "配置PC3的IP地址") - 配置管理PC的IP地址为`192.168.0.2/24`,网关为`192.168.0.1`。 #figure(image("管理PC.jpg", format: "jpg", fit: "stretch", width: 60%), caption: "配置管理PC的IP地址") #para[ 这样配置之后,PC1、PC2、PC3分别属于`trust`、`dmz`、`untrust`区域;管理PC用于通过MGMT网口管理防火墙。 ] == 配置防火墙 === 配置防火墙接口 #para[ 通过“网络”-“接口”配置防火墙的接口IP地址和区域信息总览: ] #figure(image("接口配置前.jpg", format: "jpg", fit: "stretch", width: 100%), caption: "配置防火墙接口前") - 配置防火墙的GE0/0/1接口IP地址为`192.168.1.2/24`,区域为`trust`; #figure(image("001接口.jpg", format: "jpg", fit: "stretch", width: 99%), caption: "配置防火墙的GE0/0/1接口") - 配置防火墙的GE0/0/2接口IP地址为`172.130.80.2/24`,区域为`dmz`; #figure(image("002接口.jpg", format: "jpg", fit: "stretch", width: 100%), caption: "配置防火墙的GE0/0/2接口") - 配置防火墙的GE0/0/3接口IP地址为`10.13.1.2/24`,区域为`untrust`。 #figure(image("003接口.jpg", format: "jpg", fit: "stretch", width: 100%), caption: "配置防火墙的GE0/0/3接口") 查看配置结果: #figure(image("接口配置后.jpg", format: "jpg", fit: "stretch", width: 100%), caption: "配置防火墙接口后") === 配置安全策略 #para[ 通过“策略”-“安全策略”配置安全策略: ] - 配置`trust`区域到`untrust`区域的安全策略,在工作时间禁止访问`untrust`区域: #figure( image("安全策略a.jpg", format: "jpg", fit: "stretch", width: 100%), caption: "配置trust区域在工作时间禁止访问untrust区域", ) - 配置`trust`区域到`untrust`区域的安全策略,允许访问其余流量: #figure(image("安全策略b.jpg", format: "jpg", fit: "stretch", width: 100%), caption: "配置trust到untrust的安全策略") - 创建包含http、https、ftp服务的服务组: #figure(image("安全策略-服务组.jpg", format: "jpg", fit: "stretch", width: 90%), caption: "创建服务组") - 使用创建的服务组配置`trust`区域到`dmz`区域的安全策略: #figure(image("安全策略c.jpg", format: "jpg", fit: "stretch", width: 90%), caption: "配置trust到dmz的安全策略") - 使用创建的服务组配置`untrust`区域到`dmz`区域的安全策略: #figure(image("安全策略c1.jpg", format: "jpg", fit: "stretch", width: 90%), caption: "配置untrust到dmz的安全策略") #para[ 配置完成之后,查看总览: ] #figure(image("安全策略总览.jpg", format: "jpg", fit: "stretch", width: 100%), caption: "安全策略总览") == 验证配置 #para[ 在“系统”-“配置”-“时钟配置”中查看防火墙系统时间: ] #figure(image("允许时间段.jpg", format: "jpg", fit: "stretch", width: 70%), caption: "修查看系统时间") #para[ 时间为非工作时间(22点),在PC1上ping untrust区域的PC3,可以ping通。 ] #para[ 修改系统时间为工作时间: ] #figure(image("禁止时间段.jpg", format: "jpg", fit: "stretch", width: 70%), caption: "修改系统时间") #para[ 时间为工作时间(10点),在PC1上ping untrust区域的PC3,无法ping通。 ] #para[ 下面是两次ping的结果,trust区域电脑在不同时段内可或不可访问untrust区域: ] #figure( image("trust区域电脑在不同时段内可or不可访问untrust区域.jpg", format: "jpg", fit: "stretch", width: 100%), caption: "ping结果", ) #para[ 下面是防火墙上针对上述策略的命中次数变化,注意最右侧的命中次数变化,可以看到ping发出的4个请求被防火墙拦截: ] #figure( table( columns: auto, rows: (auto, auto), inset: 10pt, align: horizon + center, figure(image("不命中.png", format: "png", fit: "stretch", width: 100%)), figure(image("命中.png", format: "png", fit: "stretch", width: 100%)), stroke: none, ), caption: "防火墙命中次数变化", kind: image, ) #para[ 即策略配置无误。 ] = 实验总结 == 内容总结 #para[ 本实验基于华为USG6303E-AC防火墩,通过配置ACL实现了以下需求: ] + Trust 区域在工作时间(周一到周五 09:00-21:00)禁止访问 untrust 区域。 + 允许 trust 区域访问 untrust 区域的其余流量。 + 允许任意区域访问 DMZ 区域的 http、https、ftp 服务(使用服务组)。 #para[ 通过配置ACL,实现了对不同区域之间的流量通信进行了控制,保障了网络的安全。 ] == 思考题 === 在某防火墙安全规则配置时,已经允许从主机 A 到主机 B 通过 ICMP 协议,但使用 ping 测试时发现从 A 到 B 还是不通,请问是什么原因? 这是一个非常常见的排错场景。`ping` 命令的成功依赖于一个双向的通信过程,而不仅仅是A到B的单向。 请求 (Request): 主机 A 发送一个 `ICMP Echo Request` 报文给主机 B。 回复 (Reply): 主机 B 收到后,必须回复一个 `ICMP Echo Reply` 报文给主机 A。 我们在实验中配置的规则 `允许 A -> B` 只保证了第一步(请求)的成功。`ping` 仍然失败,最可能的原因是第二步(回复)的报文被阻断了。 以下是几个最可能的原因,按排查优先级排序: 1. 缺少返回策略 (最常见): 防火墙是双向检查的。当主机 B 回复报文时,这个报文的流向是 `B -> A`。如果防火墙上没有配置“允许主机 B 到主机 A 的 ICMP 流量”的策略,这个回复报文就会被防火墙丢弃,主机 A 也就永远收不到回复,导致 `ping` 超时。 解决方法: (状态检测):如果防火墙开启了状态检测(Stateful Inspection),它会自动“记住” A 发出的请求,并自动放行 B 的回复。需要检查防火墙是否为 ICMP 开启了状态检测。 (静态ACL):如果防火墙是无状态的(或ICMP状态检测被关闭),必须额外添加一条反向规则,允许 `ICMP Echo Reply` 从 B 到 A。 2. 主机 B 的本地防火墙: 网络防火墙(如 FW1)可能放行了流量,但是主机 B 自己的防火墙(例如 Windows 防火墙或 Linux 的 iptables)默认配置为“禁止入站 ICMP 请求”。这是 Windows 操作系统出于安全考虑的默认设置。 解决方法:登录主机 B,修改其本地防火墙设置,添加入站规则以允许 "文件和打印机共享(回显请求 - ICMPv4-In)"。 3. 路由问题: B 没有到 A 的路由:主机 B 可能不知道如何将回复报文“送回”给主机 A 所在的网段。需要检查主机 B 的路由表或其默认网关的路由表,确保有返回到主机 A 网段的路由。 A 没有到 B 的路由:虽然的安全策略允许了,但主机 A 或其网关可能根本不知道如何将数据包路由到主机 B。 4. NAT (地址转换) 问题: 如果主机 A 在内网,主机 B 在外网,主机 A 访问 B 时源地址被NAT成了防火墙的公网地址。当 B 回复时,它会回复给防火墙的公网地址。需要检查防火墙上的 NAT 配置和会话表(`display firewall session table`),确认 ICMP 的 NAT 转换和会话是否都正常建立。 === 2)什么是 DMZ,设置 DMZ 有何意义? - DMZ 是 "Demilitarized Zone" 的缩写,中文译为“隔离区”或“非军事区”。 在网络安全中,DMZ 是一个物理或逻辑上的子网络,它位于公司的内部私有网络 (Trust 区) 和外部公共网络 (Untrust 区 / Internet) 之间。它是一个缓冲区,一个“三不管”地带。 - 设置 DMZ 的核心意义是“隔离风险,保护内网”。 具体来说,公司里总有一些服务器是必须被外网(互联网)访问的,例如: 公司官网的 Web 服务器 Email 服务器 (SMTP) DNS 服务器 这些服务器由于暴露在互联网上,是黑客攻击的主要目标。 1. 风险隔离: 我们不能把这些“高风险”的服务器直接放在内网(Trust 区)。如果 Web 服务器被黑客攻陷了,而它又在内网,那么黑客就能以此为跳板,直接攻击内网的员工电脑、财务数据、核心数据库等,后果不堪设想。 2. 保护内网 (核心): 通过将这些服务器放在 DMZ 区域,我们就建立了一道新的安全屏障。防火墙可以对这三个区域(Trust, Untrust, DMZ)实施精细的访问控制: 外网 (Untrust) -> DMZ:有限允许。只开放必须的端口(如 Web 服务的 80/443 端口)。 内网 (Trust) -> DMZ:有限允许。允许内网管理员去管理 DMZ 的服务器(如 SSH, RDP)。 DMZ -> 内网 (Trust):绝对禁止。这是最关键的一条策略!禁止任何从 DMZ 发起的、指向内网的连接。 == 心得感悟 #para[ 通过本次实验,我学会了如何配置ACL,实现了对不同区域之间的流量通信进行了控制,保障了网络的安全。在实验过程中,我对防火墙的接口配置、安全策略配置有了更深入的了解,提高了自己的实际操作能力。 ] #show heading: it => box(width: 100%)[ #v(0.50em) #set text(font: hei) // #counter(heading).display() // #h(0.5em) #it.body ] #pagebreak() #bibliography("ref.yml", full: true, title: "参考文献", style: "gb-7714-2015-numeric") /* 根据这个网站的格式示范https://github.com/typst/hayagriva/blob/main/docs/file-format.md 为这个网页生成.yml文件 https://blog.csdn.net/jxjdhdnd/article/details/138009187 */