网络技术:ACL 访问控制列表
ACL
访问控制列表
黑名单和白名单是很实用的安全技术,黑名单规定了哪些设备不能访问,白名单可以规定哪些设备可以访问。通过合理地配置黑名单和白名单,可以使得网络拓扑更加安全。ACL (访问控制列表)是一系列 IOS 命令,这些命令将根据数据包的报头字段,来决定该流量是要转发还是丢包。ACL 是一张列表,它罗列了进行过滤操作的黑名单和白名单,ACL 的功能有:
- 限制网络流量,通过限制某种类型的流量,可以减轻网络的幅度从而提高性能;
- 流量控制,ACL 可以限制路由更新的传输;
- 提高安全性,ACL 可以允许部分设备访问网络,也可以拒绝某些可疑的设备的访问;
- 限制访问的权限,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 著,袁国忠 徐宏 译,人民邮电出版社