天天看點

IPV6的簡單學習與整理

背景

大概2018年時曾經突擊學習過一段時間IPV6
當時沒太有寫文檔的習慣,導緻這邊沒有成型的記錄了.
今天又有項目要求使用IPV6, 想了想就将之前學習的部分
還有想繼續學習提高的部分進行一下總結. 
因為自己不是科班網工出身,總結的可能有所偏頗.      

第一部分IPV6與IPV4的差別

IPV6和IPV4都屬于TCP/IP協定簇中的成員.
差別在于IPV4成型較早, 并且沒有考慮到萬物互連的場景是以空間有限.
IPV6是為了解決IPV4存在的固有問題. 以及進行優化傳輸層的安全等設定.

IPV4大概有42億個位址空間.
IPV6是2的128次方 是 42億*42億*42億*42億的位址數量. 
IPV6的位址空間大概是 340兆兆兆個.
其實 兆機關的含義是 "萬億"      

第一部分IPV6與IPV4的差別

IPV4 采用 ARP協定發現同一個子網内部的其他機器.
IPV6 采用 ND協定進行同樣處理 neighbour discovery 協定.

IPV4 使用 127.0.0.1 表示自己的位置. 
IPV6 可以使用 ::1來表示自己.
IPV6增加了FE80::XXXX 還有FEC0::XXXX等的位址進行表示自身.
其中後面64衛一般是通過MAC位址進行換算得來. 

在大部分路由器下都可以實作 MAC位址與IPV6位址的解析
能夠實作再目前LAN内 實作IPV6的互通. 

如果彙聚層或者是核心層不支援IPV6的話. 可能跨了彙聚交換機就無法連通位址了.      

IPV6本地位址的換算

IEEE EUI-64 位址代表網絡接口尋址的新标準。
公司 ID 仍然是 24 位長度,但擴充 ID 是 40 位,
進而為網絡擴充卡制造商建立了更大的位址空間。
EUI-64 位址使用 U/L 和 I/G 位的方式與 IEEE 802 位址相同。

要擷取用于 IPv6 單點傳播位址的 64 位接口辨別,
EUI-64 位址中的 U/L 位将進行求反:
如果是 1,則被設定為 0;如果是 0,則被設定為 1      

IPV6本地位址的換算

主機 A 的以太網 MAC 位址是 00-AA-00-3F-2A-1C。
首先,通過在第三個和第四個位元組之間插入 FF-FE 将其轉換為 EUI-64 格式,
其結果是 00-AA-00-FF-FE-3F-2A-1C。

然後,對 U/L 位(第一個位元組中的第七位)求反。
第一個位元組的二進制形式為 00000000。将第七位求反後,
變為 00000010 (0x02)。
最後的結果是 02-AA-00-FF-FE-3F-2A-1C,
當轉換為冒号十六進制符号時,
成為接口辨別 2AA:FF:FE3F:2A1C。
應于 MAC 位址 00-AA-00-3F-2A-1C 的網絡擴充卡的連結本地位址是:
FE80::2AA:FF:FE3F:2A1C。      

一個簡單的判斷自己網絡是否支援IPV6的方法

ping -6 240c::6666
如果通了 說明在自己所在的網絡環境是IPV6聯通的
如果不通 說明網絡環境不支援IPV6
注意: 240c::6666 是中國境内政府機關定義的一個DNS      

第二部分 IPV6位址的劃分

  • 如圖所示,位址分為三大類:多點傳播、單點傳播、任意播
IPV6的簡單學習與整理

單點傳播位址

單點傳播位址:
用來唯一辨別一個接口,類似于IPv4中的單點傳播位址。
發送到單點傳播位址的資料封包将被傳送給此位址所辨別的一個接口。

一、全局單點傳播位址:
等同于IPv4中的公網位址,可以在IPv6 Internet上進行全局路由和通路。
這種位址類型允許路由字首的聚合,進而限制了全球路由表項的數量。

二、本地單點傳播位址:
鍊路本地位址和唯一本地位址都屬于本地單點傳播位址,
在IPv6中,本地單點傳播位址就是指本地網絡使用的單點傳播位址,
也就是IPV4位址中區域網路專用位址。每個接口上至少要有一個鍊路本地單點傳播位址,
另外還可配置設定任何類型(單點傳播、任播群組播)或範圍的IPv6位址。      

多點傳播位址

多點傳播位址:
用來辨別一組接口(通常這組接口屬于不同的節點),
類似于IPv4中的多點傳播位址。
發送到多點傳播位址的資料封包被傳送給此位址所辨別的所有接口

IPv6多點傳播位址可識别多個接口,對應于一組接口的位址(通常分屬不同節點)。
發送到多點傳播位址的資料包被送到由該位址辨別的每個接口。
使用适當的多點傳播路由拓撲,将向多點傳播位址發送的資料包發送給該位址識别的所有接口。
任意位置的IPv6節點可以偵聽任意IPv6多點傳播位址上的多點傳播通信。
IPv6節點可以同時偵聽多個多點傳播位址,也可以随時加入或離開多點傳播組。 
IPv6多點傳播位址的最明顯特征就是最高的8位固定為1111 1111。
IPv6位址很容易區分多點傳播位址,因為它總是以FF開始的 。      

任播位址

任播位址:
用來辨別一組接口(通常這組接口屬于不同的節點)。
發送到任播位址的資料封包被傳送給此位址所辨別的一組接口中
距離源節點最近的一個接口。
(根據使用的路由協定進行度量)

一個IPv6任播位址與多點傳播位址一樣也可以識别多個接口,對應一組接口的位址。
大多數情況下,這些接口屬于不同的節點。
但是,與多點傳播位址不同的是,發送到任播位址的資料包被送到由該位址辨別的其中一個接口。 
通過合适的路由拓撲,目的位址為任播位址的資料包将被發送到單個接口
(該位址識别的最近接口,最近接口定義的根據是因為路由距離最近),
而多點傳播位址用于一對多通信,發送到多個接口。
一個任播位址必須不能用作IPv6資料包的源位址;
也不能配置設定給IPv6主機,僅可以配置設定給IPv6路由器。      

第三部分 IPV6的資料庫連接配接表示

注意IPV6的 IP位址使用 ":" 的方式進行分隔
與IPV4位址的處理時的端口 使用的分隔符是一樣的

一般為了進行區分兩種不通的位址,一般使用"[::1]" 将IPV6位址包裹起來.

是以一般寫url的時候可以使用 http://[::1]:port 的方式來處理. 
需要注意, 如果網絡不支援IPV6
可以自己手工指定IPV6的位址. 可以輸入比較好記憶的位址進行使用.      

Mysql

Class.forName("com.mysql.jdbc.Driver"); 
// ipv4連接配接URL
// String jdbcIpv4Url = "jdbc:mysql://127.0.0.1:3306/databaseName"; 
// ipv6連接配接URL
// String jdbcIpv6Url = "jdbc:mysql://address=(protocol=tcp)(host=2001:470:23:13::6)(port=3306)/database"; 
// ipv6連接配接localhost 的 URL
String jdbcIpv6Url = "jdbc:mysql://address=(protocol=tcp)(host=::!)(port=3306)/database"; 
Properties jdbcProperties = new Properties(); 
jdbcProperties.put("user", "dbuser"); 
jdbcProperties.put("password", "db_password"); 
Connection connection = DriverManager.getConnection(jdbcIpv6Url);      

Oracle

Class.forName("oracle.jdbc.OracleDriver"); 
// ipv4連接配接URL
// String jdbcIpv4Url = "jdbc:oracle:thin:@//127.0.0.1:3306/orcl"; 
// ipv6連接配接URL
String jdbcIpv6Url = "jdbc:oracle:thin:@(DESCRIPTION=(ADDRESS=(PROTOCOL=tcp)
(HOST=[fe80::5cf:72])(PORT=1521))(CONNECT_DATA=(SERVICE_NAME=fnstdb1)))"; 
Properties jdbcProperties = new Properties(); 
jdbcProperties.put("user", "dbuser"); 
jdbcProperties.put("password", "db_password"); 
Connection connection = DriverManager.getConnection(jdbcIpv6Url );      

DB2

Class.forName("com.ibm.db2.jcc.DB2Driver"); 
// ipv4的連接配接方式
// String jdbcIpv4Url = "jdbc:db2://127.0.0.1:50000/sample"; 
// ipv6的連接配接方式
String jdbcIpv6Url = "jdbc:db2://[2001:470:23:13::6]:50000/sample"; 
Properties jdbcProperties = new Properties(); 
jdbcProperties.put("user", "dbuser"); 
jdbcProperties.put("password", "db_password"); 
Connection connection = DriverManager.getConnection(jdbcIpv6Url );      

SQLServer

Class.forName("net.sourceforge.jtds.jdbc.Driver"); 
// ipv4
//String jdbcIpv4Url = "jdbc:jtds:sqlserver://127.0.0.1:1433/master"; 
// ipv6
String jdbcIpv6Url = "jdbc:jtds:sqlserver://"; 
Properties jdbcProperties = new Properties(); 
jdbcProperties.put("user", "dbuser"); 
jdbcProperties.put("password", "db_password"); 
// 如果使用ipv6
if (ipv6) { 
jdbcProperties.put("portNumber", 1433); 
jdbcProperties.put("instanceName ", "master"); 
jdbcProperties.put("serverName","2001:470:23:13::6"); 
} 
Connection connection = DriverManager.getConnection(jdbcUrl);      

第四部分 IPV6的資料包更新

  • IPV6比IPV4的資料標頭有了較大的變化
  • 自己對TCP/IP協定簇的了解不是很熟,寫不下去了...
IPV6的簡單學習與整理

IPV6資料包詳解

  • IPV6有很多優點:減少的路由分類表,隻允許源頭進行分片.

第五部分 IPV6的安全性提升

本來第四部分的封包頭自己認為不熟悉.
發現IPsec自己更加不熟悉.

一般文章都是寫IPV6預設開啟了IPsec. 但是今天仔細查了下資料:
RFC 6434 中已經規定IPV6可以不強制開啟IPsec了. 
是以實質上并不是所有的IPV6一定都是安全的IPsec進行保護的. 

但是晚上學習了很多文章, 發現大部分文章的觀點是因為IPV4中NAT技術的問題.
IPV4的IPsec其實并不是非常完美
但是IPV6還是跟IPsec相容的非常完美的, 可以較好的實作安全協定.      

關于IPsec

網絡安全主要有三種方式進行保證:
1. 實體層 
   也就是我們常說的網絡隔離,SM網,ZY網的處理.或者是政務網. 
2. 應用層
   應用層協定就是咱們經常說的TLS/SSL協定簇.
   最多的應用是 https以及smtps
3. 傳輸層
   IPsec. 其實也是一個協定簇,裡面包好很多網絡協定. 
   比如AH以及ESP還有IKE協定. 
   他可以在傳輸層,給IP資料包進行加密和解密的處理.
優缺點:
實體層最安全,但是最昂貴,最不靈活.
應用層對IaaS要求不高.需要應用層進行适配處理.
傳輸層對應用是黑盒的, 應用不需要關注, 但是作業系統行需要進行适配.      

繼續閱讀