好先聊点实际的。做网络这行或者正在备考HCIA、HCIP的朋友一定绕不开ACL这个东西。ACL全称Access Control List中文叫访问控制列表说白就是设备上用来做报文过滤的规则表。我见过很多人一提到ACL就皱眉觉得配起来麻烦、方向容易搞混、通配符掩码总写反。其实ACL没那么玄关键是理解它怎么工作再去掉个ENSP里反复练几遍就通了。华为ENSP是企业网络模拟平台官方免费里面搭几个路由器交换机就能把真实组网中的ACL配置从头到尾跑一遍。这篇文章就围绕“华为ENSP里的ACL访问控制列表”从原理、分类、配置到排错把我实际操作中踩过的坑和总结的技巧一起写出来。1. 先搞清楚ACL到底干了些啥1.1 ACL就是门口保安三个最常见的使用场景把ACL理解成小区门口保安就好办了。保安手里有一份名单上面写着“谁可以进、谁不可以进”每个人进来之前都要对照名单检查一遍符合条件的放行不符合条件的一律拦住。ACL在路由器、交换机、防火墙上干的就是这件事。它检查的维度比保安更细源IP是谁、要去哪、走的是TCP还是UDP、访问的是80端口还是23端口全都能当成条件写进名单里。实际项目里ACL常见的场景有这么几类网络安全隔离。比如财务服务器只允许财务网段的PC访问其他网段一律拒绝这种需求在企业网里非常普遍。流量管控。比如把P2P下载的流量限制住保证视频会议和OA系统的带宽不被抢走。远程管理限制。只允许网络管理员所在的主机SSH登录设备其他IP全部拒绝这在设备加固时会被要求。这三种场景本质上做的都是同一件事定义策略、过滤报文。区别只在于匹配的粒度不同。前面两种用ACL就能实现第三种往往还要结合AAA、SSH等功能一起用。有人可能会问ACL和防火墙的访问控制策略有什么区别其实核心逻辑是一样的但防火墙通常有状态检测、应用层识别这些更高级的功能而ACL更偏向网络层和传输层的机械匹配。优点就是开销小、延迟低、设备几乎所有型号都支持适合在网络入口和出口快速做粗粒度过滤。缺点是不认识应用只看四层端口遇到动态端口或加密流量就不太灵。这就是为什么实际组网里ACL经常作为第一道防线挡在前面精细的活交给后面的防火墙做。1.2 华为ACL家族基本、高级、二层和用户自定义华为VRP系统里ACL按功能范围分成好几类编号段不一样能匹配的内容也不一样。很多人对着编号一脸懵记住下面这张表就够了。ACL类型编号范围能匹配的信息典型使用场景基本ACL2000-2999源IP地址、分片标记、生效时间基于源IP的粗粒度过滤高级ACL3000-3999源/目的IP、协议号、源/目的端口、TCP标志、优先级、时间精确匹配特定主机的特定服务二层ACL4000-4999源/目的MAC、以太网类型、VLAN ID局域网内基于MAC的接入控制用户自定义ACL5000-5999自定义报文头字段高级排障和特殊环境考试和工作里用得最多的是基本ACL和高级ACL。基本ACL简单粗暴只匹配源IP适合那种“这个网段不许访问那个网段”的粗控制。高级ACL复杂得多可以同时匹配源和目的IP还可以指定协议是ICMP、TCP、UDP再进一步限定端口号可以实现“允许PC1访问服务器的80端口但拒绝Ping服务器”这种细致需求。二层ACL在企业接入层交换机上会用到比如限制某个MAC地址不准接入某个VLAN。用户自定义ACL属于进阶玩法普通数通维护里用得不多但懂它能解决很多疑难杂症比如匹配非标准报文头的流量。1.3 为什么非要在ENSP里练ACL很多新手觉得ACL难是因为在真机上练成本高、风险大。一个不对把路由器的管理接口给过滤了设备直接失联或者把生产环境的业务端口给禁了立刻就是事故。ENSP完美解决了这个问题。ENSP是华为官方的模拟器里面集成了路由器、交换机、防火墙、无线AC等多种设备。命令行和真实设备几乎一模一样实验做错了顶多把模拟环境搞乱重启设备再来就行。我建议学ACL的人一定先在ENSP里把下面几种场景练透两台PC在不同网段中间隔一台路由器做基本ACL过滤一台服务器加两台PC用高级ACL控制不同主机对不同服务的访问三层交换机上配置VLANIF然后用ACL控制VLAN间的互访把ACL配合NAT一起用在出口路由器上限制某些内部IP不能访问外网。这四种场景练完你对ACL的理解基本就能应付大多数中小型网络项目了。而且ENSP实验做完后可以导出配置、截图写文档面试或考证备考时能拿出实打实的实验记录。2. 动手配置前必须吃透两个概念通配符掩码和规则顺序2.1 通配符掩码别看长得像子网掩码用法完全相反ACL里最劝退新手的就是那个像子网掩码一样的数字比如0.0.0.255。很多人第一次看到rule 5 permit source 192.168.1.0 0.0.0.255心想这不就是子网掩码吗咋写成了反着的恭喜你你猜对了一半它确实是“反着写的掩码”它在华为里叫通配符掩码Wildcard Mask。通配符掩码的规则很简单二进制位里0表示“这一位必须精确匹配”1表示“这一位无所谓随便是什么都行”。以192.168.1.0 0.0.0.255为例前面三组24位都是0表示IP的前24位必须完全匹配也就是必须是192.168.1开头最后一组255是8个1表示最后8位不检查可以是0到255任意值。合起来就表示192.168.1.0到192.168.1.255整个网段。举几个实打实的例子你要表达的意思正确的通配符掩码错误写法单个主机192.168.1.100.0.0.0255.255.255.255192.168.1.0/24网段0.0.0.255255.255.255.0192.168.0.0/16网段0.0.255.255255.255.0.0所有地址255.255.255.255可以写成any不适用看到没通配符掩码里的255变成了“不关心”0变成了“必须一模一样”和子网掩码里的含义正好反过来。我见过太多人把deny source 192.168.1.0 0.0.0.255错写成deny source 192.168.1.0 255.255.255.0结果规则匹配的是192.168.1.0这个主机地址本身效果完全不对。这种低级错误在ENSP里一遍就能试出来因为配完以后用display acl all一看规则内容明明白白写在上面很容易自查。2.2 规则编号和匹配顺序ACL是按顺序问话的ACL里每一条规则英文叫rule华为设备默认从规则编号5开始之后自动按步长5递增5、10、15、20这样排下去。设备处理报文时是从编号最小的规则开始往下逐条匹配一旦某条规则匹配上了立刻执行该规则对应的动作permit或者deny剩下的规则看了就跳过去不再继续匹配。这就是ACL和普通配置文件最大的区别它有“先到先得”的属性顺序就是一切。所以设计规则时特例必须放在前面通用规则放后面。举个真实翻车案例我之前给别人搭实验环境需求是“允许PC1访问服务器的80端口禁止其他所有访问”结果有个人把规则写成了下面这样acl number 3001 rule 5 permit ip rule 10 deny tcp destination-port eq 80第一行rule 5 permit ip把所有IP报文全放行了那么后面的deny规则根本没机会执行整条ACL就失去了意义。正确写法应该把deny tcp ... eq 80放前面或者把deny ip放在最后收尾。所以记住这句话先写精确的、局部禁止/放行的规则再写宽泛的收尾规则。2.3 华为ACL的隐藏规则最后那句deny到底从哪来这是很多人在ENSP里困惑的点明明只写了一条permit规则但设备好像“记住”了所有没匹配到的报文都给了deny。这涉及到ACL的默认行为。华为VRP设备上ACL如果配置了规则当报文没有匹配到任何一条规则时默认动作是拒绝deny。也就是说除了你写出来的那些rule系统其实在你心里加了一条看不见的deny any放在规则列表的最后。当然如果ACL里一条规则都没写那么默认动作是放行这也是需要注意的。正因为有这个隐含deny实践里有个约定俗成的写法如果你配置了一个ACL并且应用到了接口上务必在规则最后显式写一条“rule xx deny source any”基本ACL或“rule xx deny ip”高级ACL把隐含行为变成明示。好处是配置可读性高别人看配置时一眼就知道你有收尾规则另一方面防止某些特殊场景下ACL被复用到别的地方比如放到流策略里时行为可能因为默认动作的变化而产生不是预期中的效果。3. 第一个实战基本ACL控制网段互访3.1 搭一个最经典的三层组网打开ENSP从设备列表里拖出一台路由器型号建议选AR2220再拖两台PC。按照下面的IP规划连好线R1的GE0/0/0接口接PC1所在网段IP配置为192.168.1.1/24R1的GE0/0/1接口接PC2所在网段IP配置为192.168.2.1/24PC1的IP配置为192.168.1.10/24网关192.168.1.1PC2的IP配置为192.168.2.10/24网关192.168.2.1。先把基础配置配好保证两台PC能互通这一步排除了路由问题的干扰后面ACL的效果才看得清楚。Huaweisystem-view [Huawei]sysname R1 [R1]interface GigabitEthernet0/0/0 [R1-GigabitEthernet0/0/0]ip address 192.168.1.1 255.255.255.0 [R1-GigabitEthernet0/0/0]quit [R1]interface GigabitEthernet0/0/1 [R1-GigabitEthernet0/0/1]ip address 192.168.2.1 255.255.255.0PC1和PC2配好IP后先用PC1去Ping PC2的地址192.168.2.10通了说明三层链路没问题接下来就可以在这台路由器上做ACL实验了。3.2 在R1上配置基本ACL并应用到接口现在需求来了只允许PC1所在的192.168.1.0网段访问192.168.2.0网段禁止192.168.2.0网段的PC2反过来访问192.168.1.0网段。这个需求属于典型“按源地址控制访问”用基本ACL就够。不过要注意一个容易踩坑的细节基本ACL只匹配源IP所以它只能放在“流量进入的那一台设备”的接口上用inbound方向拦。如果放在192.168.2.0网段那侧的接口上基本ACL匹配的源IP全是192.168.2.0的报文那要拦的就是去往192.168.1.0方向的outbound流量也能做但方向逻辑要想清楚。我先写一个比较容易理解的方案在R1的GE0/0/0接口连接192.168.1.0网段上做inbound过滤拦截从PC2方向发往PC1的报文。[R1]acl number 2000 [R1-acl-basic-2000]rule 5 deny source 192.168.2.0 0.0.0.255 [R1-acl-basic-2000]rule 10 permit source any [R1-acl-basic-2000]quit [R1]interface GigabitEthernet0/0/0 [R1-GigabitEthernet0/0/0]traffic-filter inbound acl 2000注意看我在deny后面补了一条permit source any这是基本ACL的标准操作因为如果只有一条deny匹配到PC2的流量会被丢弃其他所有流量虽然会走系统隐含的默认动作但在真机上为了可读性和可维护性显式写出来更稳妥。traffic-filter这个命令是华为新版VRP里推荐的做法。老版本里你可能见过packet-filter功能类似但新版本更推荐用traffic-filter因为它是基于流分类框架实现的后续可以叠加更多复杂动作。ENSP里绝大多数版本都支持traffic-filter。3.3 验证效果ping通和不通都有讲究配置完成后在PC2上Ping 192.168.1.10理论上是超时的。PC1上Ping 192.168.2.10理论上是通的。这里有个细节值得留意PC1的Ping包从192.168.1.10发往192.168.2.10源地址是192.168.1.0网段目的地址是192.168.2.0网段进入R1的GE0/0/0时报文匹配的是ACL 2000里的deny规则吗不会因为源IP是192.168.1.0网段不匹配deny规则会继续匹配后面的permit于是被放行。PC2发往192.168.1.10的流量正好反过来源IP是192.168.2.0网段在GE0/0/0入口就匹配上了deny直接被丢弃。如果你发现PC2 Ping PC1还通那说明ACL根本没生效按下面清单排查接口方向是不是配反了把inbound写成outbound报文进入接口时还没被过滤ACL编号是不是应用错了比如创建了2000但是接口上应用的是3000有没有在配置完ACL后执行了save模拟器重启后配置丢失。还有一个很常见的坑很多人在ENSP里用路由器模拟器PC去Ping对端的时候路由器接口自己也会回显一些报文需要在接口上allow-direct之类的调试时别被这些干扰。4. 第二个实战高级ACL精确到端口和服务4.1 高级ACL到底高级在哪基本ACL只能看源IP满足不了“谁在什么时间段、想访问哪个服务器、用哪个端口、走什么协议”这类复合条件。高级ACL正是为这种场景设计的。它匹配的维度包括源IP、目的IP、协议号IP、ICMP、TCP、UDP、GRE等、源端口、目的端口、TCP标志位、分片信息、生效时间等。我在ENSP里练高级ACL时用的场景很贴近实际内网有两台PC一台是研发的一台是访客用的公司有一台内部Web服务器。需求是允许访客PC打开服务器的80端口网页但不允许它Ping服务器研发PC则完全允许访问服务器。听起来复杂其实用高级ACL一条条写下来就很清晰。4.2 实操场景只让指定主机用指定端口访问服务器拓扑稍微调整一下把服务器接到R1旁边假设服务器IP是192.168.1.100/24网关是192.168.1.1。PC1研发是192.168.1.10/24PC2访客是192.168.2.10/24。R1的GE0/0/0连接192.168.1.0网段GE0/0/1连接192.168.2.0网段。需求拆开看允许PC2访问服务器的TCP 80端口不允许PC2用ICMP Ping服务器允许PC1访问服务器的任何服务其他人访问服务器统统拒绝。对应高级ACL配置[R1]acl number 3001 [R1-acl-adv-3001]rule 5 permit ip source 192.168.1.10 0.0.0.0 destination 192.168.1.100 0.0.0.0 [R1-acl-adv-3001]rule 10 permit tcp source 192.168.2.10 0.0.0.0 destination 192.168.1.100 0.0.0.0 destination-port eq 80 [R1-acl-adv-3001]rule 15 deny icmp source 192.168.2.10 0.0.0.0 destination 192.168.1.100 0.0.0.0 [R1-acl-adv-3001]rule 20 deny ip source any destination 192.168.1.100 0.0.0.0 [R1-acl-adv-3001]quit [R1]interface GigabitEthernet0/0/0 [R1-GigabitEthernet0/0/0]traffic-filter inbound acl 3001仔细看这个规则顺序先把研发PC的完全放行写在最前面保证它不受后面deny规则影响然后单独放行访客PC的HTTP再拒绝访客PC的Ping最后用deny ip收尾。顺序的逻辑依据就是前面说的“先精后宽”。如果把rule 20那条deny ip放在最前面后面所有规则都白写了。为什么把ACL应用在GE0/0/0的inbound方向因为R1的GE0/0/0连接的是192.168.1.0网段所有要访问192.168.1.100的流量都会从这个接口进来在入口拦最干净避免流量已经进入了路由器内部再被拦下来白白消耗CPU。4.3 高级ACL的其他玩法分片过滤和时间段控制高级ACL除了端口匹配还可以控制分片报文。在抓包调试的时候如果一个大的Ping包被分片了ACL对非首片分片的处理逻辑和首片不一样默认情况下非首片分片只会匹配IP层条件深层端口信息没有。写ACL的时候可以针对分片单独设置deny这在有些环境里可以防分片攻击。再看时间段控制。高级ACL可以配合time-range来限制生效时间。比如公司要求工作日的9点到18点禁止访问视频网站其他时间不管。配置大概是[R1]time-range worktime 09:00 to 18:00 working-day [R1]acl number 3002 [R1-acl-adv-3002]rule 5 deny tcp source 192.168.1.0 0.0.0.255 destination any destination-port eq 443 time-range worktime注意time-range里“working-day”这个关键字表示周一至周五有些版本还支持“weekday”或“daily”千万别写错否则配置会不生效或者报错。ENSP里时间范围配置完以后可以用display time-range命令验证。4.4 应用到三层交换机VLAN间ACLENSP里还有一套非常经典的实验三层交换机上配置了两个VLANPC1在VLAN10PC2在VLAN20想禁止两个VLAN互访怎么搞三层交换机上VLAN间的路由走的是VLANIF接口。ACL要么应用在VLANIF接口上要么用traffic-filter在物理接口方向做。更推荐后者。例如[Huawei]acl number 2005 [Huawei-acl-basic-2005]rule 5 deny source 192.168.20.0 0.0.0.255 [Huawei-acl-basic-2005]rule 10 permit source any [Huawei-acl-basic-2005]quit [Huawei]interface GigabitEthernet0/0/1 [Huawei-GigabitEthernet0/0/1]traffic-filter inbound acl 2005这里GE0/0/1接的是VLAN20的PCinbound方向一进来就把192.168.20.0整个网段的报文丢掉了自然不可能再去访问VLAN10的网段。这种方案的优点是对VLAN里所有PC都生效不用逐个配IP规则。5. 常见问题与排查技巧实录5.1 排错第一步确认ACL到底有没有被应用上这是我在帮人排查虚拟环境时遇到最多的问题。明明配置了ACL但流量就是没有按预期被阻断。十有八九是ACL创建好了但忘了在接口上执行traffic-filter。华为设备上ACL本身只是一张表如果没被接口引用它不产生任何效果。用下面命令检查display acl all display traffic-filter applied-record display current-configuration | include traffic-filter第一招看ACL内容是否存在第二招看有哪些接口引用了哪个ACL第三招快速看接口下的应用记录。如果发现ACL里的规则都正常接口上也引用了那就是方向或顺序问题。5.2 方向搞反导致策略失效ACL应用方向有四类组合接口下的inbound、outbound对应的是流量相对于该接口进入或离开设备的方向。判断时可以画一个箭头流量从PC1出发进入R1的GE0/0/0所以对GE0/0/0来说这是inbound流量从R1出发送往PC1对GE0/0/0来说是outbound。一句话记忆站在路由器接口门口看进来的就是inbound出去的就是outbound。排查时常常有人把inbound写成了outbound于是报文还没进门就被放行了。改方向后立刻测试大概率就通了。5.3 通配符掩码写反规则变成了匹配“单个IP”这个我前面提过但值得放在排查清单里。看display acl all输出时如果规则显示source 192.168.1.0 255.255.255.0就是掩码写反了。华为命令行在输入时会校验通配符掩码的合法性有时候输入了错误掩码会提示“maskxxx invalid”但有些版本不会严格报错容易埋雷。还有个典型的“想匹配一个网段却匹配了所有地址”的写法比如想匹配192.168.1.0到192.168.1.255用了0.0.255.255这会把192.168.任何网段都匹配上范围大了一截。这种较隐蔽的掩码错误只有通过测试多个IP才能暴露。5.4 隐含的deny没有显式写出来导致后面想扩展时一脸懵有一次我在实验里只写了deny规则没有写permit结果发现想放行的流量也被丢了。回过头来想想就是这个原因ACL默认对未匹配报文是deny。后来我养成了一个习惯每一次配置ACL无论多简单都会把放行规则写全并且至少保留一条显式的deny作为收尾这样配置的含义一目了然。如果你想快速知道ACL里所有的规则用display acl 2000会输出类似下面的内容Advanced ACL 2000, 2 rules Acls step is 5 rule 5 permit source 192.168.1.0 0.0.0.255 rule 10 deny source any注意看输出里有没有“Acls step is 5”这行这是规则编号的步长。如果之前手动改过步长后续添加规则的编号可能会和你预期不一样。5.5 从ENSP走向真机ACL实验后的三个好习惯在ENSP里练完ACL后想把这套技能迁移到真实设备上有几个习惯值得养成。第一个习惯是保存配置。ENSP里不执行save重启后配置全没。模拟环境无所谓但真机上如果不保存重启就白干了。配置完ACL后记得R1save第二个习惯是先在模拟器里做“破坏性测试”。我就是故意把ACL配错比如写反方向和掩码、把放行规则写到deny规则后面然后观察现象把错误场景和正确结果对照起来。这样真机出现类似问题时我大脑里马上能映射出是哪种问题。第三个习惯是要养成分层过滤的全局观。ACL只对经过它的流量做过滤如果流量走的是二层路径比如同一台二层交换机上的两个PC互访三层路由器上的ACL根本看不见它。配置ACL之前先画清楚流量走向再决定过滤点。我在ENSP里做过最多的实验就是验证ACL放在离源近、离目的近效果完全不同这会直接影响你将来的组网方案。最后说点个人体会ACL这玩意儿真的很像开会时的门禁。门禁先看你是不是员工源IP再看你有没有会议邀请目的端口都符合才让进。很多网络问题看似复杂拆解成“谁访问谁、想用什么服务、允不允许”三个问题ACL配置的思路就顺了。ENSP这个平台最大的价值就是可以反复造故障、试错、查display、改配置整个过程零成本。多折腾几次你会发现在真机上调ACL就像做模拟实验一样有把握。
阅读完成 · 觉得有帮助?