梳理了IETF的相关RFC文档,汇总IPv4与IPv6地址转换映射的方法。笔者资历较浅,难免有错误之处,还望指正。如真正深入研究,可以查看标准RFC文档。IETF官网文档下载链接 本文总体上根据RFC文档出版的时间先后顺序,大概叙述每个文档实现IP地址转换的思路;为了便于理解某些内容,对某些文档描述调整了顺序,可能不符合时间先后顺序。


IPv6与IPv4地址转换

  • RFC4291
  • RFC6052
  • RFC2766(NAT-PT)
  • RFC6146(NAT64)
  • RFC8512
  • RFC 8215( Local-Use IPv4/IPv6 Translation Prefix )
  • RFC3306( Unicast-Prefix-based IPv6 Multicast Addresses )
  • RFC 6219(IVI)
  • RFC 8114
  • 相关资料
  • 参考文献


RFC4291

《RFC4291》1提出两种兼容方式实现IPv4和IPv6的地址转换,81-96位全为0的兼容方式或全为1的兼容方式。IPv6兼容的IPv4地址必须为全球单播地址,81-96位全为0的兼容方式见图1。

ipv6 计算器 python ipv6换算ipv4_NAT


图1 81-96位全为0的兼容方式


IPv6地址81-96位全为1的兼容方式见图2。


ipv6 计算器 python ipv6换算ipv4_网络_02


图2 81-96位全为1的兼容方式

RFC6052

《RFC6052》2规定了IPv4地址转换成对不同前缀长度的IPv6地址格式,IPv6地址前缀位数有32, 40, 48, 56, 64, 72, 80, 8896。32位的IPv4地址直接内嵌至IPv6前缀后格式如图3所示。

ipv6 计算器 python ipv6换算ipv4_Network_03


图3 IPv6地址内嵌IPv4地址


《RFC6052》规定IPv4地址和IPv6地址实现映射的知名网络前缀

64:ff9b::/96,同时,知名网络前缀只能使用最后一种前缀长度为96的IPv6地址格式。知名网络前缀

64:ff9b::/96不能映射《RFC1918》分配的私有IPv4地址。《RFC6052》中利用 2001:db8:: 特定网络前缀实现映射如图4所示。

ipv6 计算器 python ipv6换算ipv4_网络_04


图4 特定网络前缀映射

RFC2766(NAT-PT)

介绍NAT-PT前,可能需要了解一下NAT技术,本文不再介绍NAT技术,直接了解NAT-PT原理。(由于论文行文习惯,先叙述文字再放图。为了便于描述,这里先放图,因此该图不视为文内的图4,当做不存在就行。本图摘自《RFC2766》3。)

ipv6 计算器 python ipv6换算ipv4_Network_05


如图,IPv6侧的A和B主机通过NAT-PT与IPv4侧的IPv4主机C连接。主机A和B位于同一个网络内,具有相同的网络前缀,主机C具有IPv4地址132.146.243.30,且为全为唯一的。

NAT-PT配置有IPv4地址池,可以满足与IPv6地址的一一对应关系。

主机A向主机C发起通信时,源地址fedc:BA98::7654:3210,目的地址prefix::132.146.243.30(prefix为IPv6网络前缀,与NAT-PT IPv6地址网络前缀一致)。如果A发送的是建立会话的初始化数据包,假设NAT-PT为其分配一个120.130.26.10IPv4地址,然后转发至主机C,此时数据包的源地址120.130.26.10,目的地址132.146.243.30。NAT-PT收到主机C的IPv4数据包时,根据源地址132.146.243.30,目的地址120.130.26.10,将其转发至主机A,此时源地址prefix::132.146.243.30,目的地址fedc:BA98::7654:3210。主要原理就是建立一个映射表,存储建立的映射关系,数据包到来时,直接查表。

在此基础上,引入“地址+端口”映射,过程区别不大,主要区别在于数据包( src代表源地址,dest代表目的地址,tcp=3017代表tcp端口号为3017),如下过程所述。

A -> NAT-PT:

src = fedc:BA98::7654:3210, tcp = 3017, dest = prefix::132.146.243.30,tcp=23

NAT-PT -> C:
src = 120.130.26.10, tcp = 1025, dest = 132.146.243.30, tcp = 23

C -> NAT-PT:
src = 120.130.26.10, tcp = 23, dest = 132.146.243.30, tcp = 1025

NAT-PT -> A:
src = prefix::132.146.243.30, tcp = 23, dest = fedc:BA98::7654:3210,tcp=3017

RFC6146(NAT64)

NAT64设备根据《RFC6052》定义的算法,利用自身IPv6前缀和待转换的IPv4地址生成IPv6地址。有状态NAT64转换包含绑定的TCP和UDP端口号。NAT64的IPv6地址池前缀为Pref64::/n。
在《RFC6146》4示例中,根据《RFC6052》知名网络前缀,
在NAT64 IPv6接口端建立的映射关系为: ( 2001:db8::1, 1500 ) <–> ( 203.0.113.1, 2000 )
在IPv4接口端建立的映射关系为:( 64:ff9b::192.0.2.1, 80) <–> ( 192.0.2.1, 80 )
《RFC6146》中NAT64会话映射表为( X’, x), (Y’, y) <–> ( T, t), ( Z, z),其中X’和Y’为IPv6地址,T和Z为IPv4地址。x, y, z和t为端口号,同时y必须等于z。

RFC8512

《RFC8512》5根据《RFC6052》地址转换算法,在NPT和NAT中实现IPv6和IPv4地址转换。IPv6地址2001:db8:1234 ::198.51.100.1采用特定网络前缀,映射至IPv4地址198.51.100.1

RFC 8215( Local-Use IPv4/IPv6 Translation Prefix )

《RFC6052》预留了知名网络前缀64:ff9b::/96,因此《RFC8215》6
64:ff9b::1:0:0 - 64:ff9b:0:ffff:ffff:ffff:ffff:ffff 地址分配给本地内网IPv4和IPv6地址转换使用。另一方面《RFC6052》对于分配的私有IPv4地址的限制,对IPv6前缀64:ff9b:1::/48不适用,因此64:ff9b:1::/48网络前缀可以实现私有IPv4地址转换。

RFC3306( Unicast-Prefix-based IPv6 Multicast Addresses )

在IPv6组播地址格式中,flags:P=0,IPv6组播地址非基于网络前缀;P = 1,表示IPv6组播地址基于IPv6网络前缀,当P=1时,必须满足T = 1。
scope:限制组播范围,不同值对应范围如下表所示。

value

domain

0

reserved

1

Interface-Local scope

2

Link-Local scope

3

reserved

4

Admin-Local scope

5

Site-Local scope

6

(unassigned)

7

(unassigned)

8

Organization-Local scope

9

(unassigned)

A

(unassigned)

B

(unassigned)

C

(unassigned)

D

(unassigned)

E

Global scope

F

reserved

reserved:0x00,根据《RFC 3306》7,需要清0该域。

plen:network prefix长度。

network prefix:利用IPv6网络前缀中填充该域,填充位数由plen决定。

group ID:组播ID。

当P=1.且T=1时,基于IPv6网络前缀的组播地址如图5所示。

ipv6 计算器 python ipv6换算ipv4_网络_06

图5 基于IPv6网络前缀组播地址



IPv4组播地址范围为

224.0.0.0 - 239.255.255.255。当IPv6组播地址为

239.1.1.5时,假设转换设备的IPv6地址由特定网络前缀

2001:db8:122:344::/96(见图1)组成,基于IPv6网络前缀的一种IPv4组播地址转换结果为

ff32:40:2001:db8:122:344:fe01:105。其中,

fe01:105

239.1.1.5的十六进制,即

fe.01.01.05。ff为固定格式,3代表flags=0011,2代表组播限制在

Link-Local scope。0x40代表基于IPv6网络前缀的长度为64位,即

2001:db8:122:344

RFC 6219(IVI)

《RFC6219》8采用IPv6特定网络前缀解决IPv4和IPv6地址之间的无状态映射,同时利用32-39位标识IVI前缀,40-71位内嵌全球唯一的IPv4地址。IVI实现单播地址映射如图5所示。

ipv6 计算器 python ipv6换算ipv4_ipv6 计算器 python_07

图6 IVI单播地址映射



IVI实现IPv4组播地址和IPv6组播地址的映射,IPv4组播地址范围为

232.0.0.0/8 - 232.255.255.255/8,采用的IPv6组播地址为 PIM-SSM( Protocol Independent Multicast - Source-Specific Multicast, 协议无关组播-特定于源的组播)。转换后的IPv6组播地址范围为

ff3e:0:0:0:0:0:f000:0000/96 - ff3e:0:0:0:0:0:f0ff:ffff/96,32位的组播ID中,f0固定,而后24位由IPv4组播地址后24位转换而来。IVI实现IPv4组播地址和IPv6组播地址映射如图7所示。


ipv6 计算器 python ipv6换算ipv4_Network_08


图7 IVI实现IPv4组播和IPv6组播地址映射

RFC 8114

《RFC8114》8对组播地址转换算法进行描述,分为IPv6组播地址的组成和IPv4组播地址的获取。

IPv6组播地址:结合IPv6组播地址前缀的96位和IPv4地址的32位以获得一个128位的地址。

IPv4组播地址:如果IPv6组播地址前缀为预先配置,即可直接从组播地址后32位获取IPv4组播地址。

如图8为IPv4组播地址与IPv6组播地址转换。

ipv6 计算器 python ipv6换算ipv4_NAT_09

图8 IPv4组播地址与IPv6组播地址转换


请在转载或引用时,说明本文章来源。

相关资料

《RFC7269》NAT64 Deployment Options and Experience《RFC7857》Updates to Network Address Translation (NAT) Behavioral Requirements《RFC6889》Analysis of Stateful 64 Translationgithub IPv6组播实验源码

参考文献


  1. 《RFC4291》IP Version 6 Addressing Architecture ↩︎
  2. 《RFC6052》IPv6 Addressing of IPv4/IPv6 Translators ↩︎
  3. 《RFC2766》Network Address Translation - Protocol Translation (NAT-PT) ↩︎
  4. 《RFC6146》Stateful NAT64: Network Address and Protocol Translation from IPv6 Clients to IPv4 Servers ↩︎
  5. 《RFC8512》A YANG Module for Network Address Translation (NAT) and Network Prefix Translation (NPT) ↩︎
  6. 《RFC8215》Local-Use IPv4/IPv6 Translation Prefix ↩︎
  7. 《RFC3306》Unicast-Prefix-based IPv6 Multicast Addresses ↩︎
  8. 《RFC8114》Delivery of IPv4 Multicast Services to IPv4 Clients over an IPv6 Multicast Network ↩︎ ↩︎