访问控制列表(ACL)
核心定义
访问控制列表(Access Control List) 是一张规则列表,这些规则定义了哪些用户或系统进程可以对给定的对象(如文件、网络端口、系统资源等)进行哪些操作(如读、写、执行)。
简单来说,ACL 就是一个“门卫”,它根据一份“授权名单”来决定是“允许”还是“拒绝”某个访问请求。
ACL 的主要应用场景
ACL 主要应用于两个大的领域:
-
文件系统 ACL:管理对文件和目录的访问。
-
例如:你可以设置一个规则,允许“用户A”读取和写入“报告.doc”,但只允许“用户B”读取,而拒绝“其他所有用户”的任何访问。
-
权限:指代“什么操作”。通常是:
- 读:查看文件内容或目录列表。
- 写:修改文件内容或在目录中创建/删除文件。
- 执行:运行程序或进入目录。
-
-
网络 ACL:管理流经网络设备(如路由器、防火墙)的数据流量。
- 例如:你可以设置一个规则,允许来自IP地址
192.168.1.100
的电脑访问互联网,但拒绝它访问内网的服务器192.168.1.50
。
- 例如:你可以设置一个规则,允许来自IP地址
尽管应用场景不同,但其核心思想是相通的。
网络 ACL
网络 ACL 应用于路由器、交换机或防火墙等网络设备,用于控制网络流量的进出。
主要有两种使用方式:
- 与路由器的一个接口进行绑定,来管理该接口的入向和出向的流量
- 在路由器上创建一个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.10 | 80 | 允许所有人访问网站 |
20 | 允许 | TCP | 办公室IP | 任何 | 192.168.1.10 | 22 | 允许办公室IP通过SSH管理服务器 |
30 | 拒绝 | 任何 | 任何 | 任何 | 192.168.1.10 | 任何 | 显式拒绝其他所有流量(隐式拒绝显式化) |
40 | 允许 | 任何 | 任何 | 任何 | 任何 | 任何 | 允许其他不匹配的流量通过(非严格策略) |
重要特点:
- 顺序至上:设备从规则号最小的开始匹配,一旦匹配就执行动作,不再继续检查。因此规则的顺序至关重要。
- 隐式拒绝:思科绝大多数网络ACL在规则列表的末尾都有一条“拒绝所有”的隐式规则。如果数据包不匹配任何一条“允许”规则,它将被丢弃。上表中的规则30就是将“隐式拒绝”变为“显式拒绝”的例子。
网络ACL与ACE
例如配置了三条策略:
- 主机A访问网络X的流量过滤掉
- 主机B访问网络Y的流量过滤掉
- 主机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/0ip access-group 101 out# 如果你再配置应用ACL 102到同一个接口的出方向interface GigabitEthernet0/0ip access-group 102 out结果:第二条命令会生效,而第一条命令会被覆盖。最终,只有ACL 102被应用到G0/0接口的出方向。
但是,如何实现“两个ACL”的效果?
如果你的需求是合并两个ACL的策略,你不需要在接口上绑两个ACL,正确的做法是:
- 创建一个新的、更全面的ACL:将原来两个ACL(假设是ACL 101和ACL 102)的规则,按照正确的优先级顺序,合并到一个新的ACL(比如ACL 103)中。
- 将新ACL应用到接口:然后将这个新的ACL 103应用到接口的出方向。
那么如果两个ACL一个配置到出方向一个配置到入方向呢?
为同一个接口(G0/0)同时配置入方向和出方向的ACL,就像是给这个接口的大门配备了两道独立的安检程序:
- 入方向ACL:相当于 “进门安检”。只对这个接口入向的数据生效。
- 出方向ACL:相当于 “出门安检”。只对这个接口出向的数据生效。
这两套规则各自独立工作,互不冲突,因为它们在不同的时间点、针对数据流的不同方向进行过滤。
下面我们用一个具体的网络场景来代入这个流程:
场景设定:
- 路由器接口 G0/0 连接着 公司内部网络(
192.168.1.0/24
)。 - 路由器接口 G0/1 连接着 互联网。
目标:
- 入方向ACL目标:保护路由器本身和内部网络,只允许内部网络的管理员IP(
192.168.1.100
)通过SSH管理路由器。 - 出方向ACL目标:控制内部员工的上网行为,只允许他们浏览网页和收发邮件,但禁止访问社交媒体。
配置思路:
1. 配置 G0/0 的入方向ACL(作为“进门安检”) 这条规则在数据包进入路由器时立即生效。
- 规则:允许源IP为
192.168.1.100
的机器访问路由器的SSH端口(TCP 22);拒绝所有其他来自内部网络的流量进入路由器。 - 效果:
- 管理员PC(
.100
)发起的SSH连接请求可以被放行,进入路由器进行处理。 - 其他员工电脑(如
.101
)发起的任何访问路由器本身的流量(如ping、telnet)都会在“进门”时被丢弃。这极大地增强了路由器的安全性。
- 管理员PC(
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 的优势与挑战
优势:
- 精细控制:可以实现非常细粒度的权限管理。
- 安全性:是实践“最小权限原则”(用户只拥有完成其工作所必需的最低权限)的关键工具。
- 灵活性:可以根据需要轻松添加、修改或删除规则。
挑战:
- 管理复杂性:当对象和用户数量庞大时,ACL 会变得非常复杂,难以管理和排错。
- 性能开销:每条网络数据包或文件访问请求都需要与ACL规则进行匹配,规则越多,性能开销可能越大。
- 容易出错:错误的规则顺序或配置可能导致安全漏洞或服务中断。
网络中通信的数据是什么结构的,报头是什么,包含什么内容
例如用微信发一条消息,这条消息就叫数据载荷
,但是这个数据载荷不能直接发送,因为交换机看不懂App的数据。如果想让接收者能够接收到该消息,那么就需要给数据载荷封装接收者的信息,信息不能直接添加到数据载荷中,要添加到数据报头
中
-
数据载荷:应用产生的数据本身
-
数据封装:就是给数据载荷封装报头,例如:
Ethernet2 | IPv4 | UDP | 数据载荷 | FCSL2 |L3 |L4 | |报尾- L4层报头有两个比较重要的字段:
- 源端口,目的端口
- L3层报头有两个比较重要的字段:
- 源IP地址,目的IP地址,这两个字段主要就是给路由器看的,让路由器知道数据从哪来的,发到哪里去
- L2层报头有两个比较重要的字段:
- 源MAC地址,目的MAC地址,这两个字段主要给2层交换机看的
最后封装成数据帧(Frame)然后发走
- L4层报头有两个比较重要的字段:
对以下网络
思考:如果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
、协议类型Protocol
、TTL
、报头长度
、源端口
、目的端口
、等等来做流量识别
- 思科设备创建扩展ACL时,如果命名方式为数字型ACL,那么的取值范围是
100~199
,华为设备是3000~3999
如何区分ACL
数字型ACL
就是ACL的名字,例如:10、20等
命名型ACL
命名时包含多种字符,例如:ACL-IT等
思科实操
网络规划
-
主机4不能访问主机7,但是可以访问所有其他人
-
主机5不能访问主机6,但是可以访问所有其他人
-
选择在哪个路由器上配置?
- 优先在靠近信源的路由器上过滤数据,例如这里过滤主机4和主机5的数据,就在R2上过滤
路由器基础配置
enableconfigure terminalhostname <名字,例如:R1>interface ethernet <接口>no shutdownip 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协议配置
enableconfigure terminalrouter eigrp <进程号,例如:90>no auto-summaryeigrp router-id <路由器ID,例如:1.1.1.1># 将接口宣告进EIGRP,此处例子为精确宣告,需要将路由器的接口和环回口都宣告进EIGRPnetwork <接口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配置
enableconfigure 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出方向调用ACLinterface ethernet 0/1ip 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 100
,Inbound access list is not set
- 输出:
华为实操
- 主机4不能访问主机7,但是可以访问所有其他人
- 主机5不能访问主机6,但是可以访问所有其他人
路由器+OSFP协议配置
system-viewsysyname AR1interface GigabitEthernet 0/0/0ip address 13.1.1.1 24interface GigabitEthernet 0/0/0ip address 12.1.1.1 24ospf 10 router-id 1.1.1.1area 0network 12.1.1.1 0.0.0.0network 13.1.1.1 0.0.0.0
system-viewsysname AR2interface GigabitEthernet 0/0/1ip address 12.1.1.2 24interface GigabitEthernet 0/0/0ip address 4.4.4.254 24interface GigabitEthernet 0/0/2ip address 5.5.5.254 24ospf 10 router-id 2.2.2.2area 0network 12.1.1.2 0.0.0.0# 下面两个推荐用0.0.0.255network 4.4.4.254 0.0.0.0network 5.5.5.254 0.0.0.0
system-viewsysname AR3interface GigabitEthernet 0/0/0ip address 13.1.1.2 24interface GigabitEthernet 0/0/1ip address 6.6.6.254 24interface GigabitEthernet 0/0/2ip address 7.7.7.254 24ospf 10 router-id 3.3.3.3area 0network 13.1.1.3 0.0.0.0# 下面两个推荐用0.0.0.255network 6.6.6.254 0.0.0.0network 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/1traffic-filter outbound acl 3000
-
rule 30 permit ip
:不写源地址代表源地址为any,不写目的地址代表目的地址为any -
traffic-filter inbound acl <名称>
:入向调用 -
配置后使用
display acl 3000
查看acl策略配置了哪些