一、访问控制列表介绍:
    访问控制列表(ACL,access control list)是应用在路由器的接口上的指令列表(即规则).这些规则告诉路由器,哪些数据包需要被拒绝,哪些被允许.
    访问控制列表的基本原理是:ACL使用包过滤技术,在路由器上读取OSI七层模型中的第3层和第4层包头的信息,如源IP、目的IP、源端口、目的端口等,根据预先定义好的规则,对包进行过滤,从而达到访问控制的目的.
    ACL可分为两种基本类型:
    >标准访问控制列表:检查数据包的源地址,其结果基于源网路/子网/主机IP地址,来决定允许还是拒绝,使用1-99之间的数字作为表号.
    >扩展访问列表:对数据包的源地址与目的地址均检查,它也能检查特定的协议、端口号以及其他参数.使用100-199之间的数字作为表号.

    二、访问控制列表的工作原理
    访问控制列表是一组规则的集合,它应用在路由器的接口上,有进和出2个方向.
    出:已经经过路由器的处理,正离开路由器接口的数据包.
    入:已到达路由器接口的数据包,将被路由器处理.
    如果对路由器的接口应用的ACL,也就是说该接口应用了一组规则,那么路由器将对数据包按照顺序进行检查.
   
    >如果第一条规则被匹配了,则不往下检查,直接决定数据包是被丢弃还是转发
    >如果第一条不匹配,则向下检查,直到有一条规则被匹配,决定该数据包是被丢弃还是转发
    >如果最后没有任何一条规则被匹配,则路由器根据默认的规则来决定是丢掉还是转发
    访问控制列表对路由器本身产生的数据包不起作用

    由此可见,在ACL中,规则的顺序很重要,一旦匹配了规则,就不再向下检查.
  
   
    三、访问控制列表的类型:
    1.标准访问控制列表
    标准访问控制列表根据数据包的源IP地址来决定数据包是丢弃还是转发,表号1-99
    2.扩展访问控制列表
    扩展访问控制列表根据数据包的源IP地址、目的IP地址、协议、端口号来允许或者拒绝数据包,表号100-199
    3.命名访问控制列表:
    允许在标准和扩展访问控制列表中使用名称代替表号.
    4.定时访问控制列表
    定时访问控制列表提供基于时间的附加控制特性,定义在什么时间允许或者拒绝数据包.

    四、访问控制列表的配置
    4.1.标准访问控制列表的配置
    1.创建ACL
    Router(config)#access-list access-list-number { permit | deny } source [source-wildcard]
    access-list-number:访问控制列表表号,范围1-99
    permit | deny :允许 | 拒绝
    source :数据包的源地址,可以值主机地址,也可以是网络地址,也就是网段或者具体的IP地址
    source-wildcard:通配符掩码,也叫反掩码,在用二进制0和1表示时,如果某位为1,表明这一位不需要进行匹配,为0,则表明这一位需要严格匹配.

    例:
    Router(config)#access-list 1 permit 192.168.1.0 0.0.0.255
    192.168.1.0/24的子网掩码是255.255.255.0,反掩码可以通过255.255.255.255减去255.255.255.0得到
    Router(config)#access-list 1 permit 192.168.2.2 0.0.0.0
    192.168.2.2的子网掩码是255.255.255.255,反掩码就是0.0.0.0
   
    1)每个ACL都有一个隐含的拒绝语句,如下:
    Router(config)#access-list 1 deny 0.0.0.0 255.255.255.255
   
    2)关键字host/any
    如:192.168.2.2 0.0.0.0 就可以用host代替
     Router(config)#access-list 1 permit host 192.168.2.2
    0.0.0.0 255.255.255.255 可以使用关键字any代替
    Router(config)#access-list 1 deny any
   
    3)删除已建立的标准ACL
    Router(config)#no access-list access-list-number
    对于标准访问控制列表,不能删除单条ACL语句,只能删除整个ACL,这意味着如果要改变一条或者几条ACL语句,必须先删除整个ACL,然后再添加想要的ACL语句
   
    2.将ACL应用于接口
    创建ACL之后,只有将ACL应用到接口,ACL才会生效
    Router(config)#ip access-group acess-list-number { in | out}
    参数in | out 用来表示是应用到入站接口还是出站接口
    要取消接口上的ACL,在前面加no
    Router(config)#no ip access-group access-list-number { in | out }
   
    3.标准ACL配置实例
    如图:要求配置标准ACL实现,禁止PC1访问PC2,而允许所有其他流量
       
    步骤如下:
    1)分析是在入站接口/出站接口上应用ACL
    路由器对于in的数据包,先查看访问控制列表,通过后才查看路由表.对于out的数据包是先查看路由表,确定目标后才查看访问控制列表,因此尽量把ACL应用到入站接口上,因为它比出站接口效率要高.将要丢弃的数据包在进行路由表查询处理之前就拒绝掉.

    2)应用在哪台路由器上
    因为标准访问控制列表只能根据源IP地址过滤,如果在R1/R2上配置ACL,PC1不仅不能访问PC2,而且不能访问192.168.2.0/24.所以应该把标准ACL配置在离目的最近的路由器上.

    3)配置ACL
    R3(config)#access-list 1 deny 192.168.1.1 0.0.0.255
    或者
    R3(config)#access-list 1 deny host 192.168.1.1
    R3(config)#access-list 1 permit any
    R3(config)#int f0/0
    R3(config-if)#ip access-group 1 in
   
    使用show access-lists命令查看ACL配置



    4.2扩展访问控制列表
    1.创建ACL
    Router(config)#access-list access-list-number { permit | deny } protocol { source source source-wildcard destination destination-wildcard } [ operator operan ]
    access-list-number:访问控制列表表号,对于扩展ACL来说,范围是100-199
    permit | deny :允许 | 拒绝
    protocol : 协议,如IP/TCP/UDP/ICMP等
    source destination :源地址/目的地址
    source-wildcard destination-wildcard :反掩码,分别和源地址和目的地址对应
    operator operan : lt (小于) 、gt(大于)、eq(等于)、neq(不等于)和一个端口号

    例1:允许192.168.1.0/24访问192.168.2.0/24的IP流量通过,拒绝其他流量通过
    Router(config)#access-list 100 permit ip 192.168.1.0 0.0.0.255 192.168.2.0 0.0.0.255
    Router(config)#access-list 100 deny ip any any

    例2:拒绝192.168.1.0/24访问FTP服务器192.168.2.2/24的流量通过,而允许其他任何流量
    Router(config)#access-list 100 deny tcp 192.168.1.0 0.0.0.255 192.168.2.2 0.0.0.255
    Router(config)#access-list 100 permit ip any any
   
    删除扩展ACL和删除标准ACL一样
    Router(config)#no access-list access-list-number
    扩展ACL与标准ACL一样,也不能删除单独的ACL语句,只能删除整个ACL

    2.将ACL应用于接口
    和标准ACL一样,需要将ACL应用到接口上,ACL才会生效
    命令和标准ACL一样
    Router(config-if)#ip access-group 100 in | out
    取消的命令
    Router(config-if)#no ip access-group 100 in | out

    3.扩展ACL配置实例
   
    步骤:
    1)分析将ACL应用在入站接口还是出站接口
    和标准ACL一样,尽量将ACL应用在入站接口上

    2)该应用在哪台路由器上
    由于扩展ACL可以根据源IP/目的IP/协议/端口,因此尽量将ACL应用到离源IP最近的路由器上,这样避免经过过多的路由器占用不要的资源.
   
    3)配置ACL,并应用到接口上
    R1(config)#access-list 100 permit tcp 192.168.1.1 0.0.0.255 192.168.3.1 0.0.0.255 eq 80 (www)
    R1(config)#access-list 100 deny ip 192.168.1.1 0.0.0.255 192.168.3.1 0.0.0.255
    R1(config)#access-list 100 permit ip 192.168.1.1 0.0.0.255 192.168.2.0 0.0.0.255
    R1(config)#int f0/0
    R1(config-if)#ip access-group 100 in
   
    4.3命名访问控制列表的配置
    1.创建ACL
    Router(config)#ip access-list { standard | extended }  access-list-name
    参数access-list-name 可以使用一个由字母、数字组合的字符串
    如果是标准ACL,命令:
    Router(config)#[Sequence-number] { permit | deny } source [ source-wildcard ]
    如果是扩展ACL,命令:
    Router(config-ext-nacl)#[ Sequence-Number ] { permit | deny } protocol { source source-wildcard destination destination-wildcard } [ operator operan]
   
    无论是标准命名ACL还是扩展命名ACL,都有一个可选参数Sequence-Number,Sequence-Number表明配置此ACL语句在ACL中所处的位置,默认情况下,第一条为10,第二条为20,以此类推.
    Sequence-Number可以很方便的将新添加的ACL语句插入到指定位置,如果不选择Sequence-Number,那么ACL语句就会被添加到列表末尾,并且序列号加10.

    例:允许来自主机192.168.1.1/24的流量通过,而拒绝其他流量,标准命名ACL命令为:
    Router(config)#ip access-list standard cisco
    Router(config-std-nacl)#permit 192.168.1.1 0.0.0.255
    Router(config-std-nacl)#deny any
   
    例:拒绝192.168.1.0/24访问FTP服务器192.168.2.2/24的流量通过,而允许其他任何流量.扩展命名ACL:
    Router(config)#ip access-list extended cisco1
    Router(config-ext-nacl)#deny tcp 192.168.1.0 0.0.0.255 host 192.168.2.2 eq 21
    Router(config-ext-nacl)#permit ip any any

    删除已建立的命名ACL:
    Router(config)#no ip access-list { standard | extended } access-list-name
   
    对于命名ACL来说,可以删除单条的ACL语句,而不必删除整个ACL,而且命令ACL可以有选择性的插入到指定位置,是ACL配置更加方便.
    如果要删除一条ACL语句,可以使用"no Sequence-Number"或者"no acl语句"两种方式.
    例如:
    Router(config)#ip access-list standard cisco
    Router(config-std-nacl)#no 10
   
    2.将ACL应用于接口
    创建命令ACL后,也必须将ACL应用于接口才会生效.
    Router(config-if)#ip access-group access-list-name { in | out }
    取消在接口应用的ACL:
    Router(config-if)#no ip access-group access-list-name { in | out }
   

    4.4 定时访问控制列表的配置
     配置定时ACL,需要建立一个时间范围,然后使用扩展ACL或者命名扩展ACL引用这个时间范围.
    1.定义时间范围的名称
    Router(config)#time-range time-range-name
    2.指定该时间范围何时生效
    指定该时间范围何时生效有二种方式:定义一个时间周期或者定义一个绝对的时间.
    1).定义一个时间周期
    Router(config-time-range)#periodic days-of-the-week hh:mm to [ days-of-the-week ] hh:mm
    Router(config-time-range)#absolute [ start hh:mm day month year ] [ end hh:mm day month year ]
 

     2).在扩展ACL中引入时间范围
    Router(config)#access-list access-list-number {  permit | deny } protocol { source source-wildcard destination destination-wildcard } [ operaor operan ] time-range time-range-name
   
    3).将ACL应用于接口
    Router(config-if)#ip access-group access-list-number { in | out }
   
    例:在每周的正常工作时间(周一到周五的每天8:30-17:30),允许所有的IP流量通过网络,命令如下:
    Router(config)#time-range time
    Router(config-time-range)#periodic weekdays 8:30 to 17:30
    Router(config-time-range)#exit
    Router(config)#access-list 101 permit ip any any time-range time
    Router(config)#int f0/0
    Router(config-if)#ip access-group 101 in