1.gif访问控制列表ACL的配置与使用

访问控制列表,即 Access Control List,以下简称 ACL,是路由器、交换机等网络设备上最常用的功能之一。可以说大多数的网络协议都跟ACL有着千丝万缕的联系,所以要弄清楚ACL的用法非常重要。

实际上,ACL的本质就是用于描述一个IP数据包、以太网数据帧若干特征的集合。然后根据这些集合去匹配网络中的流量(由大量数据包组成),同时根据策略来“允许”或者“禁止”。

ACL的基本原理

如图: 20092249551786346.png

1、ACL由若干 条件,并按照一定的顺序而成,同时每个条件都对应了一个 策略:允许或者禁止。

2、收到一个数据帧之后,ACL会按照从上到下的顺序逐一匹配:

  ●一个条件不匹配就查看下一个;

  ●任意一个条件匹配后就按照指定的策略执行,并跳出匹配;

  ●所有条件都不匹配时,默认禁止,即 deny

 
根据 条件描述的不同,我们通常可以将IP ACL分为 基本型扩展型两种。

其中基本型只能就数据包的源ip地址进行匹配;

而扩展型ACL就可以对源IP、目的IP、协议号(判断tcp/udp/icmp等)、源端口号、目的端口号、QoS参数(tos、precedence)等参数来进行定义,同时在匹配时,还可以根据路由器系统时间(time-range)来变化、还可以选择是否生成日志(log)等,功能非常强大。

显然标准型ACL功能非常简单,而扩展型ACL功能非常强大;但是功能越强大,匹配的越详细,对于路由器等网络设备的性能要求越高,或者对于网速的拖慢越明显。组网时需要酌情使用。

不过有一点,两种类型的ACL在原理上是完全一致的。

标准型ACL只能匹配源IP地址,在实际操作中,有三种匹配方式:

1、 any,任意地址

2、 <net><mask>,指定ip网段

3、 src_range,指定ip地址范围

 

配置模板:

ip access-list standard < name>                //建立一个标准型的ACL,名字自定

  {permit | deny} any

  {permit | deny} <network> <net-mask>

  {permit | deny} src_range <start-ip> <end-ip>

 
例1:我们需要设置某局域网中只有192.168.1.0网段的用户能够上网(理论上有254个用户),那么应该是

ip access-list standard test

  permit 192.168.1.0 255.255.255.0

  deny any(隐含生效,无需配置)

例2:我们需要设置某局域网中只有192.168.1.2~192.168.1.80的用户能够上网(理论上有79个用户),本网段的其他用户无法上网,那么应该是

ip access-list standard test

  permit src_range 192.168.1.2 192.168.1.80

  deny any(隐含生效)

例3 :我们需要让某局域网中只有192.168.1.0网段用户上网,但是192.168.1.33这个ip地址的用户要禁止(财务禁止上网)(理论上有253个用户),那么应该是

ip access-list standard test

  deny 192.168.1.33 255.255.255.255

  permit 192.168.1.0 255.255.255.0

  deny any(隐含生效)

注意:

例3中,要表示单个主机的话,掩码必须是4个255,即32位掩码;

同时所有的例子中,各个条目的先后顺序不能搞错,想想看为什么?

扩展型ACL可匹配的条目比较多,前面已经说过,但世纪上最常用的项目也就是源、目的IP,源、目的端口号,以及ip协议号(种类)这5种,这5种就可以用来满足绝大多数的应用。

由于匹配的条目比较多,在一个条件中,这些项目也是有前后顺序的,为:

协议号,源ip地址,源端口号,目的ip地址,目的端口号

其中,协议号必须写(ip、icmp、tcp、udp等);

源ip地址也必须写,其表示方式也有三种,与标准acl相同(如果不想匹配,以any来代替);

源端口号可以不写,表示any;

目的ip地址必须写;

目的端口号必须写(当协议号为tcp/udp时,源和目的端口号中至少应当写一个)

配置模板:

ip access-list extended <name>

  {permit | deny} {ip | icmp | tcp | udp} {any | network | src_range} [src_port] {any | network | src_range} [dst_port]
 
例1:网络中除了正常的web访问、邮件收发,其他所有的应用都要禁止

ip access-list extended test

  permit tcp any any eq 80

  permit tcp any any eq 25

  permit tcp any any eq 110

  deny ip any any(隐含生效,后面不再贴出来了)

例2:禁止本网(192.168.1.0)到172.16.11.0网段的访问,其他的不受限制

ip access-list extended test

  deny ip 192.168.1.0 255.255.255.0 172.16.11.0 255.255.0.0

  permit ip any any(本条必须写,想想看为什么)

例3:网络中,要禁止所有用户去ping、telnet、http访问某服务器(dns服务器,ip为192.168.1.3),但要其正常提供服务

ip access-list extended test

  deny icmp any 192.168.1.3 255.255.255.255 

  deny tcp any 192.168.1.3 255.255.255.255 eq 23

  deny tcp any 192.168.1.3 255.255.255.255 eq 80

  permit ip any any

 
注意:在设置扩展型ACL时,要特别注意各个条件之间的关系,如果是“包含”的话,要把范围小的条目写在前面。

常见的包含关系例如:

icmp包含tcp、udp和icmp;

192.168.0.0 255.255.0.0包含192.168.1.0 255.255.255.0

192.168.1.0 255.255.255.0包含 range 192.168.1.1 192.168.1.10

不指定端口(port any)包含具体指定的端口,如tcp 80

等等

按照前面的介绍,我们了解了ACL的基本原理、配置使用和常见分类,但是他们有什么用呢?
从配置的角度来看,上面的ACL写好之后,啥用都没有。原因是因为没有 调用
具体而言,由哪个模块来调用,就决定了它将起到什么作用,这也是ACL应用广泛的根本原因。

常见的调用ACL的模块有:

包过滤:ip access-group

网络地址转换:NAT

策略路由:PBR

ip服务质量:QoS

动态路由过滤:RIP/OSPF等

但作为最基本的应用,还是 access-group。其调用方法非常简单,但关键要确定两个因素:

1、具体的接口

一般选择什么接口呢?一般的原则是离开要被控制的主机更近的那个口。

如:PCA--------<F0/0>Router<F0/1>--------ServB

在这个逻辑拓扑中,要禁止PCA去访问ServB,那么显然在F0/0口上调用更加合适;

2、方向

虽然有in和out两种方向可选,但我们建议使用 in方向。注意,这里的方向跟两个主机之间的源、目的地址相对关系有关。

如上面的逻辑拓扑中,如果是F0/0的in方向上,PCA是源;而在F0/1的in方向,ServB则是源。使用时,请一定要注意

配置模板:

interface fastethernet 0/0

  ip access-group <name> in

注意:一个接口的一个方向上只能同时调用一个ACL条目!!!

使用时的若干注意点:在不影响网络正常运行,且能够达到预期目的的情况下,应当做到
1、ACL的条目数尽量少(建议总的数量不要超过10条)
2、合并ACL条目
如deny ip 192.168.1.0 255.255.255.0 any和deny 192.168.2.0 255.255.255.0可以合并为 192.168.0.0 255.255.255.192
3、尽量选择ACL的in方向调用
4、注意ACL中有隐含生效的deny ip any any(不用配置)
如:ip access-list standard test
        deny ip 192.168.1.11 255.255.255.255
        deny ip 192.168.1.22 255.255.255.255

这个acl的作用就是禁止所有的ip进行通讯。
要改变这种情况的话,需要在最后增加一个permit ip any any。

 
博达路由器上面还有一种特殊的ACL,名为 FastAccess,它相当于一种另外的“标准型”访问列表,它只能判断 TCP、UDP、icmp协议的 目的端口号
这种ACL只适用于BDCOM路由器,通常用来禁止一些危险的、常见的病毒传播端口等。
FastAccess这种ACL的基本原理跟前面基本一致,只是可匹配的项目种类有所不同。
且只能设置为deny策略,不能设置为permit(不deny就是permit),且 没有默认隐含deny的规则
 
 
下面是配置模板:
interface Fastethernet 0/0                //接口模式中配置
  ip fastaccess deny tcp 135
  ip fastaccess deny tcp 139
  ip fastaccess deny tcp 445
  ip fastaccess deny tcp 1025
  ip fastaccess deny tcp 1433
  ip fastaccess deny tcp 4444
  ip fastaccess deny tcp 5554
  ip fastaccess deny tcp 9996
  ip fastaccess deny udp 69
  ip fastaccess deny udp 1434
前面讲的都是IP ACL,是属于网络层次的第三层,即网络层。
 
一般只是路由器、三层交换机上才可能会这样设置,当然防火墙设备可能也会有类似的机制,但通常多位GUI图形化配置页面。
 
那么如果要在二层交换机上面配置ACL来过来一些用户流量该怎么做呢?
显然因为层次不同的原因,IP ACL就不能用了,这需要用到另外的一种 MAC ACL,即二层访问控制列表
mac acl的原理跟一楼的基本原理完全一致,但它只能匹配源和目的mac地址。
另外,由于mac acl相对较为简单,就不在区分基本和扩展等类型了。
下面是配置模板,大家一看就明了:
mac access-list <name>

  permit {host <src.MAC.Addr> | any} {host <dst.MAC.Addr> | any}
  deny {host <src.MAC.Addr> | any} {host <dst.MAC.Addr> | any}
!
interface Fastethernet 0/1
  mac access-group <name>
 
注意:
1、mac acl中同样有隐含的deny any any规则存在,使用时要注意
2、mac acl在调用时没有方向参数的,原因是默认在in方向生效。