IPv6 Rapid Deployment, IPv6 6rd初探
- 2020 年 11 月 28 日
- 筆記
- IPv6 6rd, IPv6 Rapid Deployment, Linux IPv6 6rd, Linux IPv6 隧道
IPv6 Rapid Deployment: Provide IPv6 Access to Customers over an IPv4-Only Network
一、你將會學到什麼?
IPv6 rapid deployment(6rd)(RFC 5969)是一種無狀態隧道機制,它允許一個服務商在不要求升級已存在的IPv4接入網路基礎設施的情況下,輕巧安全的快速部署IPv6。當然這裡有一系列方法通過IPv4來承載IPv6,6rd的方式尤其成功,其主要在於他的實施是一個輕巧、自然地可擴展、有彈性且易於配置的無感知模式。6rd提供的服務是生產品質,使得所有的客戶和整個Internet看起似乎是原生的本地IPv6網路。
- 本文提出:
- 6rd技術描述
- 6rd部署場景
1.1 6rd作業概述:
圖 1提供一個6rd作業的視圖
6rd由兩個主要的硬體組件組成,CE(Customer Equipment)路由器和BR(Border Relay)路由器。
1.2 CE路由器(客戶邊緣路由器):
CE路由器位置在服務商提供IPv4接入基礎設施的邊緣和為這些終端用戶網路提供IPv6通訊。來自於這些終端用戶的原生IPv6流量通過CE路由器封裝成IPv4,隧道連接到BR路由器和或直接送到相同6rd域的其他CE路由器。反過來,通過BR路由器從Internet網接收到的封裝的6rd流量和來自其他CE路由器的6rd流量將會被解封裝後,並轉發到最終用戶節點。
1.3 BR路由器
BR路由器提供CE路由器和IPv6網路(公有網路或私有網路)兩者之間的通訊。CE和BR路由兩者都是雙棧(IPv4和IPv6)設備,在BR和CE兩者之間可以僅是IPv4。
在CE路由器,如果IPv6報文的目的地址和本地配置的6rd前綴匹配,這個報文會被認為是本地6rd域的一部分,需要被轉發到其他CE路由器。在這種情況下,IPv4地址嵌入在IPv6的目的地址中,作為6rd隧道的目的地址使用。本地WAN介面的IPv4地址將被用作6rd隧道的源地址,這個IPv6報文直接封裝成IPv4。如果IPv6目的地址和本地配置的6rd前綴不匹配就另說,如果這個報文不屬於本地6rd域,這個報文將會通過6rd隧道隧穿到BR路由器。在這種情況下,在CE路由器本地配置的BR IPv4地址將被用作封裝作報文的目的地址。
1.4 6rd作業詳述:
- 6rd的CE LAN側介面承載IPv6主機來回的流量
- 多點隧道介面承載隧道封裝的往返於IPv6主機的流量
- 用於6rd隧道封裝的是直接的IPv6-in-IPv4的封裝。IPv4協議欄位被設置為協議號:41。
6rd委託前綴
圖2展示的網路中,CE路由器給他的網站提供一個範圍的前綴。這些前綴稱作6rd委託前綴和IPv6域主機配置協議(DHCPv6)的PD前綴相似。一個6rd委託前綴有以下幾個元素組成:
- 服務商選擇一個IPv6前綴用於給定6rd部署的通用6rd服務提供前綴;
- 為CE路由器分配的IPv4地址,這個地址可以是私有的也可以是全局的;6rd不會必須使用IPv4地址整個32bit(在後面的文檔中進行解釋)。
思考圖3中的示例:
圖3的示例顯示了一下內容: - 服務提供商選擇的前綴是:2001:DB8::/32
- 每一個6rd CE路由器從10.0.0./8塊中使用一個IPv4地址。在6rd中,你可以嵌入少於32bit的IPv4地址到6rd委託前綴。通過引入以下兩個概念使該動作成為可能:
- IPv4通用前綴:在6rd域中的所有6rd CE路由器和BR路由器可以共享一個通用IPv4前綴用於他們的IPv4地址塊。這個通用前綴已分配給6rd域中所有節點,因此不需要IPv6地址攜帶以標識隧道終點。在圖3的示例中,IPv4的通用前綴是10.0.0.0/8。
- IPv4通用後綴:所有6rd CE路由器和BR路由器可以統一一個通用的IPv4地址尾部來標識隧道終點。例如,在這個示例中,假設IPv4的通用後綴是0.0.0.1/8。後綴的實現通過隧道傳輸終點將會使用(在CE路由器上,在6rd CE WAN側的介面地址是一個典型的IPv4地址,將被用作隧道源地址):
- CE1:10.1.1.1
- CE2:10.1.2.1
- BR: 10.1.3.1
- IPv4地址塊中的這些bit數是獨立的,在一個域中不同的6rd CE路由器和BR路由器可以按照以下方式計算:
32 bits – (IPv4通用前綴長度)-(IPv4通用後綴長度)
在前面的示例中,值將會是:
32 – 16 – 8 = 8。
這8bit需要嵌入在6rd委託前綴中。 - 因此,6rd委託前綴長度是服務商選擇的前綴長度和同一域中6rd CE路由器和BR路由器IPv4地址塊中不相同的bit數之和;在前面的示例中,這個長度是:
32 + 8 = 40 - 6rd的參數在表1中顯示
示例2:
很常見的是挑戰服務提供商受限於現有服務提供者,導致在6rd地址空間壓縮IPv4地址是不行的。因為這個,整個IPv4地址的32bit需要插入6rd IPv6地址,如下圖4所示:
區域註冊機構(RIPE、ARIN等)正在研究一種模型,其中一個服務提供商通過6rd提供IPv6服務可以獲得一個/29的IPv6地址分配,來替代小於 /32的地址分配。這將為每位終點用戶網提供3bit用於分割本地網路,從而為每個終點用戶提供8個子網。
6rd地址隧道終點的確定:
當目的地是6rd域地址的本機IPv6報文到達一個6rd CE路由器,它將被送到適當的目標CE路由器。6rd隧道的目的IPv4地址通過以下規則來獲取:
- 確定IPv6頭中攜帶的IPv4地址bit數,如下所示:
(32bits)-(IPv4 通用前綴長度)-(IPv4通用後綴長度) - 確定這些bit在IPv6頭中的位置。圖4展示了6rd域的前綴長度
- 提取IPv6目的地址頭中攜帶的IPv4地址。現在知道6rd域地址和通用前綴長度就可以執行提取。
- 起始是IPv4的通用前綴,然後拼接從IPv6頭中提取的bit,最後拼接IPv4通用後綴。
現在應用之前的演算法到先前介紹的6rd網路中。思考一個報文的目的主機是2001:DB8:0100::11,它是CE網站1的一個主機。 - IPv6頭中攜帶的bit數是:
(32bits)-(IPv4通用前綴長度)-(IPv4通用後綴長度)
這兒,值是:32 – 16 = 8 - 確定了位於IPv6頭中的這些bit後,6rd本地域前綴長度是32
- 提取IPv6頭中攜帶的IPv4地址的bit。現在你知道了位置和長度既可執行提取。結果是8位介於33至40bit之間的二進位值。示例如下:
從2001:DB8:0100::11中32bit開始提取8bit,產生16進位0x01(IPv6地址是十六進位的)。二進位值是:00000001,在十進位編號系統中是1。- 重建遠程6rd CE路由器地址,以IPv4通用前綴開始,拼接從IPv6頭中提取的bit數,在拼接IPv4通用後綴。
結果是:10.1.1.1,這個是CE1的地址。
每當CE路由器收到目的地為第六本地域內的目的地的IPv6數據包時,都會運行前面的第六隧道端點確定。
如果收到本地IPv6報文發往超出了6rd本地域的IPv6 Internet網,6rd BR路由器的IPv4地址將由手動輸入提供。
- 重建遠程6rd CE路由器地址,以IPv4通用前綴開始,拼接從IPv6頭中提取的bit數,在拼接IPv4通用後綴。
路由考慮:
本地路由用於同一6rd域的CE和BR路由器之間。為了實現高可用性,可以配置一個以上的BR路由器。為了達到這個目的,BR路由器必須使用在IPv4內部網關協議(IGP)中通告IPv4任播地址,導致6rd域中有多個6rd BR路由器。CE路由器將會基於IGP的選舉規則使用最近的BR路由器。
服務提供商必須向IPv6 Internet宣布已註冊的IPv6地址範圍(第6個委託前綴),以實現全球可達性。
二、一個6rd報文的生命周期
本節逐步說明數據包如何從CE路由器發送到另一個CE路由器或IPv6 Internet並返回(圖7)。
2.1 CE到CE:
如果IPv6目標地址落在本地配置的6rd域前綴的範圍內,然後需要轉發到另一個6rd CE路由器,則將在面向客戶的介面上本地接收IPv6流量(圖8)。
這個IPv6報文封裝在IPv4標記頭中。嵌入的IPv4地址複製到IPv4目的地址中。本地配置的隧道源地址複製為IPv4源地址。IPv4的隧道頭的協議欄位的類型被設置為41(IPv6 in IPv4)。
隧道化IPv6數據包的IPv4數據包通過遵循IPv4路由表的IPv4域轉發到目標CE路由器。
目的CE路由器接收這個隧道化的IPv6報文,然後將IPv4頭移除。出於安全措施,IPv4頭中的源地址將要和嵌入在IPv6頭中的IPv4地址做比較。如果不匹配,報文將會被丟棄。如果匹配,這個IPv6報文將會被視為一個本地IPv6報文轉發到CE LAN側的IPv6目標地址去。
2.2 CE到IPv6 Internet網
在CE到IPv6 Internet的場景中,IPv6流量在面向用戶側的介面時本地接收的。IPv6目的地址沒有填入本地配置的6rd前綴的範圍,這意味著它不針對本地6rd域內的目標。在這種情況下,報文需要被轉發到6rd BR路由器。
在CE到CE的場景中,IPv6頭封裝在IPv4頭中。然而,不同之處在於本地配置的BR IPv4地址複製到IPv4的目的地址。此外,本地配置的隧道源地址複製到IPv4源地址。協議欄位設置為41(IPv4中的IPv6),然後,按照正常的IPv4路由表將封裝的數據包通過IPv4域轉發到BR路由器。
BR路由器接收IPv4數據包並刪除IPv4標頭封裝。 將IPv4標頭源地址與嵌入在IPv6源地址中的IPv4地址進行比較。 如果地址不匹配,則丟棄該數據包。 否則,IPv6數據包將本地轉發到IPv6目標地址。
2.3 IPv6 Internet到CE
在從IPv6 Internet到CE的場景中,BR路由器從其面向IPv6網路的介面之一接收本地IPv6數據包。 IPv6目標地址屬於本地配置的6rd前綴的範圍,這意味著它以本地第6個域內的目標為目標。 在這種情況下,需要將數據包轉發到適當的CE路由器(圖9)。
6rd BR路由器會將IPv6數據包封裝在IPv4標頭中。 IPv6標頭中嵌入的IPv4地址用作IPv4目標地址。 隧道的源地址將是在6rd BR路由器的6rd隧道介面上配置的IPv4地址。 標頭中的IPv4數據包的協議欄位設置為41(IPv4中的IPv6)。 然後,數據包由第六BR路由器使用傳統的IPv4轉發路徑轉發到第六CE路由器。
當CE路由器接收到隧道化的6rd IPv4報文,為了暴露封裝的IPv6報文將會移除IPv4頭。首先,IPv4頭源地址將和本地配置的6rd BR IPv4地址進行比較。如果地址不匹配報文將被丟棄。如果匹配,則6rd CE路由器通過IPv6將IPv6報文本地轉發到IPv6目標地址。
三、配置:
6rd CE路由器委派的IPv6地址是從本地WAN介面IPv4地址與第六個前綴組合得出的。 可以手動配置地址。但是,通常會通過DHCPv4從連接的服務提供商接收IPv4地址。
除了此IPv4地址,還必須配置其他資訊。
- 6rd前綴:這是在整個6rd域中使用的通用前綴,它確定數據包是針對6rd域內部還是外部的目的地;
- 6rd前綴長度:此參數提供有關第6個前綴中的值位的資訊;
- IPv4掩碼長度:此參數指定在所有6rd CE和BR路由器IPv4地址中共有多少位,因此可以在站點的6rd前綴內壓縮。 在Cisco IOS軟體內,可以壓縮來自IPv4前綴和後綴的位。
3.1 Cisco的基本配置:
BR Router
IPv6 general-prefix DELEGATED_PREFIX 6rd Tunnel0
interface Loopback0
ip address 10.0.0.1 255.255.255.0
!
interface Tunnel0
tunnel source Loopback0
tunnel mode IPv6ip 6rd
tunnel6rd IPv4 prefix-len 8
tunnel6rd prefix 2001:db80::/32
IPv6 address DELEGATED_PREFIX::/128 anycast
!
IPv6 route 2001:db80::/32 Tunnel0
IPv6 route ::/0 2001:babe::1
CE Router
IPv6 general-prefix DELEGATED_PREFIX6rd Tunnel0
interface Dialer0
ip address dhcp ! (10.1.1.1)
!
interface Tunnel0
tunnel source Dialer0
tunnel mode IPv6ip 6rd
tunnel 6rd IPv4 prefix-len 8
tunnel 6rd prefix 2001:db80::/32
tunnel 6rd br 10.1.3.1
IPv6 address DELEGATED_PREFIX ::/128 anycast
!
interface Ethernet0
IPv6 address DELEGATED_PREFIX ::/64 eui-64
!
IPv6 route 2001:db80::/28 Tunnel0
IPv6 route ::/0 Tunnel0, 2001:db80:a000:0010::
IPv6 route 2001:db80:0:A00::/56 Null0
3.2 Linux的配置步驟:
三台Linux虛擬構建網路拓撲。
#配置CE設備
ip address add 192.168.110.27 dev eth0
ip link set eth0 up
ip tunnel add kali006rd mode sit local 192.168.110.27
ip tunnel 6rd dev kali006rd 6rd-prefix 2012:db8::/32 6rd-relay_prefix 192.168.147.136/32
ip link set kali006rd up
ip -6 addr add 2012:db8:c0a8:6e1b::1/64 dev kali006rd
ip -6 route add 2012:db8::/32 dev kali006rd
ip -6 route add default via ::192.168.147.136
#配置ISP
ip address add 192.168.147.1 dev eth0
ip link set eth0 up
ip address add 192.168.110.1 dev eth1
ip link set eth1 up
#配置BR設備
ip address add 192.168.147.136 dev eth0
ip link set eth0 up
ip tunnel add kali006rd mode sit local 192.168.147.136
ip tunnel 6rd dev kali006rd 6rd-prefix 2012:db8::/32
ip link set kali006rd up
ip -6 addr add 2012:db8:c0a8:9388::1/64 dev kali006rd
ip -6 route add 2012:db8::/32 dev kali006rd
#在CE設備測試連通性:
root@kalimk:~# ping6 2012:db8:c0a8:9388::1 -c 5
PING 2012:db8:c0a8:9388::1(2012:db8:c0a8:9388::1) 56 data bytes
64 bytes from 2012:db8:c0a8:9388::1: icmp_seq=1 ttl=64 time=0.759 ms
64 bytes from 2012:db8:c0a8:9388::1: icmp_seq=2 ttl=64 time=1.64 ms
64 bytes from 2012:db8:c0a8:9388::1: icmp_seq=3 ttl=64 time=0.769 ms
64 bytes from 2012:db8:c0a8:9388::1: icmp_seq=4 ttl=64 time=0.606 ms
64 bytes from 2012:db8:c0a8:9388::1: icmp_seq=5 ttl=64 time=0.710 ms
--- 2012:db8:c0a8:9388::1 ping statistics ---
5 packets transmitted, 5 received, 0% packet loss, time 4065ms
rtt min/avg/max/mdev = 0.606/0.897/1.642/0.376 ms
#在BR設備創建一個IPv6/IPv4 Internet
ip link del kaliBr0
ip link add dev kaliBr0 type bridge
ip link set kaliBr0 up
ip -6 addr add 2233:ccc::1/64 dev kaliBr0
#在CE設備測試連通性:
root@kalimk:~# ping6 2233:ccc::1
PING 2233:ccc::1(2233:ccc::1) 56 data bytes
64 bytes from 2233:ccc::1: icmp_seq=1 ttl=64 time=0.723 ms
64 bytes from 2233:ccc::1: icmp_seq=2 ttl=64 time=0.424 ms
64 bytes from 2233:ccc::1: icmp_seq=3 ttl=64 time=0.722 ms
64 bytes from 2233:ccc::1: icmp_seq=4 ttl=64 time=1.69 ms
64 bytes from 2233:ccc::1: icmp_seq=5 ttl=64 time=0.887 ms
64 bytes from 2233:ccc::1: icmp_seq=6 ttl=64 time=1.62 ms
64 bytes from 2233:ccc::1: icmp_seq=7 ttl=64 time=0.603 ms
64 bytes from 2233:ccc::1: icmp_seq=8 ttl=64 time=0.642 ms
64 bytes from 2233:ccc::1: icmp_seq=9 ttl=64 time=0.596 ms
64 bytes from 2233:ccc::1: icmp_seq=10 ttl=64 time=0.677 ms
--- 2233:ccc::1 ping statistics ---
10 packets transmitted, 10 received, 0% packet loss, time 9138ms
rtt min/avg/max/mdev = 0.424/0.858/1.687/0.413 ms
注意:CE和BR之間,只能存在IPv4網路,需要將網卡的IPv6都禁用掉。
我的環境是KaliLinux:
四、其他考慮:
- 最大傳輸單元和分片
- 6rd和6to4
6rd是自動6to4隧道機制(RFC 3056)的一般化。 它克服了6to4自動隧道機制最大的缺點:對所有6to4站點使用眾所周知的固定前綴2002 :: / 16。 該IPv6前綴由IPv6 Internet上的許多路由器(也稱為6to4中繼路由器)注入。 直接後果是,流量可能不對稱,服務提供商無法控制返迴路徑的6to4中繼,並且當本機IPv6可用時,站點必須重新編號。 第六種機制通過允許每個服務提供商為每個客戶使用唯一的IPv6前綴來消除這些缺點,從而有助於確保不需要其他不受信任的第三方中繼。
參考鏈接:
//blog.51cto.com/enderjoe/2367434?source=dra
//blog.csdn.net/qq_39628285/article/details/105230013?utm_medium=distribute.pc_relevant