8、ISATAP隧道

FLy_鵬程萬里發表於2018-06-09

基本概念

 ISATAP(Intra-SiteAutomatic Tunnel Addressing Protocol)
 ISATAP是一種非常容易部署和使用的IPv6過渡機制。在一個IPv4網路中,我們可以非常輕鬆的進行ISATAP的部署,首先你的PC需是V4/V6雙棧PC,然後,需要有一臺支援ISATAP的路由器,ISATAP路由器可以在網路中的任何位置,只要PC能夠ping通它(當然,你要知道路由器的IPv4地址)。那麼接下去,我們可以通過在路由器上部署ISATAP,這樣網路中支援ISATAP的雙棧主機,在需要訪問IPv6資源時,可以與ISATAP路由器建立起ISATAP隧道,ISATAP主機根據ISATAP路由器下發的IPv6字首構造自己的IPv6地址(這個IPv6地址是被自動關聯到ISATAP主機本地產生的一個ISATAP虛擬網路卡上),並且將這臺ISATAP路由器設定為自己的IPv6預設閘道器,如此一來,後續的這臺主機就能夠通過這臺ISATAP路由器去訪問IPv6的資源。

 這種方法部署起來非常簡單,在許多場合,客戶為了節省成本,又希望網路中的IPv6主機能夠訪問V6資源,同時又不願意對現有網路做大規模的變更及裝置升級,那麼就可以採用這種方法,購買一臺支援ISATAP的路由器,甚至可以將ISATAP路由器旁掛在網路上,只要它能夠訪問V6資源並且響應ISATAPPC的隧道建立請求。

ISATAP的功能元件如下

1、自動隧道:
ISATAP的隧道機制也是自動的,隧道在主機和ISATAP路由器之間被建立。主機首選需要知道ISATAP路由器的IPv4地址。

2、ISATAP地址格式:
分配給ISATAP路由器的IPv6地址是全域性單播地址,該地址的字首將被ISATAP主機用於自己的IPv6地址構造。ISATAP主機通過在IPv4建立起來的ISATAP隧道從ISATAP路由器傳送的訊息中接收/64的IPv6字首,並且使用這個字首結合“特殊的介面標識”來構造自己的IPv6地址。

3、介面標識:

ISATAP在主機上啟用後,會產生一個ISATAP虛擬網路卡,該虛擬網路卡會產生一個64bits的特殊介面標識,有點類似EUI-64,但是產生機制不同,它是由專為ISATAP保留的32位的0200:5EFE加上主機上配置的IPv4地址構成,如下圖,假設ISATAP主機配置的IPv4地址為1.1.1.1,那麼ISATAP虛擬網路卡的64bits介面標識就是:


另一方面,在路由器上部署ISATAP後,路由器也會產生一個tunnel介面,用於響應ISATAP主機的隧道建立請求,這個tunnel介面同樣會產生介面標識。地址的格式是IANA保留給ISATAP的32位元的0000:5EFE後追加32位元的IPv4地址。如下圖,假設給ISATAP路由器配置的IPv4地址(用於隧道的)是2.2.2.2,那麼ISATAPtunnel的介面標識就是:


這裡關於64bits的介面標識中“為ISATAP保留的”高階32bits在維基百科上有這麼一段描述:“The link-localaddress is determined by concatenatingfe80:0000:0000:0000:0200:5efe: for global unique andfe80:0000:0000:0000:0000:5efe: for private addresses with the 32bits of the host's IPv4address.”。貌似有全域性唯一和私有之分,不過在IETF的相關草案上找到的更多是0200:5efe的描述,在我所作的測試環境中,windows主機上系統使用的是0200:5ede,而CISCO路由器上用的是0000:5efe。

ISATAP主機和ISATAP路由器產生的這個64btis的介面標識,可進一步用於構造隧道介面的Linklocal地址,以及IPv6全域性單播地址。這個下面會描述到。

另外,因為ISATAP的操作範圍在站點內,所以ISATAP主機和ISATAP路由器的IPv4地址可以是私有IP,也可以是公有IP。

工作機制


首先,我們有一個IPv4的網路,IPv4網路中絕大部分網路裝置都不支援IPv6,除了終端主機,以及一臺路由器,這臺能夠訪問我們需要的IPv6資源。現在,一種最廉價的方式是,在這臺路由器上部署ISATAP,終端ISATAP主機與路由器之間建立一個ISATAPtunnel,這樣一來PC可以直接將IPv6流量放進tunnel傳到ISATAP路由器從而穿越整個IPv4網路。

1)現在我們在ISATAP路由器上進行相應的配置,給路由器分配的IPv4地址是2.2.2.2/24,同時建立一個tunnel介面用於ISATAP,此時tunnel介面會根據IPv4地址產生一個64bits的介面標識。這個介面標識搭配上高位的fe80::就形成了tunnel介面的Linklocal地址:fe80::0000:5efe:202:202。另外,還需給ISATAPtunnel介面配置一個全域性單播IPv6地址,這裡可以手工配置,也可以通過字首+EUI64的方式來構建,這裡的EUI-64就是上面所述的特殊的64bits介面標識。如上圖,構建出來的IPv6地址就是2001:1111::0000:5efe:0202.0202/64,因此IPv4的字首為2001:1111::/64,這個字首稍後會通過tunnel下發給ISATAP主機,從而使它能夠構建自己的IPv6地址。

2)現在我們在ISATAP主機上,配置ISATAP,一般來說,在WIN7系統上預設安裝了IPv6協議棧,預設就會有一個ISATAP的虛擬網路卡。在我們給PC的物理網路卡配置IPv4地址如1.1.1.1/24後,ISATAP虛擬網路卡就會自動根據這個IPv4地址計算出上面所講的特殊的介面標識:0200:5efe:1.1.1.1,注意這種格式等同與0200:5efe:0101.0101,在windows系統上我們可以看到前者的簡便寫法。

3)當我們在主機上配置了ISATAP路由器之後(指向的是ISATAP路由器的IPv4地址),ISATAP主機開始向ISATAP路由器傳送RS訊息,如下圖:


這個RS訊息是通過IPv4隧道傳輸的,外層是IPv4的頭,源地址是ISATAP的IPv4地址1.1.1.1,目的地址是2.2.2.2,也就是ISATAP的IPv4地址。IPv4頭裡面裹著IPv6的報文,源地址是ISATAP主機的ISATAP虛擬網路卡的Linklocal地址,目的地址是ISATAP路由器的Linklocal地址。

4)ISATAP主機發出的這個RS訊息,會在IPv4網路中被路由,最終轉發到ISATAP路由器。這將使得路由器立即以一個RA進行回應:


而這個回應的RA訊息裡,就包含ISATAP上所配置的那個IPv6全域性單播地址的/64字首。

5)ISATAP主機收到這個RA回應後,會拿出裡頭的IPv6字首,隨後在後面加上自己ISATAP虛擬網路卡的64bits的介面標識地址,構成128bits的IPv6全域性單播地址,同時會產生一條預設路由,指向ISATAP路由器的Linklocal地址:

6)從現在起,ISATAP主機需要訪問IPv6資源的時候,將IPv6資料包封裝在IPv4的隧道里,也就是說,套上ISATAP


隧道的IPv4頭,然後傳給ISATAP路由器,再由ISATAP路由器解封裝,再幫忙轉發IPv6資料。


四、典型實驗


環境描述

PC是ISATAP主機,它是一臺雙棧PC,這裡我們使用的是一臺win7系統的電腦做測試。電腦網路卡的IP地址為1.1.1.1/24,閘道器為1.1.1.254,閘道器是SW1的interfacevlan10。

SW1建立兩個VLAN:VLAN10及20,分別對應PC及ISATAP路由器。VLAN20的SVI口IP為2.2.2.254,是ISATAP路由器的預設閘道器。

ISATAPRouter的介面IP為2.2.2.2。該IPv4地址在後續的ISATAP配置中使用到,ISATAP主機就是通過這個IP找到ISATAPRouter並與之建立ISATAP tunnel。ISATAPRouter同時連線到了一個IPv6網路,這裡我們用loopback模擬:2001:8888::8/64,用於後續的測試。

最終的實驗結果是首先PC要能夠ping通ISATAP Router的IPv4地址也就是2.2.2.2。然後PC與ISATAProuter建立隧道並拿到IPv6地址,而且要能夠ping通20001:8888::8

裝置配置

PC1的配置:
網路卡配置IP地址1.1.1.1/24,閘道器為1.1.1.254
安裝IPv6協議棧,此時Win7會自動產生一個ISATAP隧道虛擬介面:
隧道介面卡isatap.{0DB7233C-89B7-49DB-A8C0-D1AA005F4E6A}:

SW1的配置:
vlan 10
vlan 20
interface fast0/1
switchport access vlan 10
interface fast0/15
switchport access vlan 20
interface vlan 10
ip address 1.1.1.254 255.255.255.0
interface vlan 20
ip address 2.2.2.254 255.255.255.0

Router的配置:

ipv6 unicast-routing
!
interface FastEthernet0/0
 ip address 2.2.2.2 255.255.255.0
 no shutdown
!
interface Tunnel1
 ip unnumbered fastEthernet 0/0  !! 這個IPv4地址就是ISATAP隧道的目的地址
 ipv6 enable
 ipv6 address 2001:1111::/64 eui-64 !!這個IPv6地址的字首會被通告給ISATAP主機
 no ipv6 nd suppress-ra
 tunnel source fastEthernet 0/0
 tunnel mode ipv6ip isatap
!
interface loopback0
 ipv6 enable
 ipv6 address 2001:8888::8/64
!
ip route 0.0.0.0 0.0.0.0 2.2.2.254

注意ISATAP路由器的配置,關鍵部分在於tunnel的配置,tunnel模式是ipv6ipisatap的,同時注意在tunnel這裡配置的IPV4地址,就是對應的ISATAP主機上配置的那條CMD命令裡ISATAP路由器的地址。我們這個實驗演示的是tunnel直接用fa0/0的地址,當然,tunnel也可以有自己的IPv4地址,只要保證ISATAP主機到這個IPv4地址路由可達就行。另外tunnel的IPv6地址,對應的字首就是稍後要下發給ISATAP主機的字首,這個實驗中,我們tunnel的IPv6全域性單播地址使用的是字首+eui-64的配置方式,這裡的eui-64實際上指的就是前面我們介紹的那個特殊的64bits介面標識。

實驗測試

我們首先在路由器上檢視一下:

R2#show ipv6 interface brief 
FastEthernet0/0  
Tunnel0  
FE80::5EFE:202:202
2001:1111::5EFE:202:202

注意,這裡的Linklocal地址:FE80::5EFE:202:202就是一個ISATAP格式的地址,最後的64bits是由32bits的0000:5EFE加上32bits的介面IPv4地址(這裡是2.2.2.2)構成的,如下圖。而IPv6全域性單播地址,也是使用64bits的介面標識構成的,當然,你也可以手工配置IPv6全域性單播地址,不一定要使用介面標識。


接下去,我們在ISATAP主機上,CMD模式下輸入:
netsh interface ipv6 isatap set router 2.2.2.2

PC就會開始傳送RS,報文如下:


我們看到這個RS的ICMPv6報文外是IPv6的頭,IPv6的頭外是IPv4的頭。
注意外層IPv4的頭,源是1.1.1.1,目的是2.2.2.2
然後內層IPv6的頭,源是ISATAP主機的Linklocal地址,目的是ISATAP路由器的Linklocal地址

在路由器收到RS後回回應一個RA:


路由器回應的這個RA裡,就有一個ICMPv6的Option,其中就包含著ISATAP路由器的IPv6字首。而ISATAP主機就可以根據這個字首,結合自己的介面標識構建IPv6地址。

最終PC獲取到的IPv4地址如下:

隧道介面卡 isatap.{0DB7233C-89B7-49DB-A8C0-D1AA005F4E6A}:
 連線特定的 DNS 字尾 . . . . . .. :
 IPv6 地址 . . . . . . . . .. . . : 2001:1111::200:5efe:1.1.1.1
 本地連結 IPv6 地址. . . . . . .. : fe80::200:5efe:1.1.1.1@
 預設閘道器. . . . . . . . . . .. . : fe80::5efe:2.2.2.2@

我們看到PC首先根據自己本地配置的IPv4地址:1.1.1.1,生成64bits的介面ID:


這個64bits的介面ID,與從ISATAP路由器獲取到的IPv6全域性單播地址字首2001:1111::的前64bits,構成了PC的IPv6全域性單播地址:2001:1111::200:5efe:1.1.1.1。
 這個64bits的介面ID,與FE80::/10構成了PC的Linklocal地址:fe80::200:5efe:1.1.1.1
同時,PC將ISATAP路由器的Linklocal地址fe80::5efe:2.2.2.2設定為預設閘道器
 當主機與其它IPv6主機進行通訊時,從隧道介面轉發,將從報文的下一跳IPv6地址中取出IPv4地址作為IPv4封裝的目的地址。如果目的主機在本站點內,則下一跳就是目的主機本身,如果目的主機不在本站點內,則下一跳為ISATAP路由器的地址。

我們最後再做一個測試,就是ISATAP主機去ping 2008:8888::1。


這個到達ISATAP的loopback的IPv6資料包,被套上一個ISATAP的IPv4隧道頭,然後傳給ISATAP路由器,由路由器進行下一步的IPv6轉發。


相關文章