路由器部分重点在理论的理解,配置命令指示辅助理解理论。防火墙部分则是在理解理论的基础上学习配置的过程,也是验证理论的过程

   easy ×××需要解决的问题


当两台路由器之间通信的流量出现匹配crypto ACL流量时,就会触发建立ipsec ×××的连接。在L2Lipsec ×××建立过程中,连接建立经历两个阶段。

 

1、阶段1:建立管理连接

1)协商采用何种方式建立管理连接

2)通过DH算法共享秘钥信息

3)对等体彼此进行身份验证

2、阶段2:建立数据连接

1)定义对等体间保护何种流量

2)定义用来保护数据的安全协议

3)定义传输模式

按照上述过程建立连接对于远程访问×××而言就会存在一些问题。远程访问×××一般来说,一端是硬件设备,如路由器、防火墙等;另一端则是客户端设备,如台式机、笔记本电脑等。这是客户端一侧的安全性就会存在一定问题。大家可以试想一下,公司网关级的设备与PC的安全管理级别肯定是不同的,更何况很多员工可能要从家里访问公司的资源,家用的电脑就会存在更多的安全隐患。而整个ipsec ×××加密传输的根本就是事先配置在设备上的预共享秘钥,一旦秘钥外泄,整个ipsec ×××所作的努力全都会付之东流。而ipsec只是考虑通过隧道传输提供一种安全的机制,并没有引入任何的用户名/密码的验证机制,所以当ipsec被应用于远程×××的时候,将在安全问题上存在很大的隐患。

另一个问题是,建立L2L IPSEC ×××时,双方都有固定的ip地址,这样我们才有可能在配置crypto map的时候指定对方的peer,才有可能配置crypto ACL来定义哪些流量将触发链接的建立。但是对于远程访问×××而言,客户端一侧的ip是不可能固定的,因此,如果我们依然按照L2L的思路来建立链接是不可能的。

 

二、在路由器上实现easy ×××

1、使用XAUTH做用户验证

1)XAUTH

Ipsec协议最初的设计并未考虑用户验证的问题,所以IETF引入了一个RFC的草案--XAUTH。它是一个×××网关的增强特性,提供用户名和密码的方式来验证用户身份。由于这个过程是在两个连接建立之间完成的,所以被戏称为“阶段1.5”。谈到用户验证自然就会涉及用户名和密码的存储方式,通常情况下有两种方式。

存储在×××网关设备的内部数据库中。

存储在第三方设备上,如一台AAA服务器。

虽然增加了用户名和密码的验证过程,但如果远程访问的×××用户的PC或笔记本电脑丢失,***还是可以从本地或得到相关用户名和密码,这样就又回到最初的安全性问题上去了。所以研发人员提供了两种解决方案。

用户可以使用令牌卡,使得每次输入用户名/口令都是不同的(与令牌卡的内容相关)。

×××的管理员强制客户端不得本地存储用户名/口令,用户每次必须手动输入。

第一种方案相对第二种的安全性要略强一点,但是它在用户的易用性方面就不够好了,很多用户必须携带令牌卡,经过较长的时间才能成功登录到×××访问相关资源。而第二种方案虽然安全性方面略逊一筹,但它对于用户而言没有那么麻烦,这又是安全性和易用性的一次博弈,其实在网络环境中很难做到绝对的安全,对于设备厂商而言更多收到的是来自易用性方面的投诉,所以cisco选择了第二种方案。安全性方面的努力更多地应该借助于对用户安全意识的培养。这当然也是×××管理员的职责之一。所以对于网络的安全性管理往往包括网络环境管理和人员管理两个方面。

2)AAA的定义

AAAauthentication(验证)、authorization(授权)和accounting(统计)的缩写,它提供了在网络设备上配置访问控制的基本框架。

验证:用户是谁

对用户的合法性进行验证,包括用户名,密码等信息的验证。

授权:用户可以做什么?

在用户通过验证后,为用户指定其能够使用的服务器等等权限。

统计:用户做过什么?

在用于验证、授权成功后,记录用户的操作等信息,以便用于记账、审计和报告。

 

实现AAA服务器主要使用RADIUS协议和TACACS+协议。

RADIUSremote authentication dial in user server,远程验证拨入用户服务)是一个开发的标准协议,厂商或用户可以灵活地修改RADIUS。只加密数据包中的密码。基于UDP协议。

TACACS+terminal access controller access control system,终端访问控制器访问控制系统)是cisco设计的私有协议。对整个数据包加密。基于TCP协议。

 

 

3)AAA的配置

第一步:在路由器上需要通过aaa new-model命令启用AAA

R1(config)#aaa new-model

 

第二步:为远程访问×××客户端进行认证。

R1(config)#aaa authentication login ***_authen local

Aaa authentication login命令用于指定客户端的认证的方式,authentication_list_name只是该方式的名称,在配置远程×××的时候一般采用两种方法:localgroup radius

 

Local:是指本地认证方式,即在路由器上手动配置用户名和密码。

Group radius:一般是通过一台AAA RADIUS服务器实现用户名和密码的验证,当客户端发送用户名和密码给路由器时,路由器会转给指定的RADIUS服务器进行验证。

 

第三步:配置用户名和密码。

语法:Username  username  {password | secret} password

R1(config)#username cisco password cisco

如果指定了secret,路由器将自动加密用户的密码。

 

第四步:为远程访问×××客户端进行授权。

语法:Aaa authentication network authentication_list_name method1 [method2......]

Aaa authentication network:指定AAA将授权客户端使用IPSEC ×××隧道。

 

R1(config)#aaa authorization network ***_author local

 

5)应用到静态crypto map

R1(config)#crypto map mymap client authentication list ***_authen

R1(config)#crypto map mymap isakmp authorization list ***_author

将认证和授权的过程应用到crypto map中,这样之前的用户名和密码验证就能与远程访问×××关联起来。

 

 

2、组策略

之前内容提及了一个关键的问题,由于与×××网关建立连接的客户端可能很多,所有peerIP地址就不会固定,crypto ACL也不会唯一。最好的解决办法就是让×××网关“推送”这些策略给客户端。但是很多情况下客户端的这些策略可能是相同的,因此在远程访问×××中引入组的概念,将这些具有相同策略的客户端划分在一个组里,在×××网关上一次性为一组客户端配置策略。这样在配置过程和管理过程中都将大大节省工作量。

 

1)地址池

根据之前所学内容,远程访问×××客户端之所以与×××网关很难建立连接,是因为客户端没有固定的ip地址(与×××网关建立连接的不只是一台PC)。在这种动态的情况下,最好的办法就是让×××网关像DHCP服务器一样为每个通过验证的客户端“推送”IP地址,由于客户端的ip地址是***网关动态分配的,网关自然之道应该与那个ip建立***连接。

1)dns和网关

正像dhcp服务器,除了给客户端分配ip地址之外,还会分配网关和dns***网关也会给客户端推送网关和dns。这样客户端主机就拥有了内网的ip、网关及dns等必备的地址资源,真正成为内网的一员。当客户端收到这些策略后,它将只有内网的网关和dns地址。


3)共享秘钥

L2L的过程中,需要根据预共享秘钥演算出用于加密,身份验证,完整性验证的秘钥,支持后续×××连接的建立及数据通信。在远程访问××××××网关需要与多组客户端“共享秘钥”,因此在配置×××网关的时候需要为每组客户端设置不同的共享秘钥。客户端的秘钥并不是×××网关推送的,而需要用户通过客户端软件配置在主机上,而这个过程一般是由公司的×××管理员操作实现的,那么这个秘钥自然是保存在客户端主机本地。


4)分离隧道

默认情况下,客户端与×××网关建立隧道后,只能访问内网授权资源。这是因为隧道会允许所有的流量,也就是说所有流量必须经过隧道到达公司的内网,自然也就不允许任何流量访问外网。但对于用户而言,办公的同时访问internet是再平常不过的需求了,所以需要针对远程访问×××配置ACL来分离隧道。

通过配置ACL,所有permit的流量都被加密传输,所有deny的流量都被明文传输,而加密的流量就是通过隧道访问公司内网的流量,明文的流量就是访问internet的流量,将这个ACL应用到组策略中即可实现需求。

客户端通过认证后,ACL将随其他组策略一同被推送到客户端主机,此时主机的网关将变为公网网关,查看主机的路由表发现有一条明细的路由指向×××网关,这条明细的路由就是×××客户端根据推送过来的ACL生成的。

 

5)分离DNS

当客户端主机通过远程访问×××连接到公司内网,即使分离隧道后,客户端访问internetweb服务器时,也需要使用公司的内网的dns解析,这是一个不合理的过程,细想一下,客户端每次访问外网的某一个域名,都需要不远×××地去公司内部进行dns解析,其实是没有必要的。但如果客户端访问的是公司内网的web服务器就需要内网的dns解析。若要实现访问不同的域名使用不同的dns,使用的最佳方案就是分离dns


***网关上配置了分离dns后,客户端访问www.benet.com的时候就会使用内网dns解析,访问www.cisco.com的时候就会使用外网dns解析。

 

1)组策略的配置

第一步:创建地址池

Ip local pool pool_name first_ip_addresslast_ip_address

Pool_name:地址池的名称。

First_ip_address last_ip_address:地址池的ip范围。

 

 

第二步:创建用户组

Crypto isakmp client configuration group{group_name | default}

如果AAA的授权方式选择了本地授权方法,在路由器上就需要定义组从而实现组策略的授权。Group_name:指这个组的名字,方便后续命令调用组。而default参数用于创建一个默认组,如果用户没有指定特定组,则默认使用default组,当选择default参数后,可以对默认组的参数进行修改。

 

第三步:配置策略

创建组后将会进入子配置模式,该模式用于配置组策略。

Key pre_share_key

Pool pool_name

Dns 1st_dns_server [2nd_dns_server]

Key命令用于配置预共享秘钥,该组用户都要配置这个秘钥才能与×××网关建立管理连接。

Pool命令用于应用之前配置的地址池。与KEY命令类似,地址池的应用也可以配置在全局模式,区别在于应用的范围。如果在全局模式,那么所有连接的客户端都被推送该地址池的ip;如果配置在组里,那么只有该组的客户端使用这个地址池的IP

Dns用于指定内网的dns服务器的ip,同时可以指定备份的dns服务器的ip


 

Ip access-list extended acl_name

Permit ip source source-wildcard any

Acl acl_name_or_#

Split-dns domain_name

 

配置分离隧道的时候要先配置acl,这里需要强调一点,acl是基于***网关的角度编写的,也就是说这里的source指的是×××网关这一侧。当ACL被推送到客户端时,相对于客户端而言,source是建立***连接后客户端被授权访问的内网资源。

Acl配置完成后需要应用到组策略中,通过命令ACL调用之前的名称或序列号即可。Split-dns命令用于分离dnsdomain_name参数表示希望×××网关内部dns解析的域名。分离dns的命令如下:

Split-dns benet.com

 

还有一个组策略的内容是save-password,意思是让客户端自动保存用户名和密码,在这之前的内容已经分析过了,让客户端保存用户名和密码会导致安全性下降,所以cisco产品默认情况下是要求手动输入用户名和密码的。

 

上述给出的只是较为常见的组策略,除此之外还有很多内容,如果大家希望了解更过,可以到cisco的官方网站查看相关资料。

3、动态crypto map


动态的crypto map简单的说就是无需上述必要配置的静态crypto map,这些配置将在ipsec 参数协商时被动态填充。使用动态的crypto map必须采用isakmp/ike发起协商,而且在实现远程访问***的时候通常在***网关上需要同时配置静态和动态的crypto map,因为只有一台具有静态配置的设备可以发起ipsec隧道。也正因如此,动态的crypto map很少被用于L2L会话建立。

 

在实现远程访问×××的时候,一般会先配置transform-set,因为指定传输集与peerip地址无关,可以将传输集直接应用到动态crypto map。由于在接口上只能配置一个crypto map,且***网关上必须有静态crypto map,所以需将动态的crypto map应用到静态的crypto map中。再将静态crypto map应用到接口上。上述过程就是配置crypto map的一般思路。如下图所示:

 

1)创建动态crypto map

第一步:配置transform-set

Cyrpto ipsec transform-set ydw-set esp-3des esp-sha-hmac

 

第二步:创建动态crypto map

Crypto dynamic-map dynamic_map_name sequence_#

Set transform-set ydw-set

 

首先指定transform-set的名称和加密验证方式。该命令已在之前内容讲解过,这里直接应用esp-3desesp-sha-hmac两种加密验证方式。之后通过cyrpto dynamic-map创建动态crypto map,与静态的crypto map类似,dynamic_map_name是指动态crypto map的名称,sequence_#是序号,用于定义优先级。在动态crypto map中定义transform-set

 

2)应用动态crypto map

第一步:应用到静态crypto map

Crypto map static_map_name seq_# ipsec-isakmp dynamic dynamic_map_name

 

第二步:应用到接口

Int f0/0

Crypto map static_map_name

 

配置静态crypto map命令大家已经知道了,这里只是新增了参数dynamic,用于调用动态crypto map的名称。这里大家也许会有疑问,在静态crypto map下面没有配置任何具体的参数,如peercrypto acl。因为这里调用了动态的crypto map,这是静态crypto map存在的原因,之前我们已经配置了相关命令向客户端推送peeracl,当ipsec连接建立的时候,***网关会自动根据推送的配置内容来匹配这些要素,只要客户端的秘钥及用户名和密码验证都正确。即使之前没有配置分离隧道,crypto acl也会推送到客户端,只不过推送的内容是全部匹配的。

另一个关键的问题是seq_#,调用动态crypto map的序列号一般配置的比较大,这样优先级就会比较低。原因是***网关上可能配置多种***,如远程访问***L2L ***并存。但是由于实际需求,这些***使用的是同一个名称的crypto map(接口只能同时生效一个crypto map)。这是就会遇到先匹配那个crypto map的问题,这取决于序列号。由于L2L ***需要指定具体的peercrypto acl,因此L2Lcrypto map更加“明细”,优先级应该配置的高一些。否则,所有的map就会先匹配“不明细”的动态crypto map,而导致L2L ***无法建立。