4564 字
23 分钟
CCNA项目6-访问控制列表ACL

访问控制列表(ACL)#

核心定义#

访问控制列表(Access Control List) 是一张规则列表,这些规则定义了哪些用户或系统进程可以对给定的对象(如文件、网络端口、系统资源等)进行哪些操作(如读、写、执行)。

简单来说,ACL 就是一个“门卫”,它根据一份“授权名单”来决定是“允许”还是“拒绝”某个访问请求。

ACL 的主要应用场景#

ACL 主要应用于两个大的领域:

  1. 文件系统 ACL:管理对文件和目录的访问。

    • 例如:你可以设置一个规则,允许“用户A”读取和写入“报告.doc”,但只允许“用户B”读取,而拒绝“其他所有用户”的任何访问。

    • 权限:指代“什么操作”。通常是:

      • :查看文件内容或目录列表。
      • :修改文件内容或在目录中创建/删除文件。
      • 执行:运行程序或进入目录。
  2. 网络 ACL:管理流经网络设备(如路由器、防火墙)的数据流量。

    • 例如:你可以设置一个规则,允许来自IP地址 192.168.1.100 的电脑访问互联网,但拒绝它访问内网的服务器 192.168.1.50

尽管应用场景不同,但其核心思想是相通的。

网络 ACL#

网络 ACL 应用于路由器、交换机或防火墙等网络设备,用于控制网络流量的进出。

主要有两种使用方式:

  1. 与路由器的一个接口进行绑定,来管理该接口的入向和出向的流量
  2. 在路由器上创建一个ACL,这个ACL只用于识别网络中的兴趣流量,例如主机A发往x网络的流量我感兴趣,那么就通过ACL抓取这股流量,增加它的转发效率,这是QoS;或者针对这股流量,通过特殊路径进行单独的发送,这个叫策略路由,等等。

1. 基本组成要素#

一条网络 ACL 规则通常基于数据包的头部信息进行匹配,并执行“允许”或“拒绝”操作。

  • 规则号:规则执行的顺序,通常从小到大匹配。
  • 动作允许拒绝
  • 协议:TCP, UDP, ICMP 等。
  • 源信息:源 IP 地址、源端口。
  • 目标信息:目标 IP 地址、目标端口。
  • 方向入站出站

2. 示例(网络防火墙规则)#

假设你要保护一台 Web 服务器(IP: 192.168.1.10, 使用 TCP 80 端口),其入站 ACL 可能如下:

规则号动作协议源IP源端口目标IP目标端口说明
10允许TCP任何任何192.168.1.1080允许所有人访问网站
20允许TCP办公室IP任何192.168.1.1022允许办公室IP通过SSH管理服务器
30拒绝任何任何任何192.168.1.10任何显式拒绝其他所有流量(隐式拒绝显式化)
40允许任何任何任何任何任何允许其他不匹配的流量通过(非严格策略)

重要特点

  • 顺序至上:设备从规则号最小的开始匹配,一旦匹配就执行动作,不再继续检查。因此规则的顺序至关重要。
  • 隐式拒绝:思科绝大多数网络ACL在规则列表的末尾都有一条“拒绝所有”的隐式规则。如果数据包不匹配任何一条“允许”规则,它将被丢弃。上表中的规则30就是将“隐式拒绝”变为“显式拒绝”的例子。

网络ACL与ACE#

例如配置了三条策略:

  1. 主机A访问网络X的流量过滤掉
  2. 主机B访问网络Y的流量过滤掉
  3. 主机A访问网络X的流量放行

对于1和3,看着冲突,其实在ACL中是允许这种情况的,对于每条ACE,都有一个优先级,会根据优先级进行匹配,谁优先级高就优先使用谁执行策略,优先级通过序列号体现

  • ACE:访问控制实体,ACL中的每一条策略就是一个访问控制实体
  • 序列号:每创建一条策略都带有一个序列号,默认第一条策略为10,第二条为20,第三条为30,以此类推
  • 对于这里1和3冲突的情况,由于1的优先级更高,所以3没有用处,因为只要符合条件就被1过滤掉了
  • 推荐策略之间的序列号不要写的太近,以10为梯度增长比较合适,后面在补救时可能有新的策略需要插入

那么如果两条策略的优先级序列号是一样的呢?会冲突吗?

  • 不会,两条策略优先级相同的情况下,后写入的策略会覆盖先写入的策略

相同方向可以配置两个ACL吗?#

答案是:通常情况下,一个接口的一个方向(进或出)只能直接应用一个ACL。

  • 技术规则:在绝大多数路由器(如Cisco、Huawei等)上,当你使用命令(如 ip access-group)将一个ACL应用到一个接口的特定方向时,它会替换掉该接口该方向上之前应用的ACL,而不是叠加。

  • 配置示例

    Terminal window
    # 第一次配置,应用了ACL 101到GigabitEthernet0/0的出方向
    interface GigabitEthernet0/0
    ip access-group 101 out
    # 如果你再配置应用ACL 102到同一个接口的出方向
    interface GigabitEthernet0/0
    ip access-group 102 out

    结果:第二条命令会生效,而第一条命令会被覆盖。最终,只有ACL 102被应用到G0/0接口的出方向。

但是,如何实现“两个ACL”的效果?

如果你的需求是合并两个ACL的策略,你不需要在接口上绑两个ACL,正确的做法是:

  1. 创建一个新的、更全面的ACL:将原来两个ACL(假设是ACL 101和ACL 102)的规则,按照正确的优先级顺序,合并到一个新的ACL(比如ACL 103)中。
  2. 将新ACL应用到接口:然后将这个新的ACL 103应用到接口的出方向。

那么如果两个ACL一个配置到出方向一个配置到入方向呢?#

为同一个接口(G0/0)同时配置入方向和出方向的ACL,就像是给这个接口的大门配备了两道独立的安检程序

  1. 入方向ACL:相当于 “进门安检”。只对这个接口入向的数据生效。
  2. 出方向ACL:相当于 “出门安检”。只对这个接口出向的数据生效。

这两套规则各自独立工作,互不冲突,因为它们在不同的时间点、针对数据流的不同方向进行过滤。

下面我们用一个具体的网络场景来代入这个流程:

场景设定:

  • 路由器接口 G0/0 连接着 公司内部网络192.168.1.0/24)。
  • 路由器接口 G0/1 连接着 互联网

目标:

  1. 入方向ACL目标:保护路由器本身和内部网络,只允许内部网络的管理员IP(192.168.1.100)通过SSH管理路由器。
  2. 出方向ACL目标:控制内部员工的上网行为,只允许他们浏览网页和收发邮件,但禁止访问社交媒体。

配置思路:

1. 配置 G0/0 的入方向ACL(作为“进门安检”) 这条规则在数据包进入路由器时立即生效。

  • 规则:允许源IP为 192.168.1.100 的机器访问路由器的SSH端口(TCP 22);拒绝所有其他来自内部网络的流量进入路由器。
  • 效果:
    • 管理员PC(.100)发起的SSH连接请求可以被放行,进入路由器进行处理。
    • 其他员工电脑(如.101)发起的任何访问路由器本身的流量(如ping、telnet)都会在“进门”时被丢弃。这极大地增强了路由器的安全性。

2. 配置 G0/0 的出方向ACL(作为“出门安检”) 这条规则在数据包经过路由查询,确定要从G0/0发送出去之前生效。

  • 规则:允许内部网络(192.168.1.0/24)访问外部网络的Web(TCP 80/443)和邮件(TCP 25/110/143)端口;显式拒绝所有其他流量(包括访问社交媒体)。
  • 效果:
    • 当任何内部员工(包括管理员.100)访问网站时,数据包路由后会发现需要从G0/1口出去(前往互联网),因此不受G0/0出方向ACL影响
    • 但是,如果路由器需要从G0/0口向内部网络返回数据(例如,响应内部员工的DNS查询),这些返回的数据包在离开G0/0之前,就会受到G0/0出方向ACL的检查。如果规则允许,则放行;如果规则禁止,则丢弃。

写策略的指导性原则#

精确的策略写在前面(序列号小一点)

模糊的策略写在后面(序列号大一点)

思科与华为对ACL中无法匹配的流量处理思路#

思科是如果没有匹配的ACL策略,则进行丢弃

  • 隐式拒绝:思科绝大多数网络ACL在规则列表的末尾都有一条“拒绝所有”的隐式规则。如果数据包不匹配任何一条“允许”规则,它将被丢弃。

而华为如果没有匹配的ACL策略,则自然处理,按路由表条目中的下一跳去自然转发

ACL 的优势与挑战#

优势

  1. 精细控制:可以实现非常细粒度的权限管理。
  2. 安全性:是实践“最小权限原则”(用户只拥有完成其工作所必需的最低权限)的关键工具。
  3. 灵活性:可以根据需要轻松添加、修改或删除规则。

挑战

  1. 管理复杂性:当对象和用户数量庞大时,ACL 会变得非常复杂,难以管理和排错。
  2. 性能开销:每条网络数据包或文件访问请求都需要与ACL规则进行匹配,规则越多,性能开销可能越大。
  3. 容易出错:错误的规则顺序或配置可能导致安全漏洞或服务中断。

网络中通信的数据是什么结构的,报头是什么,包含什么内容#

例如用微信发一条消息,这条消息就叫数据载荷,但是这个数据载荷不能直接发送,因为交换机看不懂App的数据。如果想让接收者能够接收到该消息,那么就需要给数据载荷封装接收者的信息,信息不能直接添加到数据载荷中,要添加到数据报头

  • 数据载荷:应用产生的数据本身

  • 数据封装:就是给数据载荷封装报头,例如:

    Ethernet2 | IPv4 | UDP | 数据载荷 | FCS
    L2 |L3 |L4 | |报尾
    • L4层报头有两个比较重要的字段:
      • 源端口,目的端口
    • L3层报头有两个比较重要的字段:
      • 源IP地址,目的IP地址,这两个字段主要就是给路由器看的,让路由器知道数据从哪来的,发到哪里去
    • L2层报头有两个比较重要的字段:
      • 源MAC地址,目的MAC地址,这两个字段主要给2层交换机看的

    最后封装成数据帧(Frame)然后发走

对以下网络#

PixPin_2025-09-29_13-55-36

思考:如果PC4和PC5都想发数据给PC7,我想让PC4的数据被丢弃,PC5的数据被放行,应该怎么处理?

  • 过滤IP地址

  • 为什么MAC地址不行呢?

    • IP地址是3层地址:能在整个Internet范围内标识一个节点
    • MAC地址是2层地址:只能在一个网络内标识一个节点,也就是说过一个路由器后,不在一个网络内的主机就不关心你的MAC地址了

如何利用数据报头中的内容进行流量过滤#

根据3层报头源IP目的IP、4层报头的源端口目的端口进行区分

出向和入向过滤问题#

出向调用

PCA----R1----R2----PCB

对于以上网络连接,如果想过滤主机A到主机B的流量,可以配置R1的出向ACL,这样就能将主机A到主机B的流量干掉

  • 但是R1到主机B的流量不会被过滤,因为出向ACL只能过滤穿越流量,不能过滤始发流量
  • 对路由器来说99%的流量都是穿越流量,极少部分是始发流量,例如路由器发出的路由协议更新(OSPF、BGP),路由器对Ping请求的回复这种才是始发流量

入向调用

而入向调用是无敌的,只有转会针对该接口收到的所有数据都生效

一句话总结:

入方向ACL是“门卫”,决定谁可以进入路由器大院(无论是来找院里的某个人(路由器本身),还是只是穿堂过)。出方向ACL是“出口检查员”,只检查那些从别处进来、现在要离开的“访客”(穿越流量),而不管“大院里的居民”(路由器自身产生的流量)要出去干什么。

ACL的分类#

标准ACL(华为叫基本ACL)

纯三层的工具,只能基于3层报头的源IP地址做流量的区分,也就是说只关注流量的信源是谁

  • 由于过滤的太绝对了,对主机A发给其它主机的流量,直接识别是主机A就全给干掉了,一刀切,所以一般用于抓取兴趣流量
  • 思科设备创建标准ACL时,如果命名方式为数字型ACL,那么取值范围是1~99,华为设备取值范围是2000~2999

扩展ACL(华为叫高级ACL)

工作在3和4层的工具,能根据源IP目的IP协议类型ProtocolTTL报头长度源端口目的端口、等等来做流量识别

  • 思科设备创建扩展ACL时,如果命名方式为数字型ACL,那么的取值范围是100~199,华为设备是3000~3999

如何区分ACL#

数字型ACL

就是ACL的名字,例如:10、20等

命名型ACL

命名时包含多种字符,例如:ACL-IT等

思科实操#

网络规划#

PixPin_2025-10-02_21-59-02

  • 主机4不能访问主机7,但是可以访问所有其他人

  • 主机5不能访问主机6,但是可以访问所有其他人

  • 选择在哪个路由器上配置?

    • 优先在靠近信源的路由器上过滤数据,例如这里过滤主机4和主机5的数据,就在R2上过滤

路由器基础配置#

enable
configure terminal
hostname <名字,例如:R1>
interface ethernet <接口>
no shutdown
ip address <IP地址,例如:12.1.1.1> <子网掩码:255.255.255.0>

配置后通过show ip interface brief查看配置后的状态

主机基础配置#

ip <IP地址> <子网掩码> <网关>
# 例如:ip 4.4.4.4 255.255.255.0 4.4.4.254

EIGRP协议配置#

enable
configure terminal
router eigrp <进程号,例如:90>
no auto-summary
eigrp router-id <路由器ID,例如:1.1.1.1>
# 将接口宣告进EIGRP,此处例子为精确宣告,需要将路由器的接口和环回口都宣告进EIGRP
network <接口IP地址,例如:12.1.1.2> <通配符掩码,例如0.0.0.0>
# 注意连接主机的接口在宣告时,推荐宣告整个子网
network <接口IP地址,例如:4.4.4.254> <通配符掩码,例如0.0.0.255>
  • 思科设备使用ping <目的IP> source <源IP>去带源ping

  • 配置后通过show run | section eigrp来查看配置记录

  • 通过show ip route查看路由状态

ACL配置#

enable
configure terminal
# 写法一:配置按IP过滤的流量,该策略默认优先级是10,拒绝主机4访问主机7的
access-list 100 deny ip <源IP,例如4.4.4.4> <反码,0.0.0.0> <目的IP,7.7.7.7> <反码,0.0.0.0>
# 写法二:拒绝主机5访问主机6的
access-list 100 deny ip host 5.5.5.5 host 6.6.6.6
# 最后要写一条放行任意地址的策略,因为思科最后会拒绝掉所有策略中未匹配到的流量
access-list 100 permit ip any any
# 在R2出方向调用ACL
interface ethernet 0/1
ip access-group 100 out
  • access-list 100 deny ?可以查看更多过滤条件

  • host 5.5.5.5等同于5.5.5.5 0.0.0.0

  • any等同于0.0.0.0 255.255.255.255

  • ACL策略写完后通过show ip access-lists查看配置状态

  • ACL配置到接口后通过show ip interface ethernet 0/1

    • 输出:Outgoing access list is 100Inbound access list is not set

华为实操#

PixPin_2025-10-03_19-59-59

PixPin_2025-10-06_09-03-57

  • 主机4不能访问主机7,但是可以访问所有其他人
  • 主机5不能访问主机6,但是可以访问所有其他人

路由器+OSFP协议配置#

AR1
system-view
sysyname AR1
interface GigabitEthernet 0/0/0
ip address 13.1.1.1 24
interface GigabitEthernet 0/0/0
ip address 12.1.1.1 24
ospf 10 router-id 1.1.1.1
area 0
network 12.1.1.1 0.0.0.0
network 13.1.1.1 0.0.0.0
AR2
system-view
sysname AR2
interface GigabitEthernet 0/0/1
ip address 12.1.1.2 24
interface GigabitEthernet 0/0/0
ip address 4.4.4.254 24
interface GigabitEthernet 0/0/2
ip address 5.5.5.254 24
ospf 10 router-id 2.2.2.2
area 0
network 12.1.1.2 0.0.0.0
# 下面两个推荐用0.0.0.255
network 4.4.4.254 0.0.0.0
network 5.5.5.254 0.0.0.0
AR3
system-view
sysname AR3
interface GigabitEthernet 0/0/0
ip address 13.1.1.2 24
interface GigabitEthernet 0/0/1
ip address 6.6.6.254 24
interface GigabitEthernet 0/0/2
ip address 7.7.7.254 24
ospf 10 router-id 3.3.3.3
area 0
network 13.1.1.3 0.0.0.0
# 下面两个推荐用0.0.0.255
network 6.6.6.254 0.0.0.0
network 7.7.7.254 0.0.0.0
  • 配置后通过display ospf peer brief查看有没有学到邻居
  • 通过display ip routing-table protocol ospf查看有没有OSPF的路由

ACL配置#

acl number 3000
# 可以指定每个策略的序列号,过滤4.4.4.4到7.7.7.7的流量
rule 10 deny ip source 4.4.4.4 0.0.0.0 destination 7.7.7.7 0.0.0.0
# 简写方法:
rule 20 deny ip source 5.5.5.5 0 destination 6.6.6.6 0
# 华为的最后不用加全部放行策略,因为华为最后没有隐藏的丢弃全部未匹配的,想加也可以,写法如下
rule 30 permit ip
# 在g0/0/1口出向调用
interface GigabiteEthernet 0/0/1
traffic-filter outbound acl 3000
  • rule 30 permit ip:不写源地址代表源地址为any,不写目的地址代表目的地址为any

  • traffic-filter inbound acl <名称>:入向调用

  • 配置后使用display acl 3000查看acl策略配置了哪些

CCNA项目6-访问控制列表ACL
https://fuwari.cbba.top/posts/ccna项目6-访问控制列表acl/
作者
Chen_Feng
发布于
2025-10-06
许可协议
CC BY-NC-SA 4.0