目錄

前言
IPv6 表示方式
  16 進制
  省略 0
  雙冒號代替連續的 0
Prefix 與 Interface ID
EUI-64
Link-Local Address
Unique Local Address
Global Aggregatable Address
Stateless Address Autoconfiguration (SLAAC)
IPv6 Tunneling
  ISATAP
  6to4 Tunnel

前言

IPv6 (Internet Protocol Version 6) 的出現主要是因為 IPv4 Address 供不應求。由於 IPv4 Address 長度為 32 Bits,最多只能提供 2^32 即大約 42 億個 IP Address, 而地球人口達到 75 億,雖然當中只有不足 50%人口能使用到網絡,但試想想我們每人都手持超過一台可上網裝置,IP Address 供應已經十分緊張,現時只能用 NAT 暫緩 IP 供應不足的問題。IPv6 把 IP Address 長度大幅提升至 128 Bits,所能提供的 IP Address 達到天文數字。究竟有多少呢?給大家一個概念,如果每秒鐘要新增 1 兆個 IPv6 Address,IPv6 Address 數量足夠使用 1 兆年以上。本篇假設讀者已充份了解 IPv4 的理論。

IPv6 表示方式

16 進制

由於 128 Bits 的 IPv6 Address 實在太長,因此會把 IPv6 Address 每 4 Bits 組合起來轉換成 16 進制,每 4 個 16 進數再以冒號分隔成 8 節。例如:2001:0000:0001:00a0:0000:0000:0000:0ec3。

省略 0

每節起始的零可以省略,直至該節的起始不是 0 或該節只剩餘 1 個 0。

?第1節第2節第3節第4節第5節第6節第7節第8節
省略前 2001 0000 0001 00a2 0000 0000 0000 0ec3
省略後 2001 0 1 a2 0 0 0 ec3

省略前:2001:0000:0001:00a2:0000:0000:0000:0ec3
省略後:2001:0:1:a2:0:0:0:ec3

雙冒號代替連續的 0

最後可以用雙冒號取代一組連續出現的 0,由於只限取代一組,選最長的一段性價比較高,當然你也可以選較短的一段。

例如:2001:0:1:a2:0:0:0:ec3

可寫成:2001:0:1:a2::ec3

Prefix 與 Interface ID

Router 用 Prefix 來判斷 IPv6 Address 是否位於同一網絡,演算法與 IPv4 Subnet Mask 相若,不在此詳述,有興趣可參考 IPv4 文章。比較普遍的做法是把 128 Bits 長度的 IPv6 Address 分成 64 Bits 的 Prefix 和 64 Bits 的 Interface ID,Prefix 長度的表示方法是在 IPv6 Address 後加上 /xx,例如:FE80::1/64 和 2001:db8::10/64 等。如果我們把所有 IPv6 Address 都用於 64 Bits Prefix 的網絡,我們便可使用 2^64 個網絡,每個網絡可以容納 2^64 個 Host, 兩者都是天文數字,因此 IPv6 很少會再把 Network 分成 Subnet。

EUI-64

IPv6 Address 太長,要網管人員逐個 Interface 設定 IPv6 Address 肯定是件痛苦的事。EUI-64 讓我們只需幫 Interface 設定 Prefix 部份,然後 Interface 就會用 MAC Address 自動產生 Interface ID,基於 MAC Address 獨一無二,利用 EUI-64 必能生成獨一無二的 IPv6 Address。EUI-64 產生 Interface ID 的辦法是先把 MAC Address (共 48 Bits) 斬開兩等份,中間插入 FFFE (共 16 Bits),使其成為 64 Bits,然後把第 7 Bit 由 0 改成 1。最後在前面加上 Prefix 就成為一組IPv6 Address 了。

舉例,MAC Address:00:50:56:C1:A0:E8
中間插入 FFFE 使其成為 EUI-64 Interface ID:0050:56FF:FEC1:A0E8

最後把第 7 Bit 改成 1:0250:56FF:FEC1:A0E8

Link-Local Address

IPv6 Address 有一些預先協定的起始位元,提供相應的用途,有點類似 IPv4 中的 Class 概念。

先要介紹的是首 10 Bits 為 1111111010 稱為 Link-Local Address,只能給本機 Interface 與相鄰設備的 Interface 作溝通之用,任何 Router 都不會為 Link-Local Address 作出路由發布。為了方便,通常會使用 FE80::/10 來表示。

設定 Link-Local Address 方法如下。

R1(config-if)#ipv6 address fe80::1234 link-local

也可使用 EUI-64 自動產生,用以下指令便可。

R1(config-if)#ipv6 enable 

特別一提,如要 Ping Link-Local Address 必需指定 Output Interface。

R1#ping FE80::C802:AFF:FE4D:1C
Output Interface: Ethernet1/0
Type escape sequence to abort.
Sending 5, 100-byte ICMP Echos to FE80::C802:AFF:FE4D:1C, timeout is 2 seconds:
Packet sent with a source address of FE80::C801:AFF:FE3E:1C%Ethernet1/0
!!!!!
Success rate is 100 percent (5/5), round-trip min/avg/max = 8/16/24 ms

兩個相連的設備設定好 IPv6 Address 後,會自動成為 IPv6 Neighbor。IPv6 並沒有 ARP 機制,IPv6 Neighbor 提供相鄰設備 MAC Address。

R1#show ipv6 neighbors 
IPv6 Address                              Age Link-layer Addr State Interface
FE80::C802:AFF:FE4D:1C                      1 ca02.0a4d.001c  STALE Et1/0

Unique Local Address

首 10 Bits 是 1111110000 (或寫作 FC00::/10) 稱為 Unique Local Address。Unique Local Address 像是 IPv4 中的 Private Address (10.0.0.0/8、172.16.0.0/12 和 192.168.0.0/16),在 Internet 上不可被路由,然而我們可以在自己的私有網絡中使用並路由這些 IP。Private Address 在 IPv4 中被廣泛使用在 NAT 去彌補 IPv4 的 IP Address 不足問題。而 IPv6 有非常充裕的 IP 空間,因此 Unique Local Address 通常只用在測試環境。

設定 Unique Local Address 方法如下。

R1(config-if)#ipv6 address FC00::4321/64 

也可使用 EUI-64 自動產生。

R1(config-if)#ipv6 address FC00::/64 eui-64 

Global Aggregatable Address

首 3 Bits 是 001 (或寫作 2000::/3) 稱為 Global Aggregatable Address。Global Aggregatable Address 就?網絡上最常用的 IPv6 Address,相對於 IPv4 的 Public Address。設定方法與 Unique Local Address 相同。當中 2002::/16 特別用作 6to4 Tunnel,本文稍後會說明。

R1(config-if)#ipv6 address 2001::ABCD/64 

使用 EUI-64 自動產生。

R1(config-if)#ipv6 address 2001::/64 eui-64 

Stateless Address Autoconfiguration (SLAAC)

在 IPv4 中我們可以透過 DHCP 讓 Interface 自動獲取 IP Address,而在 IPv6 則透過 Auto-configuration 來獲取 IP Address。之前的部份說過 EUI-64 可以幫我們自動產生 Interface ID,所以現在解決的就是如何獲取 Prefix?IPv6 用的是 Stateless Address Autoconfiguration (無狀態位址自動配置),Interface 向 Link-Local 發出 RS (Router Solicitation),IPv6 Router 可以回應 RA (Router Advertisement),提供 Prefix 資訊。現試把 R1 設定為 Router,R2 則嘗試透過 SLAAC 獲取 IP Address。

ipv6

先在 R2 的 Interface 啟用 IPv6,讓它有 Link-Local Address。

R2(config)#int ethernet 1/0
R2(config-if)#ipv6 enable

在 R1 設定 IPv6 Address。

R1(config)#int ethernet 1/0
R1(config-if)#ipv6 address 2001::/64 eui-64
R1(config-if)#exit
R1#show ipv6 interface ethernet 1/0
Ethernet1/0 is up, line protocol is up
  IPv6 is enabled, link-local address is FE80::C801:14FF:FE6F:1C 
  No Virtual link-local address(es):
  Global unicast address(es):
    2001::C801:14FF:FE6F:1C, subnet is 2001::/64 [EUI]

在 R1 啟動 IPv6 Routing,使其成為 IPv6 Router,這樣子當它收到 RS 便會回覆 RA。

R1(config)#ipv6 unicast-routing 

現在 R2 可以透過 Auto-configuration 取得 IPv6 Address 了,Prefix 是透過 R1 傳來的 2001::/64。

R2(config-if)#ipv6 address autoconfig
R2(config-if)#exit
R2#show ipv6 interface ethernet 1/0
Ethernet1/0 is up, line protocol is up
  IPv6 is enabled, link-local address is FE80::C802:14FF:FE7E:1C 
  No Virtual link-local address(es):
  Stateless address autoconfig enabled
  Global unicast address(es):
    2001::C802:14FF:FE7E:1C, subnet is 2001::/64 [EUI/CAL/PRE]

此外,RA 資訊中亦包含 Default Gateway 的設定。

R2#show ipv6 route
IPv6 Routing Table - default - 4 entries
Codes: C - Connected, L - Local, S - Static, U - Per-user Static route
       B - BGP, R - RIP, H - NHRP, I1 - ISIS L1
       I2 - ISIS L2, IA - ISIS interarea, IS - ISIS summary, D - EIGRP
       EX - EIGRP external, ND - ND Default, NDp - ND Prefix, DCE - Destination
       NDr - Redirect, O - OSPF Intra, OI - OSPF Inter, OE1 - OSPF ext 1
       OE2 - OSPF ext 2, ON1 - OSPF NSSA ext 1, ON2 - OSPF NSSA ext 2, l - LISP
ND  ::/0 [2/0]
     via FE80::C801:14FF:FE6F:1C, Ethernet1/0
NDp 2001::/64 [2/0]
     via Ethernet1/0, directly connected
L   2001::C802:1CFF:FEE0:1C/128 [0/0]
     via Ethernet1/0, receive
L   FF00::/8 [0/0]
     via Null0, receive

IPv6 Tunneling

把整個網絡由 IPv4 升級至 IPv6 是一個漫長的過程,必然會出現 IPv4 與 IPv6 共存的情況,Tunneling 可以讓 IPv6 訊息包裹在 IPv4 之中傳送,主要用到 ISATAP 和 6to4 Tunnel 兩種技術。

ISATAP

ISATAP (Intra-Site Automatic Tunnel Addressing Protocol) 分為 Server 和 Client 兩個角色,Client 向 Server 要求 IPv6 Address 並建立 IPv6 Tunnel,這樣 Client (R1) 便可以透過 ISATAP Server (R3) 與 IPv6 網絡溝通。現以下面的網路作為例子嘗試設定 ISATAP。

ipv6

假設 R1 是一台 Host,純綷只有 IPv4 Address,Default Route 指向 R2,與一般 PC 的設定相若。這台 Host 暫時沒辦法和 IPv6 Network 溝通。

hostname R1
!
interface Ethernet1/0
 ip address 192.168.12.1 255.255.255.0
!
ip route 0.0.0.0 0.0.0.0 192.168.12.2
R1#show ip route
Codes: L - local, C - connected, S - static, R - RIP, M - mobile, B - BGP
       D - EIGRP, EX - EIGRP external, O - OSPF, IA - OSPF inter area 
       N1 - OSPF NSSA external type 1, N2 - OSPF NSSA external type 2
       E1 - OSPF external type 1, E2 - OSPF external type 2
       i - IS-IS, su - IS-IS summary, L1 - IS-IS level-1, L2 - IS-IS level-2
       ia - IS-IS inter area, * - candidate default, U - per-user static route
       o - ODR, P - periodic downloaded static route, H - NHRP, l - LISP
       + - replicated route, % - next hop override

Gateway of last resort is 192.168.12.2 to network 0.0.0.0

S*    0.0.0.0/0 [1/0] via 192.168.12.2
      192.168.12.0/24 is variably subnetted, 2 subnets, 2 masks
C        192.168.12.0/24 is directly connected, Ethernet1/0
L        192.168.12.1/32 is directly connected, Ethernet1/0

R2 與 R3 跑 EIGRP,讓 Host A 可以與 ISATAP Server 透過 IPv4 溝通。

hostname R2
!
interface Ethernet1/0
 ip address 192.168.23.2 255.255.255.0
!
interface Ethernet1/1
 ip address 192.168.12.2 255.255.255.0
!
router eigrp 1
 network 192.168.12.0
 network 192.168.23.0

R3 是 ISATAP Server,作為中介的角色,連接 IPv4 與 IPv6 網絡。

hostname R3
!
ipv6 unicast-routing
!         
interface Ethernet1/0
 ipv6 address 2001:DB8:34::3/64
 ipv6 ospf 1 area 0
!
interface Ethernet1/1
 ip address 192.168.23.3 255.255.255.0
!
router eigrp 1
 network 192.168.23.0
!
ipv6 router ospf 1
 router-id 3.3.3.3

R3 與 R4 跑 OSPFv3。

hostname R4
!
ipv6 unicast-routing
!
interface Ethernet1/0
 ipv6 address 2001:DB8:45::4/64
 ipv6 ospf 1 area 0
!
interface Ethernet1/1
 ipv6 address 2001:DB8:34::4/64
 ipv6 ospf 1 area 0
!
ipv6 router ospf 1
 router-id 4.4.4.4

R5 只有 IPv6 Address。

hostname R5
!
interface Ethernet1/1
 ipv6 address 2001:DB8:45::5/64

基於 SLAAC,R5 收到從 R4 發的 RA Default Route。

R5#show ipv6 route
IPv6 Routing Table - default - 4 entries
Codes: C - Connected, L - Local, S - Static, U - Per-user Static route
       B - BGP, R - RIP, H - NHRP, I1 - ISIS L1
       I2 - ISIS L2, IA - ISIS interarea, IS - ISIS summary, D - EIGRP
       EX - EIGRP external, ND - ND Default, NDp - ND Prefix, DCE - Destination
       NDr - Redirect, O - OSPF Intra, OI - OSPF Inter, OE1 - OSPF ext 1
       OE2 - OSPF ext 2, ON1 - OSPF NSSA ext 1, ON2 - OSPF NSSA ext 2, l - LISP
ND  ::/0 [2/0]
     via FE80::C804:16FF:FE0B:1C, Ethernet1/1
C   2001:DB8:45::/64 [0/0]
     via Ethernet1/1, directly connected
L   2001:DB8:45::5/128 [0/0]
     via Ethernet1/1, receive
L   FF00::/8 [0/0]
     via Null0, receive

現在 Host A (R1) 希望 Ping 通 R5,首先在 ISATAP Server (R3) 設定 Tunnel。

R3(config)#int tunnel 0
R3(config-if)#ipv6 address 2001:DB8:3::3/64	// 設 IPv6 Address
R3(config-if)#ipv6 ospf 1 area 0		// 讓此 Interface 的網段在 OSPFv3 發佈
R3(config-if)#tunnel source 192.168.23.3	// 只需設 Tunnel Source,不必設 Tunnel Destination
R3(config-if)#tunnel mode ipv6ip isatap		// 設定 Tunnel Mode 為 ISATAP

在?ISATAP Client (R1) 設定 Tunnel。

R1(config)#int tunnel 0
R1(config-if)#ipv6 address autoconfig		// 自動從 ISATAP Server 取得 IPv6 Address
R1(config-if)#tunnel source 192.168.12.1	// 設定 Tunnel Source
R1(config-if)#tunnel destination 192.168.23.3	// Tunnel Destinatin 為 ISATAP Server IP Address
R1(config-if)#tunnel mode ipv6ip		// 留意 Client 不需要 ISATAP keyword

於是,R1 會從 R3 取得 IPv6 Address,並得到一條 IPv6 Default Route。

R1#show ipv6 route
IPv6 Routing Table - default - 4 entries
Codes: C - Connected, L - Local, S - Static, U - Per-user Static route
       B - BGP, R - RIP, H - NHRP, I1 - ISIS L1
       I2 - ISIS L2, IA - ISIS interarea, IS - ISIS summary, D - EIGRP
       EX - EIGRP external, ND - ND Default, NDp - ND Prefix, DCE - Destination
       NDr - Redirect, O - OSPF Intra, OI - OSPF Inter, OE1 - OSPF ext 1
       OE2 - OSPF ext 2, ON1 - OSPF NSSA ext 1, ON2 - OSPF NSSA ext 2, l - LISP
ND  ::/0 [2/0]
     via FE80::5EFE:C0A8:1703, Tunnel0
NDp 2001:DB8:3::/64 [2/0]
     via Tunnel0, directly connected
L   2001:DB8:3::C0A8:C01/128 [0/0]
     via Tunnel0, receive
L   FF00::/8 [0/0]
     via Null0, receive
R1#ping 2001:DB8:45::5        
Type escape sequence to abort.
Sending 5, 100-byte ICMP Echos to 2001:DB8:45::5, timeout is 2 seconds:
!!!!!
Success rate is 100 percent (5/5), round-trip min/avg/max = 48/55/60 ms

從 Traceroute 可見 Client 直接連到 ISATAP Server,透過 Server 連到 IPv6 Network。

R1#traceroute 2001:db8:45::5
Type escape sequence to abort.
Tracing the route to 2001:DB8:45::5

  1 2001:DB8:3::3 36 msec 28 msec 32 msec
  2 2001:DB8:34::4 40 msec 40 msec 40 msec
  3 2001:DB8:45::5 52 msec 52 msec 48 msec

除 Cisco IOS,現時大部份 OS 包括 Windows、Linux 和 MacOS (要安裝 ISATAP Client) 都支緩 ISATAP。

6to4 Tunnel

ISATAP 比較切合單機連接 IPv6 網絡。但如果希望把兩個 IPv6 Network 透過 IPv4 連接起來 (即 Site to Site 架構),則 6to4 Tunnel 比較適合。圖中 IPv4 Network 以 OSPF 打通, 先在 R2 和 R4 建立 Tunnel。特別要說的是,建立 6to4 Tunnel Interface 的 IPv6 Address 需要和 Source Interface 對應。例如:R2 的 Source Interface 192.168.23.2 轉換成 16 進數,即 C0A8:1702,再加上 IPv6 Tunnel 專用的 Prefix 2002::/16,整個 Tunnel IPv6 Address 將會是 2002:C0A8:1702::/48。

ipv6

R2
interface Tunnel0
 ipv6 address 2002:C0A8:1702::/48
 tunnel source 192.168.23.2
 tunnel mode ipv6ip 6to4
R4
interface Tunnel0
 ipv6 address 2002:C0A8:2204::/48
 tunnel source 192.168.34.4
 tunnel mode ipv6ip 6to4

然後要在建立 Tunnel 的 Route 分別加上兩條 IPv6 Static Route,第一條是把對家 Tunnel Interface IP 指向 Tunnel 0,第二條是把對家 Network 指向對家 Tunnel Interface IP。

R2(config)#ipv6 route 2002:C0A8:2204::/48 Tunnel0
R2(config)#ipv6 route 2001:DB8:45::/64 2002:C0A8:2204::
R4(config)#ipv6 route 2002:C0A8:1702::/48 Tunnel0
R4(cofnig)#ipv6 route 2001:DB8:12::/64 2002:C0A8:1702::
R1#ping 2001:db8:45::5
Type escape sequence to abort.
Sending 5, 100-byte ICMP Echos to 2001:DB8:45::5, timeout is 2 seconds:
!!!!!
Success rate is 100 percent (5/5), round-trip min/avg/max = 48/52/64 ms