2017 年 11 月 26 日,中共中央辦公廳、國務院辦公廳印發(fā)了《推進互聯(lián)網(wǎng)協(xié)議第六版(IPv6)規(guī)模部署行動計劃》
據(jù) APNIC Labs 提供的全球 IPv6 用戶數(shù)(估計)及 IPv6 用戶普及率的數(shù)據(jù),截至 2017 年 11 月,全球 IPv6 用戶數(shù)排名前十位的國家/地區(qū),依次是印度、美國、德國、日本、巴西、英國、法國、加拿大、比利時、越南等,中國 IPv6 用戶數(shù)排在第 13 位,如表 1 所示。而全球 IPv6 用戶普及率排在前十位的國家/地區(qū),依次是比利時、印度、德國、美國、希臘、瑞士、盧森堡、英國、葡萄牙、日本等,中國 IPv6 用戶普及率僅有 0.38%,排在第 67 位。
表1 全球IPv6用戶數(shù)(估值)排名
Ipv6域名情況
Ipv6域名狀態(tài)
|
政府部門
|
其他行業(yè)
|
可使用
|
41%
|
2%
|
過渡中
|
43%
|
54%
|
不可使用
|
16%
|
44%
|
《行動計劃》指出,將用5到10年時間,形成下一代互聯(lián)網(wǎng)自主技術(shù)體系和產(chǎn)業(yè)生態(tài),建成全球最大規(guī)模的 IPv6 商業(yè)應用網(wǎng)絡,實現(xiàn)下一代互聯(lián)網(wǎng)在經(jīng)濟社會各領域深度融合應用,成為全球下一代互聯(lián)網(wǎng)發(fā)展的重要主導力量。
1.到 2018 年末,市場驅(qū)動的良性發(fā)展環(huán)境基本形成,IPv6 活躍用戶數(shù)達到 2 億,在互聯(lián)網(wǎng)用戶中的占比不低于 20%,并在以下領域全面支持 IPv6:國內(nèi)用戶量排名前 50 位的商業(yè)網(wǎng)站及應用,省部級以上政府和中央企業(yè)外網(wǎng)網(wǎng)站系統(tǒng),中央和省級新聞及廣播電視媒體網(wǎng)站系統(tǒng),工業(yè)互聯(lián)網(wǎng)等新興領域的網(wǎng)絡與應用;域名托管服務企業(yè)、頂級域運營機構(gòu)、域名注冊服務機構(gòu)的域名服務器,超大型互聯(lián)網(wǎng)數(shù)據(jù)中心(IDC),排名前5位的內(nèi)容分發(fā)網(wǎng)絡(CDN),排名前10位云服務平臺的50%云產(chǎn)品;互聯(lián)網(wǎng)骨干網(wǎng)、骨干網(wǎng)網(wǎng)間互聯(lián)體系、城域網(wǎng)和接入網(wǎng),廣電骨干網(wǎng),LTE網(wǎng)絡及業(yè)務,新增網(wǎng)絡設備、固定網(wǎng)絡終端、移動終端。
2.到 2020 年末,市場驅(qū)動的良性發(fā)展環(huán)境日臻完善,IPv6 活躍用戶數(shù)超過 5 億,在互聯(lián)網(wǎng)用戶中的占比超過 50%,新增網(wǎng)絡地址不再使用私有 IPv4 地址,并在以下領域全面支持 IPv6:國內(nèi)用戶量排名前 100 位的商業(yè)網(wǎng)站及應用,市地級以上政府外網(wǎng)網(wǎng)站系統(tǒng),市地級以上新聞及廣播電視媒體網(wǎng)站系統(tǒng);大型互聯(lián)網(wǎng)數(shù)據(jù)中心,排名前 10 位的內(nèi)容分發(fā)網(wǎng)絡,排名前 10 位云服務平臺的全部云產(chǎn)品;廣電網(wǎng)絡,5G 網(wǎng)絡及業(yè)務,各類新增移動和固定終端,國際出入口。
3.到 2025 年末,我國 IPv6 網(wǎng)絡規(guī)模、用戶規(guī)模、流量規(guī)模位居世界第一位,網(wǎng)絡、應用、終端全面支持 IPv6,全面完成向下一代互聯(lián)網(wǎng)的平滑演進升級,形成全球領先的下一代互聯(lián)網(wǎng)技術(shù)產(chǎn)業(yè)體系。
按通知要求,2018 年是涉及工信部相關 IPV6 任務的重要時間節(jié)點。我司生產(chǎn)的安全防護產(chǎn)品也要全面支持 IPV6。因此,在這里歸納 IPV6 開發(fā)中遇到的問題及解決方案。
IPv4 地址是類似 A.B.C.D 的格式,它是32位,用 . 分成四段,用10進制表示;而IPv6地址類似 X:X:X:X:X:X:X:X 的格式,它是128位的,用 : 分成 8 段,用 16 進制表示;可見,IPv6 地址空間相對于 IPv4 地址有了極大的擴充。
RFC2373 中詳細定義了 IPv6 地址,按照定義,一個完整的IPv6地址的表示法:xxxx:xxxx:xxxx:xxxx:xxxx:xxxx:xxxx:xxxx
例如: 2001:0000: 1F 1F :0000:0000:0100: 11A 0:ADDF
為了簡化其表示法, rfc2373 提出每段中前面的 0 可以省略,連續(xù)的 0 可省略為 ::,但只能出現(xiàn)一次。例如:
1080:0:0:0:8:800: 200C : 417A 可簡寫為 1080::8:800: 200C : 417A
FF01:0:0:0:0:0:0:101 可簡寫為 FF01::101
0:0:0:0:0:0:0:1 可簡寫為 ::1
0:0:0:0:0:0:0:0 可簡寫為 ::
類似于 IPv4中的CDIR表示法,IPv6用前綴來表示網(wǎng)絡地址空間,比如:
2001:251:e000::/48 表示前綴為48位的地址空間,其后的80位可分配給網(wǎng)絡中的主機,共有2的80次方個地址。
為了使您更好的理解 IPv6,在這里給出一個表格,以比較IPv4和IPv6地址對應關系和區(qū)別。
IPv4地址 | IPv6地址 |
組播地址( 224.0.0.0/4) | IPv6組播地址(FF00::/8) |
廣播地址 | 無,只有任播( anycast)地址 |
未指定地址為 0.0.0 .0 | 未指定地址為 :: |
回路地址為 127.0.0.1 | 回路地址為 ::1 |
公用 IP地址 | 可匯聚全球單播地址 |
私有地址( 10.0.0 .0/8、172.16.0.0/12和192.168.0.0/16) | 本地站點地址( FEC0::/48) |
Microsoft自動專用IP尋址自動配置的地址(169.254.0.0/16) | 本地鏈路地址( FE80::/64) |
表達方式:點分十進制 | 表達方式:冒號十六進制式(取消前置零、零壓縮) |
子網(wǎng)掩碼表示:以點陣十進制表示法或前綴長度表示法( CIDR) | 子網(wǎng)掩碼表示:僅使用前綴長度表示法( CIDR) |
? IPv6 地址指定給接口,一個接口可以指定多個地址。
? IPv6 地址有作用域:
link local地址 本鏈路有效
site local地址 本區(qū)域(站點)內(nèi)有效,一個site通常是個校園網(wǎng)
global地址 全球有效,即可匯聚全球單播地址
? IPv6 地址分類:
unicast 單播(單點傳送)地址
multicast 組播(多點傳送)地址
anycast 任播(任意點傳送)地址
IPv6 沒有定義廣播地址,其功能由組播地址替代
? ::/128 即 0:0:0:0:0:0:0:0,只能作為尚未獲得正式地址的主機的源地址,不能作為目的地址,不能分配給真實的網(wǎng)絡接口。
? ::1/128 即 0:0:0:0:0:0:0:1,回環(huán)地址,相當于IPv4中的localhost(127.0.0.1),ping locahost 可得到此地址。
? 2001::/16 全球可聚合地址,由 IANA 按地域和ISP進行分配,是最常用的IPv6地址,屬于單播地址。
? 2002::/16 6 to 4 地址,用于 6to4 自動構(gòu)造隧道技術(shù)的地址,屬于單播地址。
? 3ffe::/16 早期開始的 IPv6 6bone 試驗網(wǎng) 地址,屬于單播地址。
? fe80::/10 本地鏈路地址,用于單一鏈路,適用于自動配置、鄰機發(fā)現(xiàn)等,路由器不轉(zhuǎn)發(fā)以fe80開頭的地址。
? ff00::/8 組播地址。
? ::A.B.C.D 兼容 IPv4 的 IPv6 地址,其中 <A.B.C.D> 代表 IPv4 地址。自動將 IPv6 包以隧道方式在 IPv4 網(wǎng)絡中傳送的 IPv4/IPv6 節(jié)點將使用這些地址。
? ::FFFF:A.B.C.D 是 IPv4 映射過來的 IPv6 地址,其中 <A.B.C.D> 代表 IPv4 地址,例如 ::ffff:202.120.2.30 ,它是在不支持IPv6的網(wǎng)上用于表示 IPv4 節(jié)點。
在目前 IPv6 和 IPv4 共存的情況下,實現(xiàn) V4 和 V6 互聯(lián)互通的綜合組網(wǎng)技術(shù)和策略有:雙棧策略和隧道策略
雙棧策略是指在網(wǎng)元中同時具有 IPv4和IPv6兩個協(xié)議棧,它既可以接收、處理、收發(fā)IPv4的分組,也可以接收、處理、收發(fā)IPv6的分組。對于主機(終端)來講,“雙?!笔侵钙淇梢愿鶕?jù)需要來對業(yè)務產(chǎn)生的數(shù)據(jù)進行IPv4封裝或者IPv6封裝。對于路由器來講,“雙?!笔侵冈谝粋€路由器設備中維護IPv6和IPv4兩套路由協(xié)議棧,使得路由器既能與IPv4主機也能與IPv6主機通信,分別支持獨立的IPv6和IPv4路由協(xié)議,IPv4和IPv6路由信息按照各自的路由協(xié)議進行計算,維護不同的路由表。IPv6數(shù)據(jù)報按照IPv6路由協(xié)議得到的路由表轉(zhuǎn)發(fā),IPv4數(shù)據(jù)報按照IPv4路由協(xié)議得到的路由表轉(zhuǎn)發(fā)。
隧道策略是 IPv4/v6 綜合組網(wǎng)技術(shù)中經(jīng)常使用到的一種機制。所謂“隧道”,簡單地講就是利用一種協(xié)議來傳輸另一種協(xié)議的數(shù)據(jù)技術(shù)。隧道包括隧道入口和隧道出口(隧道終點),這些隧道端點通常都是雙棧節(jié)點。在隧道入口以一種協(xié)議的形式來對另外一種協(xié)議數(shù)據(jù)進行封裝,并發(fā)送。在隧道出口對接收到的協(xié)議數(shù)據(jù)解封裝,并做相應的處理。在隧道的入口通常要維護一些與隧道相關的信息,如記錄隧道 MTU 等參數(shù)。在隧道的出口通常出于安全性的考慮要對封裝的數(shù)據(jù)進行過濾,以防止來自外部的惡意攻擊。
隧道的配置方法分為手工配置隧道和自動配置隧道,而自動配置隧道又可以分為兼容地址自動隧道、 6to4 隧道、6over4、ISATAP、MPLS 隧道、GRE 隧道等,這些隧道的實現(xiàn)原理和技術(shù)細節(jié)都不相同,相應的,其應用場景也就不同。
PMTU(Path MTU,路徑最大傳輸單元)是在源節(jié)點和目的節(jié)點之間的路徑上的任一鏈路所能支持的鏈路 MTU 的最小值。
在IPv6網(wǎng)絡中,分段不在中間路由器上進行。當需要傳送的數(shù)據(jù)報文長度比鏈路 MTU 大時,只由源節(jié)點本身對數(shù)據(jù)報文進行分段,中間路由器不對數(shù)據(jù)報文進行再次分段。這就要求源節(jié)點在發(fā)送數(shù)據(jù)報文前能夠發(fā)現(xiàn)整個發(fā)送路徑上的所有鏈路的最小 MTU,然后以該 MTU 值發(fā)送數(shù)據(jù)報文,這就是 PMTU 發(fā)現(xiàn)。
PMTU發(fā)現(xiàn)過程如上圖所示,圖中各步驟含義如下:
(1)源節(jié)點向目的節(jié)點發(fā)送一個 IPv6 數(shù)據(jù)報文,其長度為 1500 字節(jié)。
(2)中間路由器 RTA 的鏈路 MTU 值為 1400字節(jié),所以它會用 ICMPv6 數(shù)據(jù)報文超長消息向源節(jié)點應答,告訴源節(jié)點"路徑上的 MTU 值為 1400 字節(jié)"。
(3)源節(jié)點向目的節(jié)點發(fā)送一個 IPv6 數(shù)據(jù)報文,其長度為 1400 字節(jié)。
(4)中間路由器 RTB 的鏈路 MTU 值為 1300 字節(jié),所以它會用 ICMPv6 數(shù)據(jù)報文超長消息向源節(jié)點應答,告訴源節(jié)點"路徑上的 MTU 值為 1300 字節(jié)"。
(5)源節(jié)點向目的節(jié)點發(fā)送一個I Pv6 數(shù)據(jù)報文,其長度為 1300 字節(jié)。
Debian 配置 IPV6
vi /etc/network/interfaces
# /etc/network/interfaces -- configuration file for ifup(8),ifdown(8)
# The loopback interface
# automatically added when upgrading
auto lo
iface lo inet loopback
auto eth0
iface eth0 inet6 static
address 2001:da8:2:10d::2
netmask 64
up route -A inet6 add default gw 2001:da8:2:10d::1 dev $IFACE
iface eth0 inet static
address 58.1.4.74
netmask 255.255.255.0
up route add default gw 58.1.4.1 dev $IFACE
1. 編譯
nginx 編譯時需添加 --with-ipv6
2. 配置 - listen
listen [::]:80;
listen [::]:80 ipv6only=on;
以上兩種配置方式,均表示只監(jiān)聽 IPV6 地址的 80 端口,因為 ipv6only 默認值為 on
listen [::]:80 ipv6only=off;
listen 80;
listen [::]:80 ipv6only=on;
同時監(jiān)聽 IPV4 和 IPV6 地址。建議使用后者,若使用前者,nginx 獲取的 remote_addr 值均為 ipv6(如客戶端地址10.1.1.1,變量值為::ffff:10.1.1.1)。
listen [fe80::20c:29ff:fe39:fded]:80;
監(jiān)聽指定 IPV6 地址
3. 配置 - upstream
upstream lbserver {
server [2001:da8:2:10d::2]:8088;
}
不支持代理 fe80 開頭的本地鏈路地址。
4. 配置 - proxy_pass
proxy_pass http://[2001:da8:2:10d::2]:8088;
同 upstream,不支持代理 fe80 開頭的本地鏈路地址。
版本1,若 ping 及 ping6 用法如下:
ping
Usage: ping [-aAbBdDfhLnOqrRUvV] [-c count] [-i interval] [-I interface]
[-m mark] [-M pmtudisc_option] [-l preload] [-p pattern] [-Q tos]
[-s packetsize] [-S sndbuf] [-t ttl] [-T timestamp_option]
[-w deadline] [-W timeout] [hop1 ...] destination
ping6
Usage: ping6 [-aAbBdDfhLnOqrRUvV] [-c count] [-i interval] [-I interface]
[-l preload] [-m mark] [-M pmtudisc_option]
[-N nodeinfo_option] [-p pattern] [-Q tclass] [-s packetsize]
[-S sndbuf] [-t ttl] [-T timestamp_option] [-w deadline]
[-W timeout] destination
則,ping IPV6 用法如下:
ping6 -I eth0 fe80::20c:29ff:fe39:fded
PING fe80::20c:29ff:fe39:fded(fe80::20c:29ff:fe39:fded) from fe80::20c:29ff:fe39:fded eth0: 56 data bytes
64 bytes from fe80::20c:29ff:fe39:fded: icmp_seq=1 ttl=64 time=0.036 ms
64 bytes from fe80::20c:29ff:fe39:fded: icmp_seq=2 ttl=64 time=0.044 ms
版本1,不支持帶有 [ ] 的 IPV6 地址,且只有 ping6 生效。
版本2,若 ping 及 ping6 用法如下:
ping
BusyBox v1.22.0.git (2013-12-31 13:39:13 CST) multi-call binary.
Usage: ping [OPTIONS] HOST
Send ICMP ECHO_REQUEST packets to network hosts
-4,-6 Force IP or IPv6 name resolution
-c CNT Send only CNT pings
-s SIZE Send SIZE data bytes in packets (default:56)
-t TTL Set TTL
-I IFACE/IP Use interface or IP address as source
-W SEC Seconds to wait for the first response (default:10)
(after all -c CNT packets are sent)
-w SEC Seconds until ping exits (default:infinite)
(can exit earlier with -c CNT)
-q Quiet, only displays output at start
and when finished
ping6
BusyBox v1.22.0.git (2013-12-31 13:39:13 CST) multi-call binary.
Usage: ping6 [OPTIONS] HOST
Send ICMP ECHO_REQUEST packets to network hosts
-c CNT Send only CNT pings
-s SIZE Send SIZE data bytes in packets (default:56)
-I IFACE/IP Use interface or IP address as source
-q Quiet, only displays output at start
and when finished
則,ping IPV6 用法如下:
ping -I eth2 fe80::20c:29ff:fe39:fded
PING fe80::20c:29ff:fe39:fded (fe80::20c:29ff:fe39:fded): 56 data bytes
64 bytes from fe80::20c:29ff:fe39:fded: seq=0 ttl=64 time=4.279 ms
64 bytes from fe80::20c:29ff:fe39:fded: seq=1 ttl=64 time=0.501 ms
ping -I eth2 [fe80::20c:29ff:fe39:fded]
PING [fe80::20c:29ff:fe39:fded] (fe80::20c:29ff:fe39:fded): 56 data bytes
64 bytes from fe80::20c:29ff:fe39:fded: seq=0 ttl=64 time=0.657 ms
64 bytes from fe80::20c:29ff:fe39:fded: seq=1 ttl=64 time=0.543 ms
ping -6 -I eth2 fe80::20c:29ff:fe39:fded
PING fe80::20c:29ff:fe39:fded (fe80::20c:29ff:fe39:fded): 56 data bytes
64 bytes from fe80::20c:29ff:fe39:fded: seq=0 ttl=64 time=0.679 ms
64 bytes from fe80::20c:29ff:fe39:fded: seq=1 ttl=64 time=0.557 ms
ping -6 -I eth2 [fe80::20c:29ff:fe39:fded]
PING [fe80::20c:29ff:fe39:fded] (fe80::20c:29ff:fe39:fded): 56 data bytes
64 bytes from fe80::20c:29ff:fe39:fded: seq=0 ttl=64 time=0.658 ms
64 bytes from fe80::20c:29ff:fe39:fded: seq=1 ttl=64 time=0.619 ms
ping6 -I eth2 fe80::20c:29ff:fe39:fded
PING fe80::20c:29ff:fe39:fded (fe80::20c:29ff:fe39:fded): 56 data bytes
64 bytes from fe80::20c:29ff:fe39:fded: seq=0 ttl=64 time=0.698 ms
64 bytes from fe80::20c:29ff:fe39:fded: seq=1 ttl=64 time=0.547 ms
ping6 -I eth2 [fe80::20c:29ff:fe39:fded]
PING [fe80::20c:29ff:fe39:fded] (fe80::20c:29ff:fe39:fded): 56 data bytes
64 bytes from fe80::20c:29ff:fe39:fded: seq=0 ttl=64 time=0.561 ms
64 bytes from fe80::20c:29ff:fe39:fded: seq=1 ttl=64 time=0.693 ms
版本2,帶不帶 -6 和 [] 均是兼容的,但必須指定一個用來發(fā)送數(shù)據(jù)包的網(wǎng)絡接口。
版本1 和 版本2 通用格式如下:ping6 -I eth0 fe80::20c:29ff:fe39:fded
PS:如果 ping6 的目標不是以 fe80 開頭的本地鏈路地址,則不需要使用 -I 參數(shù)
route -A inet6 add default gw 2001:da8:da8:da8:16fe:b5ff:fed9:b534
route -A inet6 del default gw 2001:da8:da8:da8:16fe:b5ff:fed9:b534
tcpdump -nn host 2001:da8:da8:da8:16fe:b5ff:fed9:b534
tcpdump -nn ip6
tcpdump -nn icmp6
ssh -P22 2001:da8:da8:da8:16fe:b5ff:fed9:b534,-6 只是強制使用 v6 地址,沒有 -6 的時候如果對端是 v6 地址,則也可以正常使用。
scp -P22 [2001:da8:da8:da8:16fe:b5ff:fed9:b534]:/tmp/a /tmp/,注意需要使用中括號,因為 v6 地址中的 : 會和 ip 后面的 : 混淆掉。
curl http://2001:da8:da8:da8:16fe:b5ff:fed9:b534/
fping6 2001:da8:da8:da8:16fe:b5ff:fed9:b534
telnet fe80::216:3eff:fe56:aff8 22
wget http://lvs.lxdns.net/testcdn.htm -e http-proxy=http://[2001:da8:da8:da8:16fe:b5ff:fed9:b534]
更多建議: