网络技术:ACL 访问控制列表

ACL

访问控制列表

黑名单和白名单是很实用的安全技术,黑名单规定了哪些设备不能访问,白名单可以规定哪些设备可以访问。通过合理地配置黑名单和白名单,可以使得网络拓扑更加安全。ACL (访问控制列表)是一系列 IOS 命令,这些命令将根据数据包的报头字段,来决定该流量是要转发还是丢包。ACL 是一张列表,它罗列了进行过滤操作的黑名单和白名单,ACL 的功能有:

  1. 限制网络流量,通过限制某种类型的流量,可以减轻网络的幅度从而提高性能;
  2. 流量控制,ACL 可以限制路由更新的传输;
  3. 提高安全性,ACL 可以允许部分设备访问网络,也可以拒绝某些可疑的设备的访问;
  4. 限制访问的权限,ACL 可以允许设备只能访问特定的文件类型,拒绝访问特定的文件类型。

默认情况下路由器没有配置 ACL,此时路由器不会进行任何过滤操作。当我们把一个 ACL 应用于接口时,路由器会根据 ACL 中的条目,对通过该接口的数据包进行过滤。除了对数据包进行过滤,ACL 还可以支持对流量进行分类等方式对流量进行操作。

ACE

ACL 是一系列访问控制条目 (ACE)组成的,每一个 ACE 都对应着一条对应某个网段的过滤规则。ACE 有 permit 和 deny 2 种语句,permit 语句指定了允许通过的网段流量,deny 语句指定了需要拒绝的网段流量。当网络流量经过了配置了 ACL 的接口时,路由器会讲数据包的信息和 ACL 中的每个 ACE 按顺序比较,如果匹配成功则根据 ACE 对该数据包进行转发或丢包。
匹配 ACE 并执行转发或丢包的操作被称为过滤,标准 ACL 仅在网络层发挥过滤作用,扩展 ACL 可以作用于网络层和传输层。

ACL 的最后会存在一条隐式的 ACE:deny any,该语句会拒绝所有的流量。如果 ACL 中之前的所有的 ACE 都没有 permit 流量,则隐式存在的 deny any 会拒绝所有流量。

入站/出站

ACL 可以在路由器的出站的地方进行过滤,也可以在入站的地方进行过滤。入站 ACL可以在数据包被路由之前先进行过滤操作,匹配结果为拒绝的数据包会被直接丢包而不会被路由,匹配为允许的数据包才会被路由到出站接口。如果该数据包被丢包就可以节省路由器路由的开销,所以入站 ACL 的效率很高。
出站 ACL是在数据包被路由到出站接口后,对数据包进行过滤。如果存在多个入站接口需要从同一个出站借口出去的情况,适合使用出站 ACL 对这些流量进行相同的过滤操作。

ACL 的放置

每种协议(IPv4 和 IPv6)、每个接口和每个方向 (in 和 out) 只能有一个 ACL。

ACL 的类型

标准访问控制列表:这种 ACL 只将数据包的源地址作为过滤的依据,因此这种 ACL 无法基于某种协议类型和目的地址进行过滤,功能比较弱。在实践中标准 ACL 起到筛选流量的作用,将筛选出来的流量配合其他协议一起使用。
扩展访问控制列表:这种 ACL 可以检查 IP 分组的网络层和传输层的报头的更多字段,也就是说这类 ACL 可以对源地址、目的地址、协议类型和端口号进行过滤,功能更为强大。由于扩展 ACL 可以实现准确的过滤,因此扩展 ACL 是很好的网络安全手段。

放置策略

标准访问控制列表应该放在离目的地尽可能的地方,由于标准访问控制列表只能基于源地址进行过滤,所以如果离信源太近很可能导致信源发送的大量数据包都被过滤。
扩展访问控制列表应该放在离信源尽可能的地方,因为扩展访问控制列表可以非常具体地根据源地址、目的地址、协议类型和端口号的信息进行过滤,可以在信源一产生数据包时就进行约束。这样可以对带宽起到一定的节约作用,我们不希望数据包在网络上传输了很长的距离,快到目的地时被过滤了,这样就太浪费带宽了。

通配符掩码

通配符掩码用于确定检查数据包的地址的哪些位来确定匹配项,和 IP 地址一样是 32 位二进制组成的字符串。通配符掩码也是由二进制的 0 和 1 组成,0 表示匹配地址中的对应位值,1表示忽略地址中的对应位值。

匹配 IPv4 子网

通配符掩码和 IP 地址一起出现,用于匹配 IPv4 的子网。例如使用 0.0.0.255 通配符掩码对 192.168.1.1 进行匹配,通配符掩码的最后 8 位为 1,表示不对 IP 地址的后 8 位进行匹配,因此匹配的规则是匹配 192.168.1.0/24 的任意主机。如果使用 0.0.0.0 为通配符掩码,由于通配符掩码的所有位都为 0,则需要匹配所有位,所以匹配的规则是只匹配 192.168.1.1 这个 IP 地址。如果使用 255.255.255.255 为通配符掩码,由于通配符掩码的所有位都为 1,则需要忽略所有位,此处可以匹配任何的 IP 地址。

IP 地址 通配符掩码 匹配结果
192.168.1.1 0.0.0.0 192.168.1.1 一个 IP 地址
192.168.1.1 0.0.0.255 192.168.1.0/24
192.168.1.1 0.0.255.255 192.168.0.0/16
192.168.1.1 0.255.255.255 192.0.0.0/8
192.168.1.1 255.255.255.255 任何 IP 地址

匹配网络范围

可以通过一些特殊的通配符掩码,对某个范围的网段进行匹配。例如对 IP 地址 192.168.16.0 用通配符掩码 0.0.15.255 进行匹配,由于通配符掩码的后 12 位为 1,通过表格的分析可以得知 192.168.16.0 ~ 192.168.31.255 这个范围的 IP 地址都在匹配的范围以内。如果是 192.168.32.0,也就是 11000000.10101000.00100000.00000000,该 IP 地址不在匹配的范围里面。因为根据通配符掩码需要匹配前 20 位,也就是说匹配到的 IP 地址的前 20 位必须是 11000000.10101000.0001,也就是 192.168.16.0 的前 20 位。

通配符掩码 0.0.15.255 00000000.00000000.00001111.11111111 是否匹配
IP 地址 192.168.16.0 11000000.10101000.00010000.00000000
IP 地址 192.168.31.255 11000000.10101000.00011111.11111111
IP 地址 192.168.32.0 11000000.10101000.00100000.00000000

计算方法

通配符掩码可以被认为是子网掩码取反,所以可以通过 255.255.255.255 减去被匹配的网段的子网掩码来计算通配符掩码。
例如我想要对 192.168.1.0 网路的所有主机进行匹配,由于此时的子网掩码是 255.255.255.0,用 255.255.255.255 减去得通配符掩码 0.0.0.255。例如我想要对 192.168.1.16\28 子网的主机进行匹配,由于此时的子网掩码是 255.255.255.240,用 255.255.255.255 减去得通配符掩码 0.0.0.15。
如果我想要匹配 192.168.16.0/24 ~ 192.168.31.0/24 这些子网的 IP 地址,由于这些子网可以构造超网 192.168.16.0/20,构造的超网的子网掩码是 0.0.240.255,因此用 255.255.255.255 减去得通配符掩码 0.0.15.255。

通配符掩码关键字

host 关键字和通配符掩码 0.0.0.0 等价,表示 IPv4 地址的所有位都必须匹配。any 关键字和通配符掩码 255.255.255.255 等价,表示 IPv4 地址的所有位都忽略,也就是所有 IP 地址都可以。

配置标准 ACL

实验拓扑

思科 9.2.2.7 Lab 配置并检验标准 ACL 的实验拓扑如下。

地址分配表:

设备 接口 IP 地址 子网掩码 默认网关
R1 G0/1 192.168.10.1 255.255.255.0 N/A
Lo0 192.168.20.1 255.255.255.0 N/A
S0/0/0 (DCE) 10.1.1.1 255.255.255.252 N/A
ISP S0/0/0 10.1.1.2 255.255.255.252 N/A
S0/0/1 (DCE) 10.2.2.2 255.255.255.252 N/A
Lo0 209.165.200.225 255.255.255.224 N/A
R3 G0/1 192.168.30.1 255.255.255.0 N/A
Lo0 192.168.40.1 255.255.255.0 N/A
S0/0/1 10.2.2.1 255.255.255.252 N/A
S1 VLAN 1 192.168.10.11 255.255.255.0 192.168.10.1
S3 VLAN 1 192.168.30.11 255.255.255.0 192.168.30.1
PC-A NIC 192.168.10.3 255.255.255.0 192.168.10.1
PC-C NIC 192.168.30.3 255.255.255.0 192.168.30.1

配置编号标准 ACL

配置策略

创建一个标准编号 ACL,以便允许来自 192.168.10.0/24 网络中所有主机和来自 192.168.20.0/24 网络中所有主机的流量访问 192.168.30.0/24 网络中的所有主机。此时的通配符掩码应该是 0.0.0.255,表示前 24 位要精确匹配,后面的 8 位随意。
这个 ACL 应该配置在 R3,因为标准 ACL 的典型最佳做法是配置并将其应用于尽量靠近目的地址的位置,就要令这个 ACL 尽可能靠近 192.168.30.0/24 网络。此 ACL 应该要应用到 G0/1 接口的 out 方向,因为 192.168.10.0/24 网络和 192.168.20.0/24 网络的流量想要到 192.168.30.0/24 网络,就必须在 R3 上从 G0/1 口出去。

配置命令

标准 ACL 命令的语法如下:

Router(config)# access-list access-list-number { deny | permit | remark } source source-wildcard log
参数 说明
access-list-number ACL 的编号
deny 拒绝访问
permit 允许访问
remark 注释,命令后面接注释内容
source 发送数据包的网络前缀或主机号
source-wildcard 可选,通配符掩码
log 可选,发送日志信息

此时在 R3 上配置 ACL,将 1 用作访问列表编号。

R3(config)# access-list 1 remark Allow R1 LANs Access
R3(config)# access-list 1 permit 192.168.10.0 0.0.0.255
R3(config)# access-list 1 permit 192.168.20.0 0.0.0.255
R3(config)# access-list 1 deny any

将 ACL 应用到正确方向上的正确接口,在接口配置模式使用的命令如下,access-list-number 为编号 ACL 的编号,in 表示将 ACL 应用到入站方向,out 表示将 ACL 应用到出站方向。

Router(config-if)# ip access-group { access-list-number } { in | out }

此时把 1 号 ACL 应用到接口 g0/1 上。

R3(config)# interface g0/1
R3(config-if)# ip access-group 1 out

验证配置

查看 1 号 ACL 中的所有 ACE,可以使用命令 show access-list access-list-number

R3#show access-list 1 


查看访问列表的应用位置和应用方向。

R3#show ip interface g0/1

配置命名标准 ACL

命名标准 ACL

命名 ACL 通过名称来给 ACL 进行标识,相比于编号,可以更加直观地看出 ACL 的功能。对于命名的 ACL,可以通过引入语句序号,方便地进行单挑语句的插入和修改。对于编号 ACL 就只能先把错误语句删除了才能改。

配置策略

创建符合以下策略的标准命名 ACL:允许来自 192.168.40.0/24 网络的所有主机流量访问 192.168.10.0/24 网络。此外,仅允许主机 PC-C 访问 192.168.10.0/24 网络。
此 ACL 应该应用到 R1,因为 192.168.40.0/24 网络和 PC-C 的流量都需要通过 R1 转发才能到达192.168.10.0/24 网络,ACL 应该放在尽可能接近 192.168.10.0/24 网络的位置。此 ACL 应该应用到 G0/1 接口的 out 方向,因为 192.168.40.0/24 网络和 PC-C 的流量想要到192.168.30.0/24 网络,就必须在 R3 上从 G0/1 口出去。

配置命令

创建标准命名 ACL 的语法如下,注意 ACL 名称可以由大小写字母和数字组成,并且要保证唯一性。

Router(config)# ip access standard access-list-name

输入该命令之后会进入标准命名 ACL 的配置模式,该模式下配置 ACE 的语法如下:

Router(config-std-nacl)# { deny | permit | remark } source source-wildcard log
参数 说明
deny 拒绝访问
permit 允许访问
remark 注释,命令后面接注释内容
source 发送数据包的网络前缀或主机号
source-wildcard 可选,通配符掩码
log 可选,发送日志信息

此时在 R1 上创建标准命名 ACL “BRANCH-OFFICE-POLICY”。

R1(config)# ip access-list standard BRANCH-OFFICE-POLICY
R1(config-std-nacl)# permit host 192.168.30.3
R1(config-std-nacl)# permit 192.168.40.0 0.0.0.255
R1(config-std-nacl)# end
  • “host 192.168.30.3” 等价于 “permit 192.168.30.3 0.0.0.0”。
    将 ACL 应用到正确方向上的正确接口,在接口配置模式使用的命令如下,access-list-name 为命名 ACL 的名称,in 表示将 ACL 应用到入站方向,out 表示将 ACL 应用到出站方向。
Router(config-if)# ip access-group access-list-name { in | out }

此处将 ACL BRANCH-OFFICE-POLICY 应用到接口 g0/1 的出站方向。

R1# config t
R1(config)# interface g0/1
R1(config-if)# ip access-group BRANCH-OFFICE-POLICY out

验证配置

查看命名 ACL 中的所有 ACE,使用命令 show access-lists

R1#show access-lists


查看访问列表的应用位置和应用方向。

R1#show ip interface g0/1

修改标准 ACL

企业中的安全策略经常发生变化,因此有时可能需要修改 ACL。

修改策略

现在要允许来自 209.165.200.224/27 网络的用户具有 192.168.10.0/24 网络的完全访问权限。可以在全局配置模式发出 “no ip access-list standard BRANCH-OFFICE-POLICY ”命令删除整个 ACL,然后重新配置。也可以在 ACL 自身中添加或删除特定的行来修改 ACL,这种做法比较方便。

修改命令

在 ACL 的末尾添加两行,在全局配置模式下修改 ACL“BRANCH-OFFICE-POLICY”,接着可以在 ACE 之前加上一个序号来将 ACE 插入想要的位置。

R1#(config)# ip access-list standard BRANCH-OFFICE-POLICY
R1(config-std-nacl)# 30 permit 209.165.200.224 0.0.0.31
R1(config-std-nacl)# 40 deny any
R1(config-std-nacl)# end

检验配置

R1#show access-lists


是否必须对 R1 的 G0/1 接口应用 “BRANCH-OFFICE-POLICY”?没必要,因为我们在上一步已经把BRANCH-OFFICE-POLICY 绑定到 G0/1 上了,此处仍然保持状态,没有因为我们修改了 ACL 就失效了。

参考资料

《思科网络技术学院教程(第6版):路由和交换基础》,[加] Bob Vachon,[美] Allan Johnson 著,思科系统公司 译,人民邮电出版社
《CCNA 学习指南(第 7 版)》,[美] Todd Lammle 著,袁国忠 徐宏 译,人民邮电出版社

posted @ 2020-12-16 20:39  乌漆WhiteMoon  阅读(2256)  评论(0编辑  收藏  举报