Chinaunix首页 | 论坛 | 博客
  • 博客访问: 1308940
  • 博文数量: 416
  • 博客积分: 10495
  • 博客等级: 上将
  • 技术积分: 4258
  • 用 户 组: 普通用户
  • 注册时间: 2005-04-23 22:13
文章分类

全部博文(416)

文章存档

2015年(7)

2014年(42)

2013年(35)

2012年(14)

2011年(17)

2010年(10)

2009年(18)

2008年(127)

2007年(72)

2006年(23)

2005年(51)

分类: 网络与安全

2005-09-01 23:08:26

思科路由器配置acl

  Pt.1 Introduction

    IP访问控制列表(access control list,ACL)用于过滤IP流量,其中RFC 1700定义了知名(well-known)端口号,RFC 1918定义了私有IP地址空间

    Pt.2 Understanding ACL Concepts

    Using Masks

    ACL里的掩码也叫inverse mask(反掩码)或wildcard mask(通配符掩码),由32位长的2进制数字组成,4个八位位组.其中0代表必须精确匹配,1代表任意匹配(即不关心) 反掩码可以通过使用255.255.255.255减去正常的子网掩码得到,比如要决定子网掩码为255.255.255.0的IP地址172.16.1.0的反掩码:
255.255.255.255-255.255.255.0=0.0.0.255 即172.16.1.0的反掩码为0.0.0.255

    注意:

    反掩码为255.255.255.255的0.0.0.0代表any,即任意地址

    反掩码为0.0.0.0的10.1.1.2代表主机地址10.1.1.2

    Summarizing ACLs

    下面描述的是如何汇总(summarization)一组网络地址,来达到优化ACL的目的:

192.168.32.0/24
192.168.33.0/24
192.168.34.0/24
192.168.35.0/24
192.168.36.0/24
192.168.37.0/24
192.168.38.0/24
192.168.39.0/24

    这组IP地址的前2个和最后1个八位位组是一样的,再看第3个八位位组,把它们写成2进制的形式:

32:00 10 00 00
33:00 10 00 01
34:00 10 00 10
35:00 10 00 11
36:00 10 01 00
37:00 10 01 01
38:00 10 01 10
39:00 10 01 11

    注意这组范围里的前5位都是一样的,所以这组IP地址范围可以汇总为192.168.32.0/21 255.255.248.0,那么这组IP地址范围的反掩码为255.255.255.255-255.255.248.0=0.0.7.255

    比如在做IP standard ACL的时候,就可以:

access-list 10 permit 192.168.32.0 0.0.7.255

    再来看另一组IP地范围:

192.168.146.0/24
192.168.147.0/24
192.168.148.0/24
192.168.149.0/24

    照之前的方法,把第3个八位位组写成2进制形式:

146:10 01 00 10
147:10 01 00 11
148:10 01 01 00
149:10 01 01 01

    是不是可以写成192.168.146.0/21呢?不是.因为采用/21的话将有8个子网将被考虑进去,如果在用ACL拒绝上述1组地址的时候,就有可能把另外4个地址给封杀掉.一定要考虑到精确匹配,上述地址就只能汇总成下面这2条地址:

对于192.168.146.x-192.168.147.x为:192.168.146.0/23(192.168.146.0 255.255.254.0)
对于192.168.146.8-192.168.149.x为:192.168.148.0/23(192.168.148.0 255.255.254.0)

    所以反掩码分别为:0.0.1.255和0.0.1.255

    比如在做IP standard ACL的时候,就可以:

access−list 10 permit 192.168.146.0 0.0.1.255
access−list 10 permit 192.168.148.0 0.0.1.255

Processing ACLs

    当流量经过了配置的有ACL的路由器的时候,将和ACL里的条目从上往下的进行比较,直到找到匹配的语句为止,如果没有任何匹配的语句,流量将被拒绝(deny)掉.一般在设置ACL的时候,尽可能的把permit语句放在ACL的最上部.并且要记住的是,ACL在结尾处默认隐含的有1条拒绝所有流量的deny语句,如下2个ACL,ACL 101和ACL 102是有相同的效果的:

access-list 101 permit ip 10.1.1.0 0.0.0.255 172.16.1.0 0.0.0.255

access-list 102 permit ip 10.1.1.0 0.0.0.255 172.16.1.0 0.0.0.255
access-list 102 deny ip any any

    ACL例子如下:

access-list 101 permit tcp host 10.1.1.2 host 172.16.1.1 eq telnet
access-list 101 permit tcp host 10.1.1.2 host 172.16.1.1
access-list 101 permit udp host 10.1.1.2 host 172.16.1.1
access-list 101 permit ip 10.1.1.0 0.0.0.255 172.16.1.0 0.0.0.255

    最后1条语句就足够了,前3条语句可以不用配置.因为TCP就包括了telnet,并且IP包括了TCP和UDP.所以只需要写最后1条语句即可

Defining Ports and Message Types

    在设置ACL的时候,可能不光要设置源地址和目标地址,还要设置端口号(参阅RFC 1700)或ICMP信息类型(参阅RFC 792).当然可以在设置的时候输入?来查看提示,如下:

access-list 102 permit tcp host 10.1.1.1 host 172.16.1.1 eq ?
bgp Border Gateway Protocol (179)
chargen Character generator (19)
cmd Remote commands (rcmd, 514)

    在配置的时候,路由器同样可以把数字转化为人性化的值,比如在设置下面的ICMP类型14的时候:

access-list 102 permit icmp host 10.1.1.1 host 172.16.1.1 14

    就成了:

access-list 102 permit icmp host 10.1.1.1 host 172.16.1.1 timestamp-reply

    Applying ACLs

    当你配置了ACL的时候,不在路由器上应用它,是将不会生效的.如下图:



    当你要阻断从source到destination的流量的时候,尽可能的把ACL设置在离源地址近的地方,即在路由器A上的E0接口(inbound) 
    Defining in and out

   in和out是相对于路由器来说的.离开路由器接口的流量即为out;进入这个路由器的接口的流量即为in.在配置ACL的时候,in和out并不是绝对的.比如上面那个例子,在路由器A上设置ACL,方向就要用in,因为站在路由器A的角度上看,流量是进入路由器A的.但是同样可以把ACL设置在路由器C上的E1接口,方向为out,因为流量是离开路由器C

    Editing ACLs

    在对ACL进行编辑的时候要特别的注意.如果你删除了ACL中某条语句,那么整个ACL也随之被删除掉了.如下:

router#config t
router(config)#access-list 101 deny icmp any any
router(config)#access-list 101 permit ip any any
router(config)#^Z
router#show access-list
Extended IP access list 101
deny icmp any any
permit ip any any
router#
*Mar 9 00:43:12.784: %SYS-5-CONFIG_I:
Configured from console by console
router#config t
router(config)#no access-list 101 deny icmp any any
router(config)#^Z
router#show access-list
router#
*Mar 9 00:43:29.832:
%SYS-5-CONFIG_I: Configured from console by console

    所以如果你要修改ACL的语句的时候,可以把路由器的配置拷贝到TFTP服务器上,用文本编辑器比如notepad.exe进行编辑后,在拷贝回路由器上

    当然也可以用命名访问列表的方式进行修改(稍后讲解),如下:

router#config t
router(config)#ip access-list extended test
router(config-ext-nacl)#permit ip host 2.2.2.2 host 3.3.3.3
router(config-ext-nacl)#permit tcp host 1.1.1.1 host 5.5.5.5 eq www
router(config-ext-nacl)#permit icmp any any
router(config-ext-nacl)#permit udp host 6.6.6.6 10.10.10.0 0.0.0.255 eq domain

    验证下ACL的设置,如下:

router#show access-list
Extended IP access list test
permit ip host 2.2.2.2 host 3.3.3.3
permit tcp host 1.1.1.1 host 5.5.5.5 eq www
permit icmp any any
permit udp host 6.6.6.6 10.10.10.0 0.0.0.255 eq domain

    设置好ACL,进行删除和增加语句,如下:

router(config)#ip access-list extended test
router(config-ext-nacl)#no permit icmp any any /---------------删除1条语句---------/
router(config-ext-nacl)#permit gre host 4.4.4.4 host 8.8.8.8 /---------------增加1条语句---------/

    修改后进行验证,如下:

router#show access-list
Extended IP access list test
permit ip host 2.2.2.2 host 3.3.3.3
permit tcp host 1.1.1.1 host 5.5.5.5 eq www
permit udp host 6.6.6.6 10.10.10.0 0.0.0.255 eq domain
permit gre host 4.4.4.4 host 8.8.8.8

    可以看到新增的语句位于ACL的结尾

    当要删除整个ACL的时候,使用如下命令:

interface
no ip access-group in|out

Troubleshooting

    当要对流量进行debug的时候,首先要确认,当前设置的有ACL,但是没有应用它,并且路由器的fast-switching要关闭,步骤如下:

    1.使用access-list命令捕捉需要监测的数据,比如:

access-list 101 permit ip any host 10.2.6.6
access-list 101 permit ip host 10.2.6.6 any

    2.在卷入debug过程中的接口的fast-switching功能要关闭,如果不关闭的话,将只看的到第一个经过该接口的包.在接口配置模式下使用如下命令:

no ip route-cache

    3.在特权模式下使用terminal monitor命令,这样debug输出的信息将被显示

    4.使用debug ip packet 101 [detail]命令开始debug

    5.debug完成以后,在特权模式下使用no debug all命令关闭debug.并且进入接口配置模式使用ip route-cache命令打开fast-switching功能

   
Pt.3 Types of IP ACLs

    Standard ACLs

    标准ACL是比较古老的ACL,可以追溯到Cisco IOS Release 8.3.标准ACL(以IP访问列表为例)通过比较IP包的源地址和ACL中设置的地址来做转发或者丢弃的决定.语法如下:

access-list {permit|deny} {host |source wildcard-mask | any}

    在一般的IOS版本中,access-list-number的范围是1到99.在Cisco IOS Release 12.0.1中,还可以使用额外的一段1300到1999

    当定义了标准ACL以后,进入接口配置模式使用如下命令进行应用:

ip access-group {in|out}

    Extended ACLs

    扩展ACL是在Cisco IOS Release 8.3中引入的.顾名思义,它和之前那种古老的比较方式,增加了许多额外的比较.命令如下:

    对于IP:

access-list [dynamic dynamic-name [timeout minutes]] {deny | permit} protocol source wildcard-mask destination wildcard-mask [precedence precedence] [tos tos] [log | log-input] [time-range time-range-name]

    对于ICMP:

access-list [dynamic dynamic-name [timeout minutes]] {deny | permit} icmp source wildcard-mask destination wildcard-mask [icmp-type | [[icmp-type icmp-code] | [icmp-message]] [precedenceprecedence] [tos tos] [log | log-input] [time-range time-range-name] 
  对于UDP:

access-list [dynamic dynamic-name [timeout minutes]] {deny | permit} udp source wildcard-mask [operator [port]] destination wildcard-mask [operator [port]] [precedence precedence] [tos tos] [log | log-input] [time-range time-range-name]

    对于TCP:

access-list [dynamic dynamic-name [timeout minutes]] {deny | permit} tcp source wildcard-mask [operator [port]] destination wildcard-mask [operator [port]] [precedence precedence] [tos tos] [log | log-input] [time-range time-range-name]

    在一般的IOS版本里,access-list-number可以为101到199.在Cisco IOS Release 12.0.1以后,还可以额外的使用2000到2699

    再接下来就要将定义好的ACL应用在接口上,命令如下(接口配置模式下):

ip access-group {acl-number | acl-name} {in|out}

Lock and Key (Dynamic ACLs)

Lock and Key(也叫动态ACL)是在Cisco IOS Release 11.1引入的.这个特性是依靠于telnet,验证(authentication,本地和远程)还有扩展ACL的

Lock and Key的配置是在应用ACL的时候进行设置的,当验证通过以后,才允许telnet,语法如下:
username password
interface
ip access-group {number|name} {in|out}

    验证之后将动态的往现有ACL里增加1条语句,语法如下:

access-list dynamic {permit|deny} [protocol] {source wildcard-mask|any} {destination wildcard-mask|any} [precedence precedence] [tos tos] [established] [log|log-input] [operator destination-port|destination port]
接下来:
line vty
login local

    如下就是一个Lock and Key的配置例子:

username test password 0 test
username test autocommand access-enable host timeout 10 /-----定义空闲超时时间为10分钟---/
interface Ethernet0/0
ip address 10.1.1.1 255.255.255.0
ip access-group 101 in
access-list 101 permit tcp any host 10.1.1.1 eq telnet
access-list 101 dynamic testlist timeout 15 permit ip 10.1.1.0 0.0.0.255 172.16.1.0 0.0.0.255
line vty 0 4
login local
当10.1.1.2要telnet到10.1.1.1的时候,动态ACL将被应用.当telnet连接断开以后,用户就可以访问172.16.1.x网络

IP Named ACLs

    命名ACL是在Cisco IOS Release 11.2引入的,它允许用命名的方式取代数字,IP命名ACL语法如下:

ip access-list {extended|standard}

    如下是一个使用命名ACL来阻断除telnet以外10.1.1.2到172.16.1.1的流量的例子

interface Ethernet0/0
ip address 10.1.1.1 255.255.255.0
ip access-group in_to_out in

ip access-list extended in_to_out
permit tcp host 10.1.1.2 host 172.16.1.1 eq telnet:

Reflexive ACLs

    反身ACL是在Cisco IOS Release 11.3引入的.它只能和扩展的命名IP ACL一起定义而不能和基于数字的或标准ACL,以及其他协议的ACL一起.语法如下:

ip access-list extended permit any any reflect name [timeout ]
ip access-list extended evaluate
interface
ip access-group {number|name} {in|out}

    下面引用一个例子(原作者: alienguo 出处:雨声论坛):



    做网络的单向访问其实实现的是防火墙的基本功能:我是内网,你是外网,我能访问你,但你不能访问我.
所以现在假设RouterA的E0口所连网段为内网段,RouterA S0所连的网段为外网段,还假设我想做的是内网的PC机能ping通外网RouterB的S1口,但RouterB却ping不进我的内网.

    用ACL来实现类似的单向访问控制需要用到一种特殊的ACL,叫Reflexive ACL.Reflexive ACL的配置分为两个部分,一部分是outbound的配置,一部分是inbound的配置.

    在继续下面的说明之前,先说点题外话.在最开始想到单向访问问题时,我(也包括其它一些我的同事)自然的就这么想:那我在E0口上允许PC的流量进来,然后再在S0口上禁止RouterB的流量进来不就行了?看上去好像没什么问题,但一试就知道其实是不行的.为什么不行呢,因为很多人都忽略了这么一个问题:即绝大多数的网络流量都是有去有回的,上面的方法只解决了去的问题,但这个流量在到达RouterB后,RouterB还需要返回这个流量给PC,这个返回的流量到了RouterA的S0口,但上面的方法却在S0口上禁止了RouterB的流量进来,回来的流量被挡住了,通讯失败.

    好,下面再切回来.Reflexive ACL中outbound的部分决定了我出去的哪些内网网络流量是需要被单向访问的,inbound部分决定了这些流量在返回后能被正确的识别并送给内网发起连接的PC机.
Reflexive ACL中outbound的部分:
ip access-list extended outbound_filter
permit icmp any any reflect icmp_traffic
permit ip any any

!---注意在Reflexive ACL中只能用named方式的ACL,不能用numbered方式的ACL.

!---基本配置和普通ACL并没有什么太多不同,不同之处是reflect icmp_traffic,它的意思是这条ACE作为单向流量来处理,并且给了一个名称叫icmp_traffic,icmp_traffic在inbound部分被引用.

!---permit ip any any并不是必要的,加在这里是为了另一个测试,下面会说明.

Reflexive ACL中inbound的部分:
ip access-list extended inbound_filter
evaluate icmp_traffic
deny ip any any log

!---inbound的配置有和普通ACL有点不同了,第一句evaluate icmp_traffic对上述outbound配置中的icmp_traffic进行了引用,也就是说,它要检查从外网进来的流量,如果这个流量确实是从内网发起的对外访问的返回流量,那么允许这个流量进来.

!---注意deny ip any any log这句,虽然这句也是不必配的,因为是默认的deny ip any any,但我加了log来对上面outbound部分的permit ip any any进行测试.

    Reflexive ACL中应用到接口的部分:

interface Serial0
ip address 192.1.1.1 255.255.255.0
ip access-group inbound_filter in
ip access-group outbound_filter out

!---这里也有一些讲究,ACL outbound_filter被应用到外网口的out方向,ACL inbound_filter被应用到外网口的in方向,in和out不能搞混.

    好,现在进行测试,在10.1.1.2上ping 192.1.1.2,通了,RouterB上则ping不通10.1.1.2.
现在还余下一个问题:路由器既然已经deny了外网进来的所有流量,那么它是怎么允许内网出去的返回流量进来呢?

    它是通过创建动态生成的ACL来允许返回流量的,下面看看show access-list的结果:

……
Reflexive IP access list icmp_traffic
permit icmp host 192.1.1.2 host 10.1.1.2 (24 matches) (time left 196)
……

    这些动态ACL可通过TCP的FIN/RST包来动态自动消除,对ICMP这样stateless的包来说,是通过内置的timer来消除的,这点可通过上述show access-list结果中的(time left 196)来核实.

    最后再说说那另一个测试,也就是两个ACL中加的多余的东西:

ip access-list extended outbound_filter
permit ip any any

ip access-list extended inbound_filter
deny ip any any log

    我在10.1.1.2上发起一个到192.1.1.2的TELNET连接,这个流量到了S0口后由ACL outbound_filter中的permit ip any any检测后放行.到了RouterB后,RouterB进行处理然后返回流量,这个流量到了S0口后由inbound_filter检测,因为evaluate icmp_traffic中并没有包含对TCP类型流量的检测,这个包由deny ip any any log一句处理后丢弃并生成日志:

00:24:28: %SEC-6-IPACCESSLOGP: list inbound_filter denied tcp 192.1.1.2(23) -> 10.1.1.2(1483), 1 packet

Time-Based ACLs Using Time Ranges

    基于时间的ACL是在Cisco IOS 12.0.1T中引入的,顾名思义,它对流量的控制可以是基于时间的.命令如下:

    1.定义time range(时间范围):

time-range

    2.定义时间周期:

periodic [days-of-the-week] hh:mm to [days-of-the-week] hh:mm
或,定义绝对时间:
absolute [start time date] [end time date]

    3.把time range使用在ACL中:

ip access-list time-range
例子如下:
time-range EVERYOTHERDAY
periodic Monday Wednesday Friday 8:00 to 17:00

access-list 101 permit tcp 10.1.1.0 0.0.0.255 172.16.1.0 0.0.0.255 eq telnet time-range EVERYOTHERDAY

interface Ethernet0/0
ip address 10.1.1.1 255.255.255.0
ip access-group 101 in

Commented IP ACL Entries

    为ACL语句标记注释这个特性是在Cisco IOS Release 12.0.2.T中引入的.

    为命名ACL添加注释的语法为:

ip access-list {standard|extended} remark

    为基于数字的ACL添加注释的语法为:

access-list remark

    例子如下:

access-list 101 permit tcp host 10.1.1.2 host 172.16.1.1 eq telnet
access-list 101 remark permit_telnet

interface Ethernet0/0
ip address 10.1.1.1 255.255.255.0
ip access-group 101 in

阅读(2390) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~