目錄
前言
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。
先在 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。
假設 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。
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
相關主題
Jan Ho 2018-01-17
Posted In: 基本網絡知識 Basic Concept
發佈留言