这一篇为ACL起一个头,顺便理一下思路,思路清楚一切都ok了。
ACL--Access Control List
访问控制列表
如果有不太熟悉的朋友,想象一下防火墙。ACL有几个种类,我们通过配置一个一个看,最后我会总结一个Cisco的ACL和Juniper的Policy的区别,并且尝试的说一下,使用的场景。
拓扑如下,R1作为网关,环回口模拟外网口
先查看一下基本种类
R1(config)#access-list ? //我们看了以后会发现,访问控制列表,其实是靠序号去区分的
<1-99> IP standard access list //IP 标准访问控制列表
<100-199> IP extended access list //IP扩展访问控制列表
<1100-1199> Extended 48-bit MAC address access list//扩展48位MAC地址访问控制列表(1个Byte字节==8bit位)
<1300-1999> IP standard access list (expanded range)//IP标准访问控制列表(超出范围1-99)
<200-299> Protocol type-code access list //协议类型访问控制列表
<2000-2699> IP extended access list (expanded range)//IP扩展访问列表补充(超出范围100-199)
<700-799> 48-bit MAC address access list //48位MAC地址访问控制列表
dynamic-extended Extend the dynamic ACL absolute timer
rate-limit Simple rate-limit specific access list
-----------------------------------------------------------------------------------------------------------------------------------------------------------------------
MAC地址一般我不太用,主要我们就用标准访问控制列表和扩展访问控制列表。
我先用标准访问控制列表,看输入1之后,可以做些什么?
R1(config)#access-list 1 ?
deny Specify packets to reject
permit Specify packets to forward
remark Access list entry comment
拒绝、允许、备注。一看就是动作吧,这个就是控制的动作。
我们的第一个实验就是拒绝pc2访问R1的环回口,我一点一点补齐一条ACL
R1(config)#access-list 1 deny ?
Hostname or A.B.C.D Address to match
any Any source host
host A single host address
确定动作后,我们可以使用主机名或者ip地址去控制对哪一个终端进行控制
ip地址和hostname就不说了,都懂的
any自然是所有
host就是hostname,其实后两条就是把第一条拆开
我就先填一个ip
R1(config)#access-list 1 deny 1.1.1.3 ?
A.B.C.D Wildcard bits
log Log matches against this entry
注意!!没完,后面还要再跟一个反掩码 反掩码 反掩码 !!!!!(反掩码是用来精确匹配主机的)
R1(config)#access-list 1 deny 1.1.1.3 0.0.0.0
注意,我们要拒绝的是一台ip地址为1.1.1.3 的终端,所以反掩码应该是0.0.0.0,如果你填了0.0.0.255,那你可以就拒绝了1.1.1.0整个网段
顺便我补充一个拒绝所有:access-list 1 deny 0.0.0.0 255.255.255.255
如果仅仅是控制一台主机,还可以这么写
R1(config)#access-list 1 deny host 1.1.1.3
----------------------------------------------------------------------------------------------------------------------------
好了 ACL已经写完了,接下来我们就需要完成第二步,绑定接口
理一下逻辑,我们已经写了一条ACL,对象1.1.1.3这台主机,动作:deny
R1(config)#access-list 1 deny host 1.1.1.3
开始绑定ACL条目到接口
R1(config)#int f0/0
选择,进入接口的数据包或者出接口的数据包,哪一个方向挂在ACL条目,注意这里的序号1,和之前写的序号要匹配
R1(config-if)#ip access-group 1 ?
in inbound packets
out outbound packets
我们这里选in
R1(config-if)#ip access-group 1 in
好了我们陪完了,测试一下,PC2 是不能通了,再试试PC1,咦!也不通了,为什么?
这里说一下,ACL是一个list,从第一条开始匹配操作,我们写了一条,不让PC2 1.1.1.3进入R1的f0/0 (其实数据包是进入了接口然后开始对比Access Control List,这个真的是一个List),但是ACL都会有一条默认的策略,DENY ALL!!!
我来模拟一下PC1进入f0/0的过程:
1、source Address 1.1.1.2 =》f0/0
2、匹配ACL=》第一条:你是1.1.1.3么? PC1:不是
第二条:任何ip地址,都不准进来! PC1:-_-b|||
懂了吧,不是说我没写就让你进,是我没写,那谁都进不了,之后还有别的嵌套写法,之后我们再具体说,那这里怎么办呢?很简单,给他写一条,允许PC1进入就可以了
配置:
R1(config)#access-list 1 permit host 1.1.1.2
好了!PC就能ping通2.2.2.2而PC2就ping不通
这个就是一个最简单的标准访问控制列表!
show一下
R1#sho ip access-lists 1
Standard IP access list 1
10 deny 1.1.1.3 (9 matches)
20 permit 1.1.1.2 (6 matches)
//注意这里还有一条DENY ALL
------------------------------------------------------------------------------------------------------------------------------------------
我现在可只有2台PC,如果我有10台,100台,那我是不是疯了。。。
所以我上面所说的嵌套写法就是下面这种,在写新的之前,我们先要知道怎么删除单条acl。
我们通过show ip access-lists 1已经能看到两条我们之前写在序号为1的标准访问控制链表条目
Standard IP access list 1
10 deny 1.1.1.3 (9 matches)
20 permit 1.1.1.2 (6 matches)
注意10和20这是条目的序号,如果你按照以往的方法直接no access-list 1 permit host 1.1.1.2去删除我们刚刚的配置,呵呵,不好意思,整个ACL会被全部删除!!!!
我们才写了2条,如果有20条,你就哭吧!
正确写法:
R1(config)#ip access-list standard 1 //进入标准访问控制列表1
R1(config-std-nacl)#no 10 //注意这个10就是条目的序号
再show一下
R1#sh ip access-lists 1
Standard IP access list 1
20 permit any
好了!知道怎么删,大家自己操作吧,我就把刚刚的ACL全部删了重写一个就算是100台pc也能阻止PC2访问2.2.2.2,并且其他电脑都能访问2.2.2.2的写法
//删除之前的配置
R1(config)#no access-list 1
//配置不允许PC2通过
R1(config)#access-list 1 deny host 1.1.1.3
//配置允许所有人通过
R1(config)#access-list 1 permit any
//绑定接口
R1(config-if)#ip access-group 1 in
我用一句话说下我配了什么:除了PC2的数据包,其他数据包都能从R1的f0/0进入!
由于这是第一篇ACL,我写得仔细点
R1#sho ip access-lists 1
Standard IP access list 1
10 deny 1.1.1.3 (6 matches)
20 permit any (6 matches)
//这里可是还有一条DENY ALL
想象一下,进来一个数据包的情况
f0/0 数据包 1.1.1.2
你是1.1.1.3么 不是
任何数据包都能进去 ^_^==》进入f0/0
----------------------------------------------------------
f0/0 数据包 1.1.1.3
你是1.1.1.3么 是 ==》 不准进,滚出去
------------------------------------------------------------
通过ACL的遍历的特性,并且只要有一条符合的条件,就执行操作,并且不再继续进行遍历,就能写出高性能,高兼容性的ACL。
大家要问了,兼容性可以理解,高性能怎么说?我这里简单点一下,假如我之后的扩展访问列表有30条50条,每一个数据包可以使都要检查的哦,那么我们是不是可以把常用的条目放在一个靠上的位置,不太常用的或者说低优先度的目的地址或者应用地址放在靠后的位置上?自己考虑吧
稍微总结一下:
1、标准访问列表是通过原地址(source address)来过滤的,不明白的想想上面的实验
2、一定要注意默认的列表条目,deny any,不然你的网就什么也通不了了
3、注意反掩码的使用,没明白的,看看上面第一部分,再不明白请百度。
4、顺序匹配,一旦匹配即操作并且结束匹配
5、一个接口一个方向只能挂一套ACL,进一个出一个,等于一个接口挂两套,写的时候一定要注意流向的方向
============================================================================================
接下来就是扩展访问控制列表(先把前面的ACL都删掉)
第二个实验我得把拓扑改一下PC1和PC2修改成两台路由器,并且模拟成PC,IP地址不变。
1、拒绝PC1去ping 2.2.2.2
2、拒绝PC2去telnet 2.2.2.2
-------------------------------------------------------------------------------------------------
现在做第一条
拒绝源地址为1.1.1.2目标地址为2.2.2.2的ping流量-----ping是基于ICMP的
R1(config)#access-list 100 deny icmp 1.1.1.2 0.0.0.0 2.2.2.2 0.0.0.0
允许所有流量通过
R1(config)#access-list 100 permit ip any any //ip==any Internet Protocol
挂接口
R1(config-if)#ip access-group 100 in
扩展访问控制列表就能基于源地址、目的地址、使用的协议去控制流量
这样一做我们就会发现,不止PC1无法ping通2.2.2.2,同时2.2.2.2也无法ping通PC1,
因为PING是需要有回报的。那我们重新再写一个
R1(config)#access-list 100 deny icmp host 1.1.1.2 host 2.2.2.2 echo
echo代表ping的请求包
看帮助
echo Echo (ping)
echo-reply Echo reply
R1(config)#access-list 100 permit ip any any
R1(config)#int f0/0
R1(config-if)#ip access-group 100 in
搞定
思路:我们只阻止从R1的f0/0,进入的基于ICMP的Ping请求包,其他全部放行。
那么只要是从f0/0进入的请求2.2.2.2的ping包都是过不去的,但是从2.2.2.2pingPC1就是可以的,因为回包是echo-reply没有限制他从f0/0进入
接下来,对于PC2不能使用telnet访问2.2.2.2
R1(config)#access-list 101 deny tcp host 1.1.1.3 host 2.2.2.2 eq telnet
阻止基于TCP并且源地址为1.1.1.3目的地址为2.2.2.2的端口号为telnet的端口号的数据流
R1(config)#access-list 101 permit ip any any
R1(config)#int f0/0
R1(config-if)#ip access-group 101 in
搞定!这样PC2就不能使用telnet访问2.2.2.2了(通过测试)
---------------------------------------------------------------------------------------------
这样的两个实验,应该已经能把基本的ACL操作,做一个概括了。
我个人而言,不是很喜欢标准ACL,操作虽然简单,但是功能也太简单。越是复杂,越是强大的配置命令,其实当你理解后,使用起来越方便,越自由。
Part1就在这里总结了吧!
结合Juniper的总结:
ACL的策略,无外乎几个部分,源、目的地、方向、动作、匹配参数(协议、端口等等),而Cisco中他是作为一个接口的参数去配置,所以一定要注意数据流的方向,默认的deny all的策略是CIsco和Juniper都有的,但是注意,Juniper一旦写入一条policy允许访问某一个地址的时候,回城路由是会自动写好的,而Cisco是不会的。(这里我们不讨论Juniper具体该怎么写,还是说Juniper应该对比ASA啥的。仅仅是比较和拓展一下)请注意!再次重申:一定要注意数据流的方向!!
还有一个很重要的点:ACL不能限制以本地为源的流量