Cisco Packet Tracer里的标准ACL访问控制列表配置是每个学网络的人绕不过去的坎。很多人刚开始接触ACL时被一堆参数和规则搞得云里雾里其实这东西远没有想象中复杂。简单来说ACL就是路由器或交换机上的一张“流量白名单/黑名单”我们通过配置规则来告诉设备哪些数据包能过来哪些不能过来。而标准ACLStandard ACL作为ACL家族里最基础的一员它的特点就一句话——只认源地址不管目标是谁。这篇文章我打算用Cisco Packet Tracer思科官方出的免费模拟器完整演示一遍标准ACL的配置思路从拓扑设计、通配符掩码计算到实际敲命令最后再到验证排错全流程走一遍。不管你是准备考CCNA还是学校里的网络课正在讲这里又或者工作中突然要碰思科设备却心里没底这篇文章都能给你一套可以直接照着抄作业的实操方案。先说清楚一个前提我们讨论的是标准ACL编号范围1-99或1300-1999它只能基于源IP地址做允许或拒绝。它的优点是配置简单、CPU开销小缺点是粒度太粗无法精确到具体端口或目标地址。所以在真实生产环境中标准ACL通常用在“阻止来自某个网段的流量”这种粗粒度场景或者配合扩展ACL做策略配套。需要精确匹配目标IP和端口的地方还得靠扩展ACL。这个定位先明确好后面配置时你才能选对工具。1. 实验准备与拓扑设计思路1.1 为什么用Packet Tracer来学ACL动手练网络配置思科模拟器是首选而Packet Tracer又是这里面最友好的一款。它不需要你有一台真实的路由器或者交换机安装包也只有几百兆打开就能拖设备、连线、敲命令完美复刻思科IOS的命令行操作方式。虽然它和真实的GNS3模拟完整IOS镜像相比功能简化了一些但ACL这种基础配置它的模拟精度已经足够还原真实设备的行为逻辑了。我的建议是初学阶段用Packet Tracer打基础把命令记熟、把处理流程理解透等你对配置逻辑滚瓜烂熟之后再上GNS3做复杂拓扑也不迟。Packet Tracer 9.0之后的版本就已经内置了ACL配置支持下载安装后不需要额外做汉化或插件配置直接用就行。1.2 本次实验的拓扑模型我先画出一个清晰的实验拓扑三台路由器串成一条线分别命名为R1、R2、R3然后R1下面接一台PC代表内部员工网段10.1.1.0/24R3下面接一台PC代表外部服务器或核心资源网段30.1.1.0/24。R2作为中间转发节点让它“顺路”承载ACL的测试任务。PC1IP 10.1.1.10/24网关指向R1的G0/0接口10.1.1.1PC2IP 30.1.1.10/24网关指向R3的G0/0接口30.1.1.1R1与R2之间使用10.1.2.0/30网段R1側为10.1.2.1R2侧为10.1.2.2R2与R3之间使用10.1.3.0/30网段R2側为10.1.3.1R3侧为10.1.3.2为什么选这种“三串一”的结构而不是两台路由器直连原因很实际真实的网络环境里ACL往往部署在中间设备上做管控既要考虑入方向也要考虑出方向并且要验证跨多跳的转发行为。如果只是两台路由器直连你很难真切感受到ACL放错位置带来的转发问题。1.3 各设备接口IP配置参考每个设备接口的具体IP分配如下表按照这个表配置能确保全网路由可达后续配置ACL时不会被三层连通性问题干扰。设备接口IP地址子网掩码说明R1G0/010.1.1.1255.255.255.0连接PC1R1G0/110.1.2.1255.255.255.252连接R2 G0/0R2G0/010.1.2.2255.255.255.252连接R1 G0/1R2G0/110.1.3.1255.255.255.252连接R3 G0/0R3G0/010.1.3.2255.255.255.252连接R2 G0/1R3G0/130.1.1.1255.255.255.0连接PC2这里有个经验要分享实验环境里链路网段用/30子网是非常好的习惯。一个/30只包含4个IP其中2个可用正好够一条点到点链路两端使用既节约地址又方便排查问题。你一眼就能看出10.1.2.0/30和10.1.3.0/30是两条不同的链路不会搞混。1.4 路由配置让全网先“通”起来配置ACL之前必须先保证没有ACL的情况下全网能正常通信否则后面你很难判断是路由问题还是ACL拦截问题。这里建议在每台路由器上配置OSPF或者静态路由对于这个小型拓扑静态路由反而更直接R1上配置ip route 10.1.3.0 255.255.255.252 10.1.2.2抵达R2-R3链路网段R1上配置ip route 30.1.1.0 255.255.255.0 10.1.2.2抵达PC2所在网段R2上配置ip route 10.1.1.0 255.255.255.0 10.1.2.1抵达PC1所在网段R2上配置ip route 30.1.1.0 255.255.255.0 10.1.3.2抵达PC2所在网段R3上配置ip route 10.1.1.0 255.255.255.0 10.1.3.1抵达PC1所在网段R3上配置ip route 10.1.2.0 255.255.255.252 10.1.3.1抵达R1-R2链路网段配置完成后分别在PC1上ping PC230.1.1.10能通就说明基础网络OK。都通了你再开始ACL的配置这样ACL一放上去效果立刻就能看到对比。2. 标准ACL的核心原理与通配符掩码2.1 标准ACL的判定逻辑标准ACL的规则很简单路由器收到一个数据包后把包里的“源IP地址”提取出来从上到下逐一跟ACL规则比对。第一条规则匹配了就按这条规则的动作执行permit或deny不再继续往下看。如果所有规则都没匹配上那么最后会被“隐含拒绝”implicit deny any给拦掉。很多新手只记住了“ACL从上到下匹配”却忽略了一个关键点——每个接口、每个方向只能应用一个ACL。如果你有两个想法需要同时落地比如“拒绝10.1.1.0网段”和“拒绝192.168.1.0网段”你必须把两条规则写在一个ACL编号里而不是建两个ACL然后用两次后者会覆盖前者。这个特性和婚姻有点像一个方向上一个选项就够了多一个就会出问题。2.2 通配符掩码Wildcard Mask的理解与计算标准ACL在写规则时必须携带通配符掩码wildcard mask这是很多人第一次接触时最容易卡住的点。它的作用是指明IP地址中哪些位需要精确匹配哪些位可以忽略。通配符掩码的规则用八个字就能概括0要精确1可忽略。也就是说通配符掩码中二进制为0的位对应IP地址的这位必须完全一致二进制为1的位这位随便是什么都行。举个例子我们要匹配“10.1.1.0/24整个网段”也就是源IP地址的前24位必须是10.1.1后8位随意。那么通配符掩码就是0.0.0.255。将其写成二进制非常直观前24位为0表示前24位要精确匹配后8位为1表示后8位不关心。在Packet Tracer中你不需要自己转二进制但有一条公式能帮你快速算出大多数情况下的通配符通配符掩码 255.255.255.255 - 子网掩码比如子网掩码是255.255.255.0相减得到0.0.0.255子网掩码是255.255.255.252/30相减得到0.0.0.3子网掩码是255.255.255.128/25相减得到0.0.0.127都验证无误。这里有个特殊但常见的通配符通配符掩码为0.0.0.0时表示匹配一台主机。比如“10.1.1.10 0.0.0.0”就代表精确匹配IP为10.1.1.10的主机也可以用关键字host简化写作host 10.1.1.10。这个后面配置时会用到。2.3 为什么标准ACL要放在靠近目标端这一点我觉得值得多说两句。扩展ACL要放在离源端近的地方这样才能在流量刚进入网络时就拦截掉节省链路带宽但标准ACL恰恰相反它只认源地址如果放在离源端太近的位置很可能把所有来自该网段的流量一竿子打死导致其他合法服务也被误伤。更严谨的说法是标准ACL尽量部署在“离目标最近”的那台路由器上。这样做的原因是标准ACL缺乏目标信息只有让数据包经过尽可能多的转发路径后你才更有把握只影响那些真正需要到达特定目的地的流量。你看IT里的很多设计乍一听反直觉拆开揉碎讲又非常合理。3. 在Packet Tracer中配置标准ACL的完整操作3.1 配置前检查确认全网互通打开Packet Tracer后按照前面分配的IP配置好所有接口和路由。在PC1的命令行窗口输入ping 30.1.1.10如果返回的丢包率是0%说明全网三层连通性没有问题。注意在Packet Tracer里有时候第一次ping会因为ARP解析而超时这是正常的多ping几次再看结果。确认连通后还要在R2上查看一下路由表Router enable Router# show ip route确保路由表里存在10.1.1.0/24和30.1.1.0/24的路由条目。只有路由表完整ACL的拦截行为才不会被路由问题干扰。3.2 需求 1拒绝10.1.1.0网段访问30.1.1.0网段我们先做一个最简单的需求PC1所在的10.1.1.0/24网段禁止访问PC2所在的30.1.1.0/24网段。注意这里只要求“源网段10.1.1.0/24”过来的流量被禁止其他网段不受影响。按照前面说的套路标准ACL要放在靠近目标端的地方。这个流量经过了R1、R2、R3三台设备最终目标在R3下方所以我们应该把ACL应用在R3的G0/1接口上方向是in从PC2侧进来。等一下这里是不是用错了方向别急我先解释完整。如果你把ACL应用在R3的G0/1接口上且方向为in那么它过滤的是从PC2侧进入R3的流量也就是PC2发起、要回给PC1的响应流量。由于标准ACL只匹配源地址这条反向流量源地址是30.1.1.10跟规则“拒绝10.1.1.0网段”不匹配而被放行——最终效果是PC1能ping通PC2但PC2也能正常回包实际没有拦截效果。所以正确的做法是把ACL应用到流量进入网络的“最靠近目标端的入方向接口”。在这条链路里从PC1来的流量到达R3的方式是进入R3的G0/0接口因此要在R3的G0/0接口上配置方向为in的ACL过滤来自10.1.1.0网段的数据包。来我们把这个逻辑逐字拆解数据包从PC1出发到达R3时是从R3的G0/0接口进来的然后路由器检查这个入方向的ACL发现源地址10.1.1.1匹配拒绝规则直接丢弃数据包根本到不了R3的G0/1接口。这就是“入方向接口”的含义。那为什么不是R2因为R2离目标端PC2相对较远只有到R3才是“离目标最近”。配置如下Router enable Router# configure terminal Router(config)# access-list 1 deny 10.1.1.0 0.0.0.255 Router(config)# access-list 1 permit any Router(config)# interface g0/0 Router(config-if)# ip access-group 1 in这里有一个特别容易忽略的点永远记得在ACL末尾加上一条permit any。因为ACL有隐含拒绝implicit deny any如果你只写了deny语句那么ACL末尾会默认拒绝所有其他流量等于把整个网络给断掉了。加一条permit any是常规操作不是可选项。配置完后回到PC1再ping PC2预期结果是Request timed out请求超时。与此同时你可以在PC2上反ping PC1观察现象如果ACL只应用在R3的G0/0入方向从PC2发起的ping包源地址是30.1.1.10不受规则限制能到达R1但回包到R3时被ACL拦了。所以要严格验证时请以“从PC1发起ping到PC2”作为测试手段。3.3 需求 2拒绝指定主机访问外部网络有时候不需要封掉整个网段只需要针对某一个人或者某一台机器做限制。比如只想让PC110.1.1.10无法访问外部网络其他PC不受影响这时可以用host关键字或通配符0.0.0.0精确定位Router(config)# access-list 10 deny host 10.1.1.10 Router(config)# access-list 10 permit any Router(config)# interface g0/0 Router(config-if)# ip access-group 10 in验证方式依然是去PC1上ping PC2应该不通。如果你想验证“其他主机不受影响”可以再添加一台PC3并设置IP为10.1.1.11网关指向10.1.1.1再用PC3去ping PC2你会发现它是通的因为ACL规则只匹配10.1.1.10这一个源地址。这个需求在实际工作里非常常见。比如公司办公网里有人中了病毒在疯狂扫描外网你可以先用标准ACL把他的IP拉黑快速止损再慢慢排查原因。虽然粒度比较粗但胜在配置速度快。3.4 需求 3使用命名标准ACL提升可读性编号ACL用起来虽然方便但认真想想你真的记得住1号ACL是干嘛的、2号ACL又管什么吗在实际工程项目中建议养成使用命名ACLnamed ACL的习惯给策略起一个有意义的名字比如BLOCK_HR或ALLOW_SALES。配置命名标准ACL的命令稍微有一点不同Router(config)# ip access-list standard BLOCK_PC1 Router(config-std-nacl)# deny host 10.1.1.10 Router(config-std-nacl)# permit any Router(config-std-nacl)# exit Router(config)# interface g0/0 Router(config-if)# ip access-group BLOCK_PC1 in看见没有核心区别在于从access-list变成了ip access-list standard然后进入了类似子配置模式的环境。在这种模式下你输入一条deny或permit就自动成为ACL的一条规则不需要再重复access-list 10前缀。当ACL规则条数变多、策略越来越复杂时这种配置方式看起来舒服得多。我个人强烈推荐从你开始学ACL的第一天起就把命名ACL当作默认选择。即使你的需求再简单也尽量练习这种写法因为它更接近真实设备里的错综复杂的配置场景也能让你跟别人协作时更快理解彼此的意图。3.5 如何将ACL从接口上移除移除接口上的ACL有两种常见方式分别是移除接口绑定和删除ACL本身注意区别移除接口绑定no ip access-group 1 in生效后路由器仍然保留编号1的ACL规则只是不再应用于该接口删除ACL本身no access-list 1如果ACL已经绑定在接口上删除时记得先把绑定关系解除否则会报错或残留配置这里说句经验之谈模拟器里的配置没有“保存即生效”的错觉你敲完no命令后配置立即生效。如果后续实验步骤要反复调整ACL建议先保留ACL规则只通过no ip access-group临时解除绑定调试稳定后再重新绑定避免反复敲规则。3.6 标准ACL的放置位置实践在真实的生产环境里“标准ACL放靠近目标端”是一个原则但具体放在哪台设备还要结合现有网络架构来判断。比如你在一个多区域网络里标准ACL可能放在汇聚层而不是核心层或者接入层。但Packet Tracer实验中我们只用三台路由器串联所以这个原则可以直接落实为“放在离PC2最近的那台路由器入接口上”。万一你反着来把标准ACL放在R1的入接口上会怎样我们来推演一下如果R1 G0/0接口in方向绑定deny 10.1.1.0 0.0.0.255那么从PC1进入R1的所有源地址为10.1.1.x的数据包全部被丢弃R1根本不会把它们转发给R2。这个效果跟放在R3其实是一样的但仔细想如果PC1网段还有其他合法流量需要去其他目的地比如PC1访问R2上的某台服务器假设有的话这个流量也会因为ACL匹配而误伤。这正好解释了为什么标准ACL不能放源端它也“看不见”具体目标所以只有放在目标附近才能只在最后关头对“想要拒绝的流量”做处决避免伤及无辜。4. 验证ACL效果与排错全记录4.1 用ping和show命令验证配置完ACL后不要急着收工得认认真真验证一遍。我习惯的验证顺序是第一步在PC1上ping PC2。如果不通说明ACL生效了。这里有个细节在Packet Tracer中ping超时有时是因为ICMP回包被丢弃但路由器没有回显所以你看到超时不要慌可以用show ip access-lists看看匹配计数器的变化。第二步看匹配计数。在R3上执行Router# show ip access-lists Standard IP access list BLOCK_PC1 10 deny host 10.1.1.10 (4 matches) 20 permit any (12 matches)这个输出非常直观deny这条规则后面的(4 matches)表示已经有4个来自10.1.1.10的数据包被拦下来了。匹配次数在增加说明ACL正在正常工作。如果匹配次数一直都是0那大概率是ACL放错了接口或者方向有问题。第三步用show run检查接口下的配置Router# show running-config interface GigabitEthernet0/0 ip access-group BLOCK_PC1 in确认ACL确实绑定在目标接口的正确方向上。4.2 常见问题ACL配置了但没生效ACL没生效是新手甚至老手最容易踩的坑。我总结了一下常见原因基本就这几个问题现象可能原因排查方法ping仍然通ACL绑错接口show run检查接口方向ping仍然通通配符掩码写错重新计算通配符先用host单台测试ping仍然通没加permit any导致暗坑show ip access-lists查看完整规则全网不通deny规则误伤正常流量检查ACL放置位置确认是否太靠近源端数据包能出去但回不来ACL放在出方向而非入方向确认你的ping发起端和目标端方向其中最让人头疼的是“通配符掩码写错”。比如你想匹配10.1.1.0/24网段却又把掩码写成0.0.255.255那样实际匹配的是“前16位精确为10.1”的所有地址会把10.1.x.x整个大段流量给拦了。这种问题光看show命令不容易发现建议先把需求写下来再手动算一遍通配符再敲进设备。4.3 实战排查从PC1无法访问PC2开始我们模拟一个极具代表性的排错场景。上午刚把ACL配置到R3上下午有人报障说PC1无法访问PC2。请快速定位问题。排查思路是这样先在R2上执行show ip access-lists看计数器发现ACL规则匹配次数是0说明流量根本没到R3就被丢弃或转发出错于是重点怀疑路由表或ACL放错了设备。接着show ip route检查R2上是否有10.1.1.0/24路由发现缺少这条路由补上后PC1再到PC2仍然不通。这时再到R3上做检查发现接口G0/0确实绑定了ip access-group 10 in但编号10的ACL只写了deny host 10.1.1.10没有写permit any导致其他来自10.1.1.11或PC1网关10.1.1.1的数据包全部被隐含拒绝挡在外面。把permit any补上后再测试通断恢复正常。这个案例几乎涵盖了日常ACL排错的所有要点位置、方向、规则完整性、路由可达性。4.4 实战技巧调试ACL前备份配置别嫌我啰嗦这个习惯越早养成越好。在Packet Tracer中虽然不像真实设备那样容易出事故但人总是会反复试错。每次改ACL之前先执行show running-config把当前配置备份到记事本里等试到失败时直接把备份粘回去就能恢复原状比一点点revert命令快得多。多说一个有用的辅助技巧在ACL调试期间可以把规则动作改成permit或deny来回切换观察匹配计数器的增减来推断ACL是否命中。这个思路在真实设备上同样适用而且匹配计数器本身不会撒谎。5. 标准ACL配置的几个坑与心得分享5.1 记得在末尾加permit any这一点我已经提到过好几次了但因为它实在太重要我用一段话再强调一下。ACL的处理逻辑是自上而下逐一匹配如果数据包不匹配任何规则则会被末尾隐含的deny all拦下。所以你的ACL如果只写了deny规则其他所有流量都会被默认拒绝。这个“默认拒绝”在安全设计里是好事但在你只想拦一小部分流量时它会变成事故现场。无论什么时候只要你希望“只拒绝特定流量、其他放行”就一定要在最后一条写上permit any。在命名ACL里这条规则直接写permit any即可。5.2 注意标准ACL 只能匹配源地址的边界再给一次忠告标准ACL的匹配维度只有源IP。如果你接到需求“允许10.1.1.0/24访问服务器A的Web端口但不能访问服务器B”那这个需求用标准ACL是完不成的你必须使用扩展ACL才能同时匹配目标IP和目的端口。用标准ACL硬做的话要么误伤太多要么根本无效。要判断某个需求到底该用标准还是扩展ACL你只需要问自己一句话要过滤的条件里除了源地址之外还涉及目标地址或端口吗如果涉及果断换扩展ACL。标准ACL从来不是万能的把工具用对场景才算真正懂网络。5.3 接口方向和ACL匹配顺序的关系很多人在“方向”上纠结很久。我提供一个简单的心法站在路由器视角看数据包的流动方向。数据包进入路由器时从某个接口“进”来离开路由器时从某个接口“出”去。ACL应用在哪个接口上、哪个方向就决定了它会检查什么时机的数据包。入方向ACL在路由查找前生效数据包进到路由器接口先检查ACL如果被deny直接丢弃不再做路由查找如果permit再走下一步。出方向ACL在路由查找后生效数据包先查路由表确定要往哪个接口转发再检查该接口的出方向ACL。这个先后顺序对排错非常重要比如入方向deny会导致匹配计数器不增长数据包在更早就被丢了而出方向deny则会让路由表正常工作但最终丢弃。在Packet Tracer里验证这一顺序也很简单你在R3的G0/0接口上绑一个入方向标准ACL把PC1的ping拦下然后再去R3上show ip route你会发现路由表没有任何异常。这说明ACL过滤发生在路由表处理之前被deny的包根本不会参与路由决策。5.4 命名ACL的编辑小技巧使用命名ACL后如果你要往已有规则中插入一条新规则方式是通过sequence号序列号来控制。比如Router(config)# ip access-list standard BLOCK_PC1 Router(config-std-nacl)# 15 deny host 10.1.1.20这样第15号规则就被插入到10号和20号之间。在Packet Tracer 9.0及以上版本插入规则的功能表现还算不错不过在更早的版本中如果不指定序号新规则会被追加到末尾这点要注意。如果你发现新写的规则怎么都不生效多半就是因为被追加到了列表末尾连隐含拒绝都没挡住前面的规则。5.5 好好利用ping和扩展ping来验证在命令行环境下ping命令有时不足以模拟真实复杂的流量特征。如果你在路由器上发起扩展pingping后按回车进入交互模式可以手动设置源地址、目标地址、重复次数等参数这样可以模拟来自特定源IP的流量方便测试ACL是否拦截正确。比如在R1上执行扩展ping源地址填10.1.1.1目标地址填30.1.1.10然后观察是否被R3拦截。这种精确控制源地址的验证方法在标准ACL场景里尤其好用因为它不需要额外配置PC的IP地址直接用路由器来模拟即可。6. 从模拟器到真实设备标准ACL的工程化扩展6.1 真实设备上的差异点很多人在Packet Tracer里配得飞起一到真实思科路由器上就有点发怵其实核心命令没有任何区别。不过真实设备需要注意几点IOS版本不同可能默认开启或关闭某些ACL相关的特性有些新版本IOS支持写ACL时使用对象组object-group来批量匹配但Packet Tracer暂时不支持。基础的access-list、ip access-group这两种命令在真实设备上用法完全一致你在这篇文章里练会的这些命令直接拿到真实设备上也能马上上手。6.2 用show access-lists和debug ip packet配合排查如果实在排查不出问题可以打开调试功能看看真实命中的细节。在R3上执行Router# debug ip packet这个命令会打印路由器收到和转发的每个数据包细节包括接口、源地址、目标地址以及被ACL丢弃的原因。注意在生产环境上开启debug要非常小心因为它会消耗大量CPU资源可能影响业务。但在Packet Tracer里随便折腾不会出大问题。用完记得关掉Router# undebug all用debug能看到很多show命令看不出来的信息比如数据包是不是在入方向就被丢了、ACL匹配顺序是否符合预期。如果说show命令是看“静态结果”那么debug就是看“动态过程”两个配合起来几乎没有解不了的ACL问题。6.3 往扩展ACL迁移的路线标准ACL只是入门等你把它吃透了扩展ACL就是顺理成章的下一个学习点。学完标准ACL之后你可以先尝试把一个需求改写成扩展ACL版本比如不只限制源地址10.1.1.0/24还限制目标端口只能是80端口或443端口再配置到R3上你立刻就能体会到扩展ACL和标准ACL的粒度差异。迁移的关键是理解扩展ACL的语法结构access-list 100 permit tcp 10.1.1.0 0.0.0.255 host 30.1.1.10 eq 80。多了一个协议字段tcp、目标地址、目标端口规则表达力立刻提升一个档次。在动手做扩展ACL之前把标准ACL的通配符和方向逻辑打扎实你会发现扩展ACL学起来特别快。写在最后的实操体会标准ACL这个东西刚学的时候觉得简单写着写着就发现不少细节上的门道。我在模拟器里帮别人做实验时看到最多的错误就是ACL方向搞反、通配符算错、忘了写permit any。这三个坑在Packet Tracer里酿成的后果都是“原本通的一下子不通了”好在都是学习环境正好让你把排错练熟。真正到了实际网络环境这几个习惯才是决定你下班时间的因素。我自己有个小习惯每次配ACL前都会先写一行注释把需求中用一句话写清楚谁禁止访问谁方向是什么放在哪台设备哪个接口。需求明确后再动手配置效率高一半。这篇内容里讲的每个配置你都值得亲手在Packet Tracer里敲一遍只有真的敲错一次、再排查一次ACL的处理逻辑才会真正长在脑子里。