好,先聊点实际的。做网络这行或者正在备考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类型 | 编号范围 | 能匹配的信息 | 典型使用场景 |
|---|---|---|---|
| 基本ACL | 2000-2999 | 源IP地址、分片标记、生效时间 | 基于源IP的粗粒度过滤 |
| 高级ACL | 3000-3999 | 源/目的IP、协议号、源/目的端口、TCP标志、优先级、时间 | 精确匹配特定主机的特定服务 |
| 二层ACL | 4000-4999 | 源/目的MAC、以太网类型、VLAN ID | 局域网内基于MAC的接入控制 |
| 用户自定义ACL | 5000-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.10 | 0.0.0.0 | 255.255.255.255 |
| 192.168.1.0/24网段 | 0.0.0.255 | 255.255.255.0 |
| 192.168.0.0/16网段 | 0.0.255.255 | 255.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/24;
- R1的GE0/0/1接口接PC2所在网段,IP配置为192.168.2.1/24;
- PC1的IP配置为192.168.1.10/24,网关192.168.1.1;
- PC2的IP配置为192.168.2.10/24,网关192.168.2.1。
先把基础配置配好,保证两台PC能互通,这一步排除了路由问题的干扰,后面ACL的效果才看得清楚。
<Huawei>system-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/24,PC2(访客)是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间ACL
ENSP里还有一套非常经典的实验:三层交换机上配置了两个VLAN,PC1在VLAN10,PC2在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的PC,inbound方向一进来就把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,就是掩码写反了。华为命令行在输入时会校验通配符掩码的合法性,有时候输入了错误掩码会提示“mask=xxx 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 Acl's step is 5 rule 5 permit source 192.168.1.0 0.0.0.255 rule 10 deny source any注意看输出里有没有“Acl's step is 5”这行,这是规则编号的步长。如果之前手动改过步长,后续添加规则的编号可能会和你预期不一样。
5.5 从ENSP走向真机:ACL实验后的三个好习惯
在ENSP里练完ACL后,想把这套技能迁移到真实设备上,有几个习惯值得养成。
第一个习惯是保存配置。ENSP里不执行save,重启后配置全没。模拟环境无所谓,但真机上如果不保存,重启就白干了。配置完ACL后记得:
<R1>save第二个习惯是先在模拟器里做“破坏性测试”。我就是故意把ACL配错,比如写反方向和掩码、把放行规则写到deny规则后面,然后观察现象,把错误场景和正确结果对照起来。这样真机出现类似问题时,我大脑里马上能映射出是哪种问题。
第三个习惯是要养成分层过滤的全局观。ACL只对经过它的流量做过滤,如果流量走的是二层路径,比如同一台二层交换机上的两个PC互访,三层路由器上的ACL根本看不见它。配置ACL之前,先画清楚流量走向,再决定过滤点。我在ENSP里做过最多的实验就是验证:ACL放在离源近、离目的近,效果完全不同,这会直接影响你将来的组网方案。
最后说点个人体会:ACL这玩意儿,真的很像开会时的门禁。门禁先看你是不是员工(源IP),再看你有没有会议邀请(目的端口),都符合才让进。很多网络问题看似复杂,拆解成“谁访问谁、想用什么服务、允不允许”三个问题,ACL配置的思路就顺了。ENSP这个平台最大的价值,就是可以反复造故障、试错、查display、改配置,整个过程零成本。多折腾几次,你会发现在真机上调ACL就像做模拟实验一样有把握。