关于通配符掩码(wildcard masking)
它是由0 和255 的4 个8 位位组组成的。0 代表必须精确匹配,255 代表随意,比如:172.16.30.0 0.0.0.255,这个告诉router 前3 个8 位位组必须精确匹配,后1 个8 位位组的值可以为任意值;如果你想指定172.16.8.0 到172.16.15.0,则通配符掩码为0.0.7.255(15-8=7)
要点:
1、按顺序执行,一旦某条语句匹配,后续语句不再处理.
2、隐含拒绝,如果所有语句执行完毕没有匹配条目,则默认丢弃数据包.
3、一个ACL应该至少有一条permit语句;否则所有流量都会丢弃,因为每个ACL末尾都有隐含的拒绝语句.
4、不要忘记把ACL应用到端口上.
5、每个接口、每个协议或每个方向只可以分派一个ACL(这意味着每个接口只能有一个 acl in 和一个 acl out).
6、不能从访问列表中删除一行。如果试着这样做,将删除整个列表;只有使用命名访问列表时例外.
7、访问列表设计为过滤通过router的流量,但不过滤router本身产生的流量.
需要把ACL应用到接口上,而且还要定义过滤的方向,比如是想过滤从Internet到公司的数据包,还是想过滤从公司传出到Internet的数据包;方法分为下面两种:
1.inbound ACL:先路由,再处理
当访问列表被应用到从接口输入的包时,那些包在被路由到输出接口之前要经过访问列表的处理。不能路由任何被拒绝的包,因为在路由之前这些包就会被丢弃掉。
2.outbound ACL:先处理,再路由
当访问列表被应用到从接口输出的包时,那些包首先被路由到输出接口,然后在进入该接口的输出队列之前经过访问列表的处理。
Cisco ACL有两种类型:
1.标准ACL
2.扩展ACL
按照使用方式习惯不同也有两种方式:
一种是编号方式,另一种是命名方式
一、标准ACL
标准访问控制列表只检测数据包中的源IP地址进行过滤 ;使用 1 ~ 99 以及1300~1999之间的数字作为表号。
命令:
针对网段:access-list {1-99、1300-1999} {permit/deny} source-ip source-wildcard [log]
针对某主机: access-list {1-99、1300-1999} {permit/deny} host source-ip
//wildcard为反掩码 ( 也叫:通配符掩码,值为:255.255.255.255减去 子网掩码 );//log表示有匹配时生成日志信息;
对于标准访问控制列表来说,默认的命令是host,也就是说access-list 10 deny 192.168.1.1表示的是拒绝192.168.1.1这台主机数据包通讯,我们可以省去输入host命令。
标准ACL尽可能用在靠近目的地址的地方
【这是因为我们并不真的要在自己的网络内使用标准的访问列表。不能将标准的访问列表放置在靠近源主机或源网络的位置,因为这样会只过滤基于源地址的流量,而造成不能转发任何流量】
允许172.17.31.222通过,其他主机禁止
access-list 1 permit host 172.17.31.222 //可以省去输入host命令
禁止172.17.31.222通过,其他主机允许
access-list 1 deny host 172.17.31.222 //可以省去输入host命令
access-list 1 permit any
允许172.17.31.0/24通过,其他主机禁止
access-list 1 permit 172.17.31.0 0.0.0.255
禁止172.17.31.0/24通过,其他主机允许
access-list 1 deny 172.17.31.0 0.0.0.255
access-list 1 permit any
示例一:
Router有3个内部连接,1一个Internet连接;现在销售部不允许访问金融部,但允许他们访问市场部和Internet连接,配置如下:
(config)#access-list 10 deny 172.16.40.0 0.0.0.255
(config)#access-list 10 permit any
因为尽量把标准ACL放在离目标近的地方,所以应用在E1口,方向为out.
(config)#interface E1
(config-if)#ip access-group 10 out
示例二:
采用如图所示的网络结构。路由器连接了两个网段,分别为172.16.4.0/24,172.16.3.0/24。在172.16.4.0/24网段中有一台服务器提供WWW服务,IP地址为172.16.4.13.
实例1:禁止172.16.4.0/24网段中除172.16.4.13这台服务器访问172.16.3.0/24的计算机。
(config)#access-list 1 permit host 172.16.4.13//允许172.16.4.13的数据包通过
(config)#int e 0 //进入E0端口(因为标准ACL尽量放在离目标地址近的地方)
(config-if)#ip access-group 1 out //应用到接口E0的出方向
小提示:由于CISCO默认添加了DENY ANY的语句在每个ACL末尾,所以不需要再写access-list 1 deny any这句命令。另外在路由器连接网络不多的情况下也可以在E1端口使用ip access-group 1 in命令来宣告,宣告结果和上面效果一样。
实例2:禁止172.16.4.13对172.16.3.0/24网段的访问,而172.16.4.0/24中的其他计算机可以正常访问。
(config)#access-list 1 deny host 172.16.4.13//禁止172.16.4.13的数据包通过
(config)#access-list 1 permit any //允许其他所有计算机数据包通过
(config)#int e 0//进入E0端口
(config-if)#ip access-group 1 out//将ACL1宣告,同理可以进入E1端口后使用ip access-group 1 in来完成宣告
总结:标准ACL占用路由器资源很少,是一种最基本最简单的访问控制列表格式。应用比较广泛,经常在要求控制级别较低的情况下使用。如果要更加复杂的控制数据包的传输就需要使用扩展访问控制列表,他可以满足到端口级的要求。
二、扩展ACL
扩展访问列表可以检测数据包的源IP地址和目的IP地址,传输层或应用层协议(例如WWW,FTP等)和端口号进行过滤,使用 100 ~ 199以及2000~2699之间的数字作为表号.
命令:
access-list {100-199、2000-2699} {permit/deny} protocol [source-ip source-wildcard destination-ip destination-wildcard] [operator port] [established] [log]
//中文: access-list ACL号 [permit|deny] [协议] [定义过滤源主机范围 定义过滤目的主机范围] [定义过滤目的端口]
[operator port]
扩展ACL尽可能用在靠近源地址的地方
【既然扩展的访问列表可以过滤每个特定的地址和协议,那么你不希望你的流量穿过整个网络后再被拒绝。通过将这样的列表放置在尽量靠近源地址的位置,可以在它使用宝贵的带宽之前过滤掉此流量】
采用如图所示的网络结构。路由器连接了两个网段,分别为172.16.4.0/24,172.16.3.0/24。在172.16.4.0/24网段中有一台服务器提供WWW服务,IP地址为172.16.4.13.
实例1:禁止172.16.3.0的计算机访问172.16.4.0的计算机,惟独可以访问172.16.4.13上的WEB服务
(config)#access-list 101 permit tcp any host 172.16.4.13 eq www //设置ACL101,容许源地址为任意IP,目的地址为主机172.16.4.13的80端口即web服务
(config)#int e 0//进入E0端口(因为扩展ACL尽量放在离源地址近的地方)
(config-if)#ip access-group 101 in//应用到接口E0的入方向
设置完毕后172.16.3.0/24网段的计算机就只能访问172.16.4.0/24网段的172.16.4.13的WWW服务了,就算172.16.4.13开启了FTP服务也无法访问。所以扩展ACL有一个最大的好处就是可以保护服务器,外界仅可以访问ACL允许的端口(服务)
实例2 : 拒绝来自172.16.3.0去往172.16.4.0的FTP流量,允许其他所有流量
(config)#access-list 101 deny tcp 172.16.3.0 0.0.0.255 172.16.4.0 0.0.0.255 eq 21
(config)#access-list 101 permit ip any any
(config)#int e 0
(config-if)#ip access-group 101 in
实例3 : 拒绝来自172.16.3.5去往172.16.4.13的所有流量,允许其他所有流量
(config)#access-list 101 deny ip host 172.16.3.5 host 172.16.4.13
(config)#access-list 101 permit ip any any
(config)#int e 0
(config-if)#ip access-group 101 in
示例二:
(config)#access-list 101 permit tcp host 192.168.33.3 host 172.22.242.23 eq www
(config)#access-list 101 deny tcp any host 172.22.242.23 eq www
(config)#access-list 101 permit ip any any
(config)#interface FastEthernet0/0
(config-if)ip access-group 101 in
总结:扩展ACL功能很强大,他可以控制源IP,目的IP,源端口,目的端口等,能实现相当精准的控制,扩展ACL不仅读取IP包头的源地址/目的地址,还要读取第四层包头中的源端口和目的端口的IP。不过他存在一个缺点,那就是在没有硬件ACL加速的情况下,扩展ACL会消耗大量的路由器CPU资源。所以当使用中低档路由器时应尽量减少扩展ACL的条目数,将其简化为标准ACL或将多条扩展ACL合一是最有效的方法。
三、命名ACL
不管是标准访问控制列表还是扩展访问控制列表都有一个弊端,那就是当设置好ACL的规则后发现其中的某条有问题,希望进行修改或删除的话只能将全部ACL信息都删除。也就是说修改一条或删除一条都会影响到整个ACL列表。这一个缺点影响了我们的工作,为我们带来了繁重的负担。不过我们可以用基于名称的访问控制列表来解决这个问题。
命名标准ACL命令:
(config)#ip access-list standard name
(config-std-nacl)#{permit /deny} source-ip source-wildcard [log]
例:
建立标准ACL命名为test:允许10.1.1.103通过,其他主机禁止
(config)#ip access-list standard test
(config-std-nacl)#permit host 10.1.1.103
建立标准ACL命名为test2:禁止10.1.1.103通过,允许其他所有主机。
(config)#ip access-list standard test2
(config-std-nacl)#deny host 10.1.1.103
(config-std-nacl)#permit any
接口应用(靠近目标,出方向)
(config)#int fa0/0
(config-if)#ip access-group test out
当需要将第二条命令的deny host 10.1.1.103单独删除,如果使用非命名ACL的话,整个ACL信息都会被删除掉。正是因为使用了基于名称的访问控制列表,我们进入ip access-list standard test2后,可使用no deny host 10.1.1.103单独删除.
命名扩展ACL命令:
(config)#ip access-list extended name
(config-ext-nacl)#{permit /deny} protocol [source-ip source-wildcard destination-ip destination-wildcard] [operator port] [established] [log]
例:
仅允许10.1.1.0网段的主机访问主机209.165.202.196的web服务
(config)#ip access-list extended web_only
(config-ext-nacl)#permit tcp 10.1.1.0 0.0.0.255 host 209.165.202.196 eq www
仅允许10.1.1.101访问所有主机80端口,其他所有主机禁止
(config)#ip access-list extended test01
(config-ext-nacl)#permit tcp host 10.1.1.101 any eq www
禁止所有主机访问209.165.202.197主机的23、26口,但允许访问其他端口
(config)#ip access-list extended test02
(config-ext-nacl)#deny tcp any host 209.165.202.197 eq 23
(config-ext-nacl)#deny tcp any host 209.165.202.197 eq 26
(config-ext-nacl)#permit tcp any any
接口应用(靠近源,入方向)
(config)#int fa1/0
(config-if)#ip access-group web_only in
命名ACL还有一个优点就是可以调整语句的顺序:
每新增一条语句,顺序号默认加10
例:
Router#show ip access-lists //显示ACL
Extended IP access list test
10 deny tcp any host 209.165.202.197 eq telnet
20 permit tcp any any
如果要在前面插入:
Router#conf terminal
Router(config)#ip access-list extended test
Router(config-ext-nacl)#5 deny tcp any host 209.165.202.197 eq 8080
结果:
Router#show ip access-lists
Extended IP access list test
5 deny tcp any host 209.165.202.197 eq 8080
10 deny tcp any host 209.165.202.197 eq telnet
20 permit tcp any any
如果要在中间插入:
Router#conf terminal
Router(config)#ip access-list extended test
Router(config-ext-nacl)#15 deny tcp any host 209.165.202.197 eq 7070
结果:
Router#show ip access-lists
Extended IP access list test
5 deny tcp any host 209.165.202.197 eq 8080
10 deny tcp any host 209.165.202.197 eq telnet
15 deny tcp any host 209.165.202.197 eq 7070
20 permit tcp any any
补充:
使用IP 标准ACL 来控制VTY 线路的访问.步骤如下:
1.创建个IP 标准ACL 来允许某些主机可以telnet
2.使用access-class 命令来应用ACL 到VTY 线路上
实例如下:
Router(config)#access-list 50 permit 172.16.10.3
Router(config)#line vty 0 4
Router(config-line)#access-class 50 in
如上,进入VTY 线路模式,应用ACL,方向为进来,即in.因为默认隐含的deny any,所以上面的例子,只允许IP 地址为172.16.10.3 的主机telnet 到router 上
一些验证ACL 的命令,如下:
1.show access-list:显示router 上配置了的所有的ACL 信息,但是不显示哪个接口应用了哪个
ACL 的信息
2.show access-list [number]:显示具体第几号ACL 信息,也不显示哪个接口应用了这个ACL
3.show ip access-list:只显示IP 访问列表信息
4.show ip interface:显示所有接口的信息和配置的ACL 信息
5.show ip interface [接口号]:显示具体某个接口的信息和配置的ACL 信息
6.show running-config:显示DRAM 信息和ACL 信息,以及接口对ACL 的应用信息