一、问题

手头没有支持IPSec的路由器设备,但是想构建IPSec ×××环境,并截取IPSec数据进行协议的学习分析,怎么办?


二、解决思路

利用Dynamips模拟支持IPSec的路由器,将模拟出来的路由器接口绑定到Linux虚拟网卡上,并依托网桥技术使虚拟网卡能够与实际网卡进行通信。在上述基础环境构建完毕的基础上,配置IPSec ×××,然后在路由器接口(即虚拟网卡)上嗅探获取IPSec通信数据。

三、模拟环境构建

wKiom1YXsobyb5LwAAB-SBrZiv8622.jpg

图一 模拟环境示意图


根据上面的解决思路,拟构建的模拟环境如上图所示。在R1和R2之间构建隧道模式的IPSec ×××,PC1和PC2之间的通信数据在进入R1、R2时自动被封装成IPSec数据,在流出R1、R2时自动解封成明文的IP数据包。要将上图的模拟环境落到实处,我们需要三台机器PC1、PC2、PC3(可以是三台虚拟机),其中PC3要求为Linux操作系统,有三张网卡,且支持网桥和TAP虚拟网卡,同时能够正常运行Dynamips,另外两台(对应上图的PC1、PC2)没有特殊要求,只要是PC机即可。

模拟环境中涉及了很多虚拟的东西,如路由器、网卡、网桥等,理解起来比较艰涩。为了方便理解,给出一个全景的逻辑视图。

wKiom1YXssTS305-AAHWL4pnQyc347.jpg

spacer.gif图二 模拟环境逻辑视图


对图二的说明如下:

1、红色椭圆中的要素都运行在PC3(Linux)上

2、虚线是数据通信的逻辑效果,与图一一致

3、实线代表的是数据的实际流向。决定数据实际如此流向的是因为,tap虚拟网卡和eth真实网卡都是网络接口,具有一定的独立性,需要网桥进行桥接通信。但同时tap虚拟网卡是虚拟的,它不能脱离真实网卡而存在,所以在同一网桥下至少有一个真实网卡,以承载实际的数据通信功能。


四、具体配置实践

有了上面的理论基础,接下来就开始动手实践。先从最复杂的PC3(Linux)开始,然后再配置PC1、PC2。

1、PC3(Linux)配置

Dynamips、网桥(brctl)、三张网卡(建议用虚拟机,很方便)等先决条件请自行解决,然后按如下步骤进行

①配置网桥和虚拟网卡

brctl addbr br0

brctl addbr br1

brctl addbr br2

(说明:添加br0、br1、br2三个网桥)


ip l s dev br0 up

ip l s dev br1 up

ip l s dev br2 up

(说明:启动网桥)


tunctl -t tap0 -u root

tunctl -t tap1 -u root

tunctl -t tap2 -u root

tunctl -t tap3 -u root

(说明:添加虚拟网卡)


ip l s dev tap0 up

ip l s dev tap1 up

ip l s dev tap2 up

ip l s dev tap3 up

(说明:启动虚拟网卡)


brctl addif br0 tap0

brctl addif br0 eth0


brctl addif br1 tap1

brctl addif br1 tap3

brctl addif br1 eth1


brctl addif br2 tap2

brctl addif br2 eth2

(说明:把网卡和虚拟网卡添加到对应的网桥)


ifconfig eth0 0.0.0.0 promisc

ifconfig eth1 0.0.0.0 promisc

ifconfig eth2 0.0.0.0 promisc

(说明:把网卡设置成混杂模式)


②模拟路由器R1R2

dynamips -P 2691 -s 0:0:tap:tap0 -s 0:1:tap:tap1 ../c2691-adventerprisek9-mz.124-25d.bin

dynamips -P 2691 -s 0:0:tap:tap2 -s 0:1:tap:tap3 ../c2691-adventerprisek9-mz.124-25d.bin

(说明:分别模拟运行了路由器R1R2R1的0/0接口和tap0绑定,其他类似)

R1配置如下:

R1(config)#int fa0/0

R1(config-if)#ip add 192.168.2.1 255.255.255.0

R1(config-if)#no sh

R1(config-if)#exit

R1(config)#int fa0/1

R1(config-if)#ip add 10.0.0.1 255.255.255.0

R1(config-if)#no sh

R1(config-if)#exit

R1(config)#ip route 0.0.0.0 0.0.0.0 10.0.0.2

R1(config)#end

对R2配置如下:

R2(config)#int fa0/0

R2(config-if)#ip add 192.168.3.1 255.255.255.0

R2(config-if)#no sh

R2(config-if)#exit

R2(config)#int fa0/1

R2(config-if)#ip add 10.0.0.2 255.255.255.0

R2(config-if)#no sh

R2(config-if)#exit

R2(config)#ip route 0.0.0.0 0.0.0.0 10.0.0.3

R2(config)#end


③配置IPSec ×××

在R1上配置IKE(ISAKMP)策略:

R1(config)#crypto isakmp policy 1

R1(config-isakmp)#encryption 3des 

R1(config-isakmp)#hash sha 

R1(config-isakmp)#authentication pre-share 

R1(config-isakmp)#group 2

R1(config-isakmp)#exit

说明:定义了ISAKMP policy 1,加密方式为3des,hash算法为sha,认证方式为Pre-Shared Keys (PSK),密钥算法(Diffie-Hellman)为group 2。

 

 

在R1上定义认证标识:

R1(config)#crypto isakmp key 0 cisco123 address 10.0.0.2 

说明:因为之前定义的认证方式为Pre-Shared Keys (PSK),所以需要定义认证密码,这里定义与peer 10.0.0.2的认证密码为cisco123,并且双方密码必须一致,否则无法建立IKE SA,其中0表示密码在running-config中显示为明文。

 

在R1上配置IPsec transform:

R1(config)#crypto ipsec transform-set ccie ah-sha-hmac esp-3des esp-sha-hmac 

R1(cfg-crypto-trans)#exit

说明:配置了transform-set为ccie,认证协议使用ah,其实esp也有认证功能,可以去掉ah,单独使用esp。其中数据封装使用esp加3des加密,并且使用esp结合sha做hash计算,默认的IPsec mode为tunnel。

 

在R1上定义感兴趣流量:

R1(config)#access-list 100 permit ip 192.168.2.0 0.0.0.255 192.168.3.0 0.0.0.255

说明:这里需要被IPsec保护传输的流量为.2网段至.3网段的流量,即192.168.2.0/24发往192.168.3.0/24的流量,切记不可使用any来表示地址。

 

 

在R1上创建crypto map:

R1(config)#crypto map l2l 1 ipsec-isakmp 

R1(config-crypto-map)#set peer 10.0.0.2 

R1(config-crypto-map)#set transform-set ccie

R1(config-crypto-map)#match address 100

R1(config-crypto-map)#exit

说明:在R1上配置crypto map为l2l,序号为1,即第1组策略,其中指定加密数据发往的对端为10.0.0.2,即和10.0.0.2建立IPsec隧道,调用的IPsec transform为ccie,并且指定ACL 100中的流量为被保护的流量。

 

在R1上将crypto map应用于接口:

R1(config)#int f0/1

R1(config-if)#crypto map l2l

R1(config-if)#exit

R1(config)#

说明:将crypto map应用在去往192.168.3.0/24的接口F0/0上。

 

使用相同方式配置R3的LAN-to-LAN ×××:

R2(config)#crypto isakmp policy 1

R2(config-isakmp)#encryption 3des 

R2(config-isakmp)#hash sha 

R2(config-isakmp)#authentication pre-share 

R2(config-isakmp)#group 2

R2(config-isakmp)#exit  

 

R2(config)#crypto isakmp key 0 cisco123 address 10.0.0.1

 

R2(config)#crypto ipsec transform-set ccie ah-sha-hmac esp-3des esp-sha-hmac

R2(cfg-crypto-trans)#exit

 

R2(config)#access-list 100 permit ip 192.168.3.0 0.0.0.255 192.168.2.0 0.0.0.255

 

R2(config)#crypto map l2l 1 ipsec-isakmp 

R2(config-crypto-map)#set peer 10.0.0.1

R2(config-crypto-map)#set transform-set ccie

R2(config-crypto-map)#match address 100

R2(config-crypto-map)#exit

R2(config)#

 

R2(config)#int f0/1

R2(config-if)#crypto map l2l

R2(config-if)#

*Mar  1 00:32:58.907: %CRYPTO-6-ISAKMP_ON_OFF: ISAKMP is ON

R2(config-if)#

说明:R2与R1的IKE和IPsec策略必须保持一致。

2、配置PC1和PC2

假设PC1和PC2都是Windows操作系统,设置其IP分别为192.168.2.22、192.168.3.33,然后分别添加一条路由

route add 192.168.3.0 mask 255.255.255.0 192.168.2.1

route add 192.168.2.0 mask 255.255.255.0 192.168.3.1


五、测试

在PC3(Linux)上运行wireshark抓取tap1接口的数据,在PC1上也运行wireshark抓取网卡的数据,然后在PC2上ping PC1。PC3(Linux)和PC1上wireshark的抓取截图分别如图三、和图四。

wKiom1YXsxqCy_0eAAfFBQ_4gYg147.jpg

图三 PC3(Linux)上wireshark截图


wKiom1YXs4-gDW6YAAa1KUAY8TA153.jpg

图四 PC1上wireshark截图


图三中,抓取的是tap1虚拟网卡的数据,tap1对应R1的fa0/1接口,是IPSec ×××隧道的其中一个端点,其对应的数据应该是IPSec密数据,图三的结果印证了这一点。

图四中,抓取的是PC1上的数据,PC1上的数据已经离开IPSec ×××隧道,得到的应该是明文数据,图四的结果也印证了这一点。


好了,打完收工。