IPv6 Rapid Deployment, IPv6 6rd初探

KingPop發表於2020-11-28

IPv6 Rapid Deployment: Provide IPv6 Access to Customers over an IPv4-Only Network

原文地址:https://www.cisco.com/c/en/us/products/collateral/ios-nx-os-software/enterprise-ipv6-solution/whitepaper_c11-665758.html

一、你將會學到什麼?

IPv6 rapid deployment(6rd)(RFC 5969)是一種無狀態隧道機制,它允許一個服務商在不要求升級已存在的IPv4接入網路基礎設施的情況下,輕巧安全的快速部署IPv6。當然這裡有一系列方法通過IPv4來承載IPv6,6rd的方式尤其成功,其主要在於他的實施是一個輕巧、自然地可擴充套件、有彈性且易於配置的無感知模式。6rd提供的服務是生產質量,使得所有的客戶和整個Internet看起似乎是原生的本地IPv6網路。

  1. 本文提出:
    • 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委託字首。通過引入以下兩個概念使該動作成為可能:
    1. IPv4通用字首:在6rd域中的所有6rd CE路由器和BR路由器可以共享一個通用IPv4字首用於他們的IPv4地址塊。這個通用字首已分配給6rd域中所有節點,因此不需要IPv6地址攜帶以標識隧道終點。在圖3的示例中,IPv4的通用字首是10.0.0.0/8。
    2. 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和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字首來消除這些缺點,從而有助於確保不需要其他不受信任的第三方中繼。

參考連結:
https://blog.51cto.com/enderjoe/2367434?source=dra
https://blog.csdn.net/qq_39628285/article/details/105230013?utm_medium=distribute.pc_relevant

相關文章