IP Address Version 6 (IPv6) 網際網路協定位址

前言

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

首 7 Bits 是 1111110 (或寫作 FC00::/7) 稱為 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

相關主題

發佈留言

2018-01-17

Posted In: 基本網絡知識 Basic Concept

Leave a Comment