一、問題
手頭沒有支持IPSec的路由器設備,但是想構建IPSec ×××環境,並截取IPSec數據進行協議的學習分析,怎麼辦?
二、解決思路
利用Dynamips模擬支持IPSec的路由器,將模擬出來的路由器接口綁定到Linux虛擬網卡上,並依託網橋技術使虛擬網卡能夠與實際網卡進行通信。在上述基礎環境構建完畢的基礎上,配置IPSec ×××,然後在路由器接口(即虛擬網卡)上嗅探獲取IPSec通信數據。
三、模擬環境構建
圖一 模擬環境示意圖
根據上面的解決思路,擬構建的模擬環境如上圖所示。在R1和R2之間構建隧道模式的IPSec ×××,PC1和PC2之間的通信數據在進入R1、R2時自動被封裝成IPSec數據,在流出R1、R2時自動解封成明文的IP數據包。要將上圖的模擬環境落到實處,我們需要三臺機器PC1、PC2、PC3(可以是三臺虛擬機),其中PC3要求爲Linux操作系統,有三張網卡,且支持網橋和TAP虛擬網卡,同時能夠正常運行Dynamips,另外兩臺(對應上圖的PC1、PC2)沒有特殊要求,只要是PC機即可。
模擬環境中涉及了很多虛擬的東西,如路由器、網卡、網橋等,理解起來比較艱澀。爲了方便理解,給出一個全景的邏輯視圖。
圖二 模擬環境邏輯視圖
對圖二的說明如下:
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
(說明:把網卡設置成混雜模式)
②模擬路由器R1、R2
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
(說明:分別模擬運行了路由器R1、R2,R1的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的抓取截圖分別如圖三、和圖四。
圖三 PC3(Linux)上wireshark截圖
圖四 PC1上wireshark截圖
圖三中,抓取的是tap1虛擬網卡的數據,tap1對應R1的fa0/1接口,是IPSec ×××隧道的其中一個端點,其對應的數據應該是IPSec密數據,圖三的結果印證了這一點。
圖四中,抓取的是PC1上的數據,PC1上的數據已經離開IPSec ×××隧道,得到的應該是明文數據,圖四的結果也印證了這一點。
好了,打完收工。