分析:如图所示
1
数据包通过入站接口进入路由器,此时开始查找路由表中是否有匹配的路由条目,如果
没有,则直接将其丢弃。这一步和
ACL
还没有任何关系,只是没有相应路由,就无法转发数据包,所以在此也需要说明一点,
ACL
也必须在数据包能够被路由的基础之上才起作用。
2
如果路由表中有相应的路由条目才被路由到一个相应的接口上。
3
查看该接口是否有
ACL
的配置,如果没有则立即被转发,如果设置了
ACL
,则检查该数据包是否匹配
ACL
规则。如果匹配并规则中明确该数据包可以正常转发。否则丢弃!注意:如果
ACL
测试规则中没有明确指定数据包通过,则说明此数据包没有与相关的规则匹配,那么还有一个隐含的规则就是
deny all,
这一点和微软的
ISA
是一样的,安装好防火墙就有一个默认规则拒绝一切,可以说是“六亲不认”!
下面咱们就来细说一下
ACL
规则测试
如图所示,在
ACL
中可以有多个规则。如图:假设在
ACL
中有三个明确规则,则数据包进入后首先匹配第一个规则,如果数据包匹配该规则并设置为
permit
,则数据包被转发,如果数据包也匹配该规则,但却被设置为
deny
,则数据包直接被丢弃。
如果第一个规则不匹配则该数据包继续向前走,此时再检查是否匹配第二个规则,如果匹配并设置为
permit,
则该数据包被转发,如果匹配但被设置为
deny
则被丢弃。
如果第二个规则也不匹配则继续向前走,此时遇到第三个规则,同时还是检查是否匹配,如果匹配并设置为
permit
,同样也可以被转发,如果被设置为
deny
,则被丢弃。如果第三个是规则是最后一个,该数据包都没有匹配,
注意:
1
规则最后千万不要忘记还有一个隐含规则:
Deny ALL
!!!
2
在此还需要注意,
Cisco
的
ACL
规则完全是按照规则编写的顺序进行的。所以最精确的规则应当写在最上方,否则将被大范围的规则所覆盖而导致设置失效。如拒绝一台主机访问外网,必须先写拒绝这一台,然后再写运行所有,那如果顺序错了,运行所有在上面,拒绝一台在下面,系统会检查一个数据包,发现任何一个数据包都可以通过,就直接转发了,下面的一条就不起作用了!
3
必须先创建
ACL
,再应用到相应的接口上
4 ACL
不能过滤路由器自己产生的数据。
ACL
理论东西没有太多,也很简单,下面咱们来看一下标准控制列表的配置过程,其实不论是标准还是扩展
ACL
的配置主要就是两个命令
1
设置访问控制列表
Router(config)# access-list acl_number permit|deny {}
2
在接口上应用访问控制列表,
Ip access-group acl_number in|out
这里可以是某个接口,也可以是
VTY
,
Qos
等应用中。其中
in
代表是入站方向,
out
代表的是出站方向。
那么标准
ACL
就显得更简单了,如:
Access-list acl_number {permit|deny} source [mask]
其中
acl_number
指的是
ACL
编号范围:
1-99
或
1300-1999
Permit
表示
通过
Deny
表示
拒绝
Source
代表的是源地址,可以是某一个主机或是一个网段
Mask
掩码,但需要注意的是
ACL
支持的是反掩码,所以在设置的时候一定要注意。
但我们有时候可能会在
source
前面加上
host
或是
any
,这又是什么用意呢?
Host
不是必须的,但是当匹配一个特定的主机地址时是非常有用的。也就是使用
host
的时候是匹配的某一个具体的主机,是一个精确匹配,此时的反掩码则
0.0.0
.0
如:
1 Access-list 10 permit 10.10.10 .0 0.0.0.255
表示的是一个网段
10.10.10.0
,表示匹配该网段的所有数据报文。
2 access-list 10 permit 10.10.10 .10 0.0.0.0
表示匹配源地址是
10.10.10.10
这一个具体的主机,这个语句可以写成
access-list 10 permit host 10.10.10.10
Any
也不是必须的,但是如果是匹配所有报文时是非常有用的,表示匹配所有的地址,是
0.0.0
.0 255.255.255.255
的简写
如:
Access-list 10 permit 0.0.0 .0 255.255.255.255
表示所有数据包通过,此语句可以写成:
Access-list 10 permit any
下面咱们结合几个小实例来看一下标准
ACL
的具体配置过程:
我们所参考的拓扑图如下:
我们结合这个拓扑来做三个实验:
实例
1
:我们只允许
192.168.10.0
与
192.168.20.0
两个网段可以通讯
Router>en
Router#conf t
Enter configuration commands, one per line. End with CNTL/Z.
Router(config)#interface fa0/0
Router(config-if)#ip address 192.168.10.1 255.255.255.0
Router(config-if)#no shutdown
Router(config-if)#exit
Router(config)#interface fa0/1
Router(config-if)#ip address 192.168.20.1 255.255.255.0
Router(config-if)#no shutdown
Router(config-if)#exit
Router(config)#interface e1/0
Router(config-if)#ip address 192.168.30.1 255.255.255.0
Router(config-if)#no shutdown
现在默认情况下,三个网段之间是可以进行正常通讯的,如图:
那么下面我们怎么做才能只让
10.0
和
20.0
通讯呢,具体配置如下:
Router>enable
Router#conf t
Router(config)#access-list 1 permit 192.168.10.0 0.0.0 .255
Router(config)#access-list 2 permit 192.168.20.0 0.0.0 .255
Router(config)#interface fa 0/0
Router(config-if)#ip access-group 2 out
Router(config-if)#exit
Router(config)#interface fa 0/1
Router(config-if)#ip access-group 1 out
Router(config-if)#exit
Router(config)#
然后测试如下:
刚才我们是匹配的整个网段,下面咱们看如何匹配一个具体的主机:
实例
2
:我们不允许
192.168.10.10
可以访问
非
192.168.20.0
网段,也就是不允许
192.168.10.10
这一台机器访问
192.168.30.0
网段
具体配置如下:
Router>enable
Router#conf t
Router(config)#access-list 1 deny 192.168.10.10 0.0.0 .0
Router(config)#access-list 1 permit any
Router(config)#interface e0/2
Router(config-if)#ip access-group 1 out
此时再来测试:
大家可以看到和
192.168.20.0
网段通讯没有问题,但是和
192.168.30.0
网段就不行,这就是对某一台机器进行精确匹配,那么如果我们把
192.168.10.10
的
IP
改为
192.168.10.100
又如何呢?
同时我们也是通过几个实例来具体看一下扩展
ACL
的配置,关于标准
ACL
与扩展
ACL
的区别,我们在前面已经做了介绍,在此不再累述,下面看具体的匹配命令;
1
创建
ACL
:
Access-list ACL_number permit|deny protocol soure wildcard [port] destination waildcard [port]
大家一看就觉得比标准
ACL
要复杂点,这要可以指定源地址,目标地址,使用的协议以及使用的端口号等,当然还可以使用
log
来指定日志服务器,在此不作讲解!
2
在接口上应用
ACL
Ip access-group ACL_number in | out
下面咱们还是通过具体的实例来掌握扩展
ACL
的应用
实例:
我们拒绝
192.168.20. 0 telnet
到
192.168.10.0
上的任何一个主机上!
具体配置如下:
Router>enable
Router#conf terminal
Router(config)#access-list 101 deny tcp 192.168.20.0 0.0.0 .255 192.168.10.0 0.0.0 .255 eq 23
Router(config)#access-list 101 permit ip any any
注意:默认有一个
deny all
接下来要应用以相应的接口上,例如出端口
E 0/0
Router(config)#interface e0/0
Router(config-if)#ip access-group 101 out
配置还是很简单的!
只不过需要注意有的服务是有辅助端口的,所以一定要把辅助端口一起封!
如,如果需要封
FTP
服务器,则需要使用两条语句:
Router(config)#access-list 100 deny tcp 192.168.20.0 0.0.0 .255 192.168.10.0 0.0.0.255 eq 21
Router(config)#access-list 100 deny tcp 192.168.20.0 0.0.0 .255 192.168.10.0 0.0.0.255 eq 20
查看某上端口上应用的访问控制列表,我们可以使用命令:
show ip interface
接口,如图