概述

本文所指的ACL(Access Control Lists)并不是windows系统中NTFS权限的ACL,而是应用于三层网络设备,对流量进行过滤的指令列表。

ACL基于IP报文头部的IP地址,四层TCP、UDP头部的端口号和五层数据进行过滤(一般只基于三、四层不对五层数据过滤),可以在路由器上配置,也可以在防火墙上配置(一般称为策略)

ACL的条目是自上而下依次匹配,只要满足条件则执行动作,并忽略之后的条目。在所有条目最后有一条隐藏的deny any,如果所有条目都不满足则会直接干掉数据包。

访问控制列表(ACL)分为两大类:

  1. 标准ACL
  2. 拓展ACL

通配符掩码

在配置ACL之前需要了解通配符掩码(Wildcard mask),网上很多文章称其为反子网掩码(Inverse mask)是不对的,它只是碰巧在特定情况下和子网掩码相反。

子网掩码通过对掩码中的1和IP地址做位与运算确定网络位,也可以将子网掩码取反后和IP地址做位与运算确定主机位。通配符掩码不一样,在访问控制列表中将通配符掩码置为1表示IP地址中对应的位既可以是1也可以是0。而置为0时则必须精准匹配。

虽然掩码位为1时会忽略,但为了避免歧义应该将IP地址中与1对应的位置为0
比如10.0.0.0 0.255.255.255

简单的计算方法:将255.255.255.255和子网掩码相减结果取绝对值

ACL

标准ACL

表号范围1-99,只能对源IP进行过滤

配置路由器过程分2步

  1. 写入ACL表条目
    con t
    access-list 1 permit/deny 0.0.0.0 255.255.255.255

  2. 将ACL应用到接口
    conf t
    int f0/x
    ip access-group 表号 in/out

例子

access-list 1 deny 10.0.0.0 0.255.255.255
拒绝所有源IP为10开头的

access-list 1 deny 10.1.1.1 0.0.0.0
拒绝所有源IP为10.1.1.1的主机
可以简写成:access-list 1 deny host 10.1.1.1

access-list 1 deny 0.0.0.0 255.255.255.255
拒绝所有源IP
可以简写成:access-list 1 deny any

拓展ACL

由于标准ACL基于源IP的局限性,一般对流量过滤使用拓展ACL
表号范围100-199,可以基于源IP、目标IP、端口号、协议对包进行过滤

命令:
access-list 100 permit/deny protocol source 通配符掩码 dest 通配符掩码 [eq port]
协议字段可以写三层以上的协议,如果指定了eq port则必须指定TCP或UDP协议。其他的如ICMP、IP,如果不指定端口号,则可以写所有三层以上协议,如果协议号指定为TCP端口号不指定,会禁止所有TCP流量不管端口号是多少。


比如:

1
2
Router(config)#access-list 100 deny udp 10.1.1.1 0.0.0.0 20.1.1.3 0.0.0.0 eq 53
Router(config)#access-list 100 permit ip any any

这条命令会禁止主机10.1.1.1访问DNS服务器,无法再进行任何域名解析。

1
2
3
Router(config)#access-list 100 permit icmp host 10.1.1.1 20.1.1.0 0.0.0.255
Router(config)#access-list 100 deny ip host 10.1.1.1 20.1.1.0 0.0.0.255
Router(config)#access-list 100 permit ip any any

禁止10.1.1.1访问20.1.1.0/24网段,但允许使用ICMP协议进行网络探测。


不需要对ARP报文进行过滤,ARP协议虽然被划分在三层,但它其实是工作在二层的。很多教科书和培训教材上,都把ARP协议划分到网络层。我想主要的原因在于ARP协议属于TCP/IP协议簇,而在TCP/IP模型中,所有定义的协议至少是在网络层。按照OSI的标准,当数据向下传递时,每层会加上自己的信息,各层互不干扰.这样当网络层的IP包进入链路层时要依靠ARP协议添加链路头,这显然不是网络层的功能。

ARP协议到底属于几层并不重要,重要的是它的工作原理,路由器本身就不会对广播进行转发,所以不需要对ARP报文进行过滤。

命名ACL

使用表号创建的标准或拓展ACL也可以使用,作用是方便插入或删除某一条目

命令:ip access-list standard/extended 表名/表号

例如:

1
2
3
4
5
6
7
8
9
Router(config)#ip access-list extended kz-80-oa
Router(config-ext-nacl)#1000 permit ip any any
Router(config-ext-nacl)#exit
Router(config)#do sh access-list
Extended IP access list 100
10 deny udp host 10.1.1.1 host 20.1.1.3 eq domain
20 permit ip any any
Extended IP access list kz-80-oa
1000 permit ip any any

如果要删除的话直接no 1000

实验

拓扑图

目的:

  1. 全网互通,内网全部可以访问互联网(假设外网有N多个网段)
  2. 要求销售部只能访问内网,不能访问互联网
  3. 任何部门均不能访问财务部,但不能影响财务部上网

配置过程

网络配置

先不管ACL,将网络互通之后再说

core-1配置为vtp服务器,并配置所有交换机的trunk

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
Switch>en
Switch#conf t
Enter configuration commands, one per line. End with CNTL/Z.
Switch(config)#ho core-1
core-1(config)#int range f0/1 - 2
core-1(config-if-range)#switchport trunk encapsulation dot1q
core-1(config-if-range)#sw m t
core-1(config-if-range)#exit
core-1(config)#vtp mode server
Device mode already VTP SERVER.
core-1(config)#vtp domain d1
Changing VTP domain name from NULL to d1
core-1(config)#vtp password 123.com
Setting device VLAN database password to 123.com
core-1(config)#vlan 10
core-1(config-vlan)#exit
core-1(config)#vlan 20
core-1(config-vlan)#exit
core-1(config)#vlan 30
core-1(config-vlan)#exit
core-1(config)#vlan 40
core-1(config-vlan)#exit

sw1配置trunk和vtp

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
Switch>en
Switch#conf t
Enter configuration commands, one per line. End with CNTL/Z.
Switch(config)#ho sw1
sw1(config)#int f0/3
sw1(config-if)#sw m t

sw1(config-if)#
%LINEPROTO-5-UPDOWN: Line protocol on Interface FastEthernet0/3, changed state to down

%LINEPROTO-5-UPDOWN: Line protocol on Interface FastEthernet0/3, changed state to up

sw1(config-if)#exit
sw1(config)#vtp mode client
Setting device to VTP CLIENT mode.
sw1(config)#vtp domain d1
Domain name already set to d1.
sw1(config)#vtp password 123.com
Setting device VLAN database password to 123.com
sw1(config)#int f0/1
sw1(config-if)#sw ac vl 10
sw1(config-if)#exit
sw1(config)#int f0/2
sw1(config-if)#sw ac vl 20
sw1(config-if)#exit
sw1(config)#

开启三层虚接口

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
core-1(config)#ip routing
core-1(config)#int vlan 10
core-1(config-if)#
%LINK-5-CHANGED: Interface Vlan10, changed state to up

%LINEPROTO-5-UPDOWN: Line protocol on Interface Vlan10, changed state to up

core-1(config-if)#ip add 192.168.1.254 255.255.255.0
core-1(config-if)#no sh
core-1(config-if)#exit
core-1(config)#int vlan 20
core-1(config-if)#
%LINK-5-CHANGED: Interface Vlan20, changed state to up

%LINEPROTO-5-UPDOWN: Line protocol on Interface Vlan20, changed state to up

core-1(config-if)#ip add 192.168.2.254 255.255.255.0
core-1(config-if)#no sh
core-1(config-if)#exit
core-1(config)#int vlan 30
core-1(config-if)#
%LINK-5-CHANGED: Interface Vlan30, changed state to up

%LINEPROTO-5-UPDOWN: Line protocol on Interface Vlan30, changed state to up

core-1(config-if)#ip add 192.168.3.254 255.255.255.0
core-1(config-if)#no sh
core-1(config-if)#exit
core-1(config)#int vlan 40
core-1(config-if)#
%LINK-5-CHANGED: Interface Vlan40, changed state to up

%LINEPROTO-5-UPDOWN: Line protocol on Interface Vlan40, changed state to up

core-1(config-if)#ip add 192.168.4.254 255.255.255.0
core-1(config-if)#no sh
core-1(config-if)#exit

三层交换机配置路由

1
2
3
4
5
6
7
8
9
core-1#conf t
Enter configuration commands, one per line. End with CNTL/Z.
core-1(config)#int f0/3
core-1(config-if)#no sw
core-1(config-if)#ip add 172.16.1.1 255.255.255.0
core-1(config-if)#no sh
core-1(config-if)#exit
core-1(config)#ip route 0.0.0.0 0.0.0.0 172.16.1.2

R1 不能配默认路由

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
Router(config)#int f0/0
Router(config-if)#ip add 172.16.1.2 255.255.255.0
Router(config-if)#no sh
Router(config-if)#exit

Router(config-if)#
%LINK-5-CHANGED: Interface FastEthernet0/0, changed state to up

%LINEPROTO-5-UPDOWN: Line protocol on Interface FastEthernet0/0, changed state to up

Router(config)#int f0/1
Router(config-if)#ip add 100.1.1.1 255.255.255.0
Router(config-if)#no sh

Router(config-if)#
%LINK-5-CHANGED: Interface FastEthernet0/1, changed state to up

Router(config-if)#exit
Router(config)#
%LINEPROTO-5-UPDOWN: Line protocol on Interface FastEthernet0/1, changed state to up

Router(config)#ip route 192.168.1.0 255.255.255.0 172.16.1.1
Router(config)#ip route 192.168.2.0 255.255.255.0 172.16.1.1
Router(config)#ip route 192.168.3.0 255.255.255.0 172.16.1.1
Router(config)#ip route 192.168.4.0 255.255.255.0 172.16.1.1
Router(config)#ip route 200.1.1.0 255.255.255.0 100.1.1.2

完成后全网互通,接下来配置ACL

ACL配置

销售部只能访问内网,只需要在三层交换机的虚拟网关上拦截入口流量,往内网转发的全部允许,其他的都干掉

1
2
3
4
5
6
7
8
9
10
11
12
core-1>en
core-1#conf t
Enter configuration commands, one per line. End with CNTL/Z.
core-1(config)#int vlan 10
core-1(config-if)#ip access-list extended ctrl-10-intra
core-1(config-ext-nacl)#permit ip 192.168.1.0 0.0.0.255 192.168.2.0 0.0.0.255
core-1(config-ext-nacl)#permit ip 192.168.1.0 0.0.0.255 192.168.3.0 0.0.0.255
core-1(config-ext-nacl)#permit ip 192.168.1.0 0.0.0.255 192.168.4.0 0.0.0.255
core-1(config-ext-nacl)#exit
core-1(config)#int vlan 10
core-1(config-if)#ip access-group ctrl-10-intra in
core-1(config-if)#exit

此时销售部访问200.1.1.1显示不可达,但可以ping通内网


要实现任何部门都不能访问财务部,但又不影响其正常上网,只需要对192.168.3.254进行出口拦截所有内网IP,流量从外网接口进来的,对虚拟网关做入口拦截是没用的,数据包并不是从192.168.3.254这个网关进来的

1
2
3
4
5
6
7
core-1(config)#ip access-list extended ctrl-30-defend
core-1(config-ext-nacl)#1000 permit ip any any
core-1(config-ext-nacl)#10 deny ip 192.168.0.0 0.0.255.255 192.168.3.0 0.0.0.255
core-1(config-ext-nacl)#exit
core-1(config)#int vlan 30
core-1(config-if)#ip access-group ctrl-30-defend out
core-1(config-if)#exit

限制销售部的命令可以简化成上面的,直接对192.168.0.0进行拦截。